【问题标题】:TensorFlow - Gradients across post-processing assign ops?TensorFlow - 后处理分配操作的梯度?
【发布时间】:2017-06-04 23:43:21
【问题描述】:

如果将分配操作应用于权重张量在权重张量用于网络前向传递的部分之后,TensorFlow 的反向传播在确定梯度时是否考虑分配操作那个重量?例如,如果我有

weights = tf.Variable(...)
bias = tf.Variable(...)
output = tf.tanh(tf.matmul(weights, input) + bias)
weight_assign_op = weights.assign(weights + 1.0)
with tf.control_dependencies(weight_assign_op):
    output2 = tf.identity(output)

计算输出,然后更改权重。如果输出随后用于计算损失和梯度以更新变量,是否会在考虑到weights 的更改的情况下创建梯度?也就是说,weights 的梯度是否是 old_weights + 1.0 的正确梯度,或者它们仍然是 old_weights 的梯度,当应用于新的 weights 时,不一定是梯度下降的“正确”梯度?

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    我最终通过实验对其进行了测试。梯度计算确实考虑了分配操作。我使用下面的代码进行测试。运行它会产生正梯度。注释掉权重分配操作线和控制依赖线会导致负梯度。这是因为梯度要么被考虑用于 0.0 的原始起始值权重,要么被考虑为分配 2.0 之后的更新权重。

    import tensorflow as tf
    
    data = [[1.0], [2.0], [3.0]]
    labels = [[1.0], [2.1], [2.9]]
    
    input_data = tf.placeholder(dtype=tf.float32, shape=[3, 1])
    input_labels = tf.placeholder(dtype=tf.float32, shape=[3, 1])
    weights = tf.Variable(tf.constant([0.0]))
    bias = tf.Variable(tf.constant([0.0]))
    output = (weights * input_data) + bias
    weight_assign_op = weights.assign(tf.constant([2.0]))
    with tf.control_dependencies([weight_assign_op]):
        output = tf.identity(output)
    loss = tf.reduce_sum(tf.norm(output - input_labels))
    weight_gradient = tf.gradients(loss, weights)
    initialize_op = tf.global_variables_initializer()
    
    session = tf.Session()
    session.run([initialize_op])
    weight_gradient_value = session.run([weight_gradient], feed_dict={input_data: data, input_labels: labels})
    print(weight_gradient_value)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多