具有可变批量大小的 Tensorflow 反向传播
Tensorflow Backpropagation with variable batch size
我有一个张量流模型,其中批次中的每个张量都有不同的大小。如果我将所有损失和 运行 优化器连接起来,是否有可能获得正确的梯度,如本例所示:
import tensorflow as tf
v1 = tf.range(9,dtype=tf.float32)
v2 = tf.range(6,dtype=tf.float32)
v1 = tf.reshape(v1,[3,3])
v2 = tf.reshape(v2,[2,3])
gt1 = tf.constant([2,5,4])
gt2 = tf.constant([1,5])
with tf.variable_scope("var"):
w = tf.get_variable('w', [3,7], dtype=tf.float32)
r1 = v1 @ w
r2 = v2 @ w
loss1 = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=gt1, logits=r1)
loss2 = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=gt2, logits=r2)
loss = tf.concat([loss1, loss2],axis=0)
optimizer = tf.train.AdamOptimizer().minimize(loss)
with tf.Session() as sess:
# print the output of ta_final_result
sess.run(tf.global_variables_initializer())
print(sess.run(w))
print(sess.run(optimizer))
print(sess.run(w))
这完全等同于在将 loss
传递给 minimize
之前将其求和为一个标量。实际上 reduce_sum
将被隐式添加到图中;你可以尝试将 non-scalars 传递给 tf.gradients
看看会发生什么:
import tensorflow as tf
session = tf.InteractiveSession()
v = tf.get_variable("v", shape=[])
session.run(v.assign(2.))
grad = tf.gradients([v ** 2., v ** 3.], [v])
session.run(grad)
[16.0]
也就是 2*2 + 3*2^2.
我有一个张量流模型,其中批次中的每个张量都有不同的大小。如果我将所有损失和 运行 优化器连接起来,是否有可能获得正确的梯度,如本例所示:
import tensorflow as tf
v1 = tf.range(9,dtype=tf.float32)
v2 = tf.range(6,dtype=tf.float32)
v1 = tf.reshape(v1,[3,3])
v2 = tf.reshape(v2,[2,3])
gt1 = tf.constant([2,5,4])
gt2 = tf.constant([1,5])
with tf.variable_scope("var"):
w = tf.get_variable('w', [3,7], dtype=tf.float32)
r1 = v1 @ w
r2 = v2 @ w
loss1 = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=gt1, logits=r1)
loss2 = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=gt2, logits=r2)
loss = tf.concat([loss1, loss2],axis=0)
optimizer = tf.train.AdamOptimizer().minimize(loss)
with tf.Session() as sess:
# print the output of ta_final_result
sess.run(tf.global_variables_initializer())
print(sess.run(w))
print(sess.run(optimizer))
print(sess.run(w))
这完全等同于在将 loss
传递给 minimize
之前将其求和为一个标量。实际上 reduce_sum
将被隐式添加到图中;你可以尝试将 non-scalars 传递给 tf.gradients
看看会发生什么:
import tensorflow as tf
session = tf.InteractiveSession()
v = tf.get_variable("v", shape=[])
session.run(v.assign(2.))
grad = tf.gradients([v ** 2., v ** 3.], [v])
session.run(grad)
[16.0]
也就是 2*2 + 3*2^2.