我试图在权重变化时获得激活函数的输出。当权重改变时,我预计激活函数也会改变。
我只是在激活之前更改权重,并且激活值发生了变化。
import tensorflow as tf
def sigmoid(x, derivative = False):
if derivative == True:
return (1.0/(1+tf.exp(-x))) * (1.0 - (1.0/(1+tf.exp(-x))))
return 1.0/(1+tf.exp(-x))
def dummy(x):
weights['h0'] = tf.assign(weights['h0'], tf.add(weights['h0'], 0.1))
res = tf.add(weights['h0'], x)
res = sigmoid(res)
return res
# build computational graph
a = tf.placeholder('float', None)
d = dummy(a)
weights = {
'h0': tf.Variable(tf.random_normal([1]))
}
# initialize variables
init = tf.global_variables_initializer()
# create session and run the graph
with tf.Session() as sess:
sess.run(init)
for i in range(10):
print (sess.run(d, feed_dict={a: [2]}))
# close session
sess.close()
但是当我尝试在激活后更改权重(例如在反向传播中)时,我每次都会得到相同的激活。谁能向我解释发生了什么以及我可以做什么来让激活在每次迭代后发生变化?
import tensorflow as tf
def sigmoid(x, derivative = False):
if derivative == True:
return (1.0/(1+tf.exp(-x))) * (1.0 - (1.0/(1+tf.exp(-x))))
return 1.0/(1+tf.exp(-x))
def dummy(x):
res = tf.add(weights['h0'], x)
res = sigmoid(res)
weights['h0'] = tf.assign(weights['h0'], tf.add(weights['h0'], 0.1))
return res
# build computational graph
a = tf.placeholder('float', None)
d = dummy(a)
weights = {
'h0': tf.Variable(tf.random_normal([1]))
}
# initialize variables
init = tf.global_variables_initializer()
# create session and run the graph
with tf.Session() as sess:
sess.run(init)
for i in range(10):
print (sess.run(d, feed_dict={a: [2]}))
# close session
sess.close()
编辑:
好像没有运行整个图?我可以这样做:
with tf.Session() as sess:
sess.run(init)
for i in range(10):
sess.run(weights['h0'])
print (sess.run(d, feed_dict={a: [2]}))
我在哪里运行权重,它给了我不同的值。这是正确的吗?
最佳答案
这条线没有做你认为它正在做的事情:
print (sess.run(d, feed_dict={a: [2]}))
您需要调用 sess.run()
并传入训练操作,该操作通常是优化器的 minimize()
函数。
下面是一些示例用法。
来自 super 简单Tensorflow MNIST example :
# Define loss and optimizer
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
...
for _ in range(1000):
...
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
来自TensorFlow multi-layer NN example :
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(\
logits=pred, labels=y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
...
for i in range(total_batch):
...
_, c = sess.run([optimizer, cost], feed_dict={x: batch_x, y: batch_y})
一般模式是:
- 定义成本函数 J。
- 将成本变量 J 添加到优化器
- 使用优化器变量作为参数调用
sess.run()
。
如果您想编写自己的优化器,那么您需要采取不同的方法。编写自己的成本函数是典型的做法,但编写自己的优化器则不然。您应该查看 AdamOptimizer 的代码或GradientDescentOptimizer以获得洞察力。
关于machine-learning - Tensorflow - 图形是如何执行的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45383121/