【问题标题】:Tensorflow Backpropagation with variable batch size具有可变批量大小的 TensorFlow 反向传播
【发布时间】:2018-02-18 14:42:38
【问题描述】:

我有一个 tensorflow 模型,其中批次中的每个张量都有不同的大小。如果我连接所有的损失并像下面的例子一样运行优化器,是否有可能获得正确的梯度:

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))

【问题讨论】:

    标签: tensorflow backpropagation


    【解决方案1】:

    这完全等同于将loss 求和为一个标量,然后再将其传递给minimize。事实上,reduce_sum 将被隐式添加到图中;您可以尝试将非标量传递给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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      相关资源
      最近更新 更多