我试图在权重变化时获取激活函数的输出。当权重变化时,我期望激活函数也随之变化。
我在激活函数之前简单地更改权重,然后激活值也随之变化了。
import tensorflow as tfdef 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 grapha = tf.placeholder('float', None)d = dummy(a)weights = { 'h0': tf.Variable(tf.random_normal([1]))}# initialize variablesinit = tf.global_variables_initializer()# create session and run the graphwith tf.Session() as sess: sess.run(init) for i in range(10): print (sess.run(d, feed_dict={a: [2]}))# close sessionsess.close()
但是,当我尝试在激活函数之后更改权重,比如在反向传播中,每次得到的激活值都是相同的。谁能解释一下这是怎么回事,以及我该怎么做才能让激活值在每次迭代后都发生变化?
import tensorflow as tfdef 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 grapha = tf.placeholder('float', None)d = dummy(a)weights = { 'h0': tf.Variable(tf.random_normal([1]))}# initialize variablesinit = tf.global_variables_initializer()# create session and run the graphwith tf.Session() as sess: sess.run(init) for i in range(10): print (sess.run(d, feed_dict={a: [2]}))# close sessionsess.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()
函数。
以下是一些示例用法。
来自超简单的 Tensorflow MNIST 示例:
# 定义损失和优化器 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})
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 的代码以获得见解。