Tensorflow 使用feed_dict为渐变应用渐变

Tensorflow 使用feed_dict为渐变应用渐变,tensorflow,Tensorflow,在将它们应用于变量之前,我想对计算的梯度进行一些非张量流处理 我的计划是运行从compute\u gradients函数获得的梯度操作,进行处理(在不使用tensorflow的python中),然后运行从apply\u gradients函数获得的应用操作,并将处理后的梯度输入到feed\u dict中。不幸的是,这在我的场景中不起作用 我设法将其缩小到tf.nn.embedded_lookup(tf.gather)的一些问题上,错误可以如下重现(使用tf1.4): 这导致了错误 Traceba

在将它们应用于变量之前,我想对计算的梯度进行一些非张量流处理

我的计划是运行从
compute\u gradients
函数获得的梯度操作,进行处理(在不使用tensorflow的python中),然后运行从
apply\u gradients
函数获得的应用操作,并将处理后的梯度输入到
feed\u dict
中。不幸的是,这在我的场景中不起作用

我设法将其缩小到
tf.nn.embedded_lookup
(tf.gather)的一些问题上,错误可以如下重现(使用tf1.4):

这导致了错误

Traceback (most recent call last):
  File "/home/cruvadom/.p2/pool/plugins/org.python.pydev_6.0.0.201709191431/pysrc/_pydevd_bundle/pydevd_exec.py", line 3, in Exec
    exec exp in global_vars, local_vars
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 889, in run
    run_metadata_ptr)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 1098, in _run
    raise ValueError('Tensor %s may not be fed.' % subfeed_t)
ValueError: Tensor Tensor("gradients/Gather_1_grad/ToInt32:0", shape=(2,), dtype=int32, device=/device:GPU:0) may not be fed.
回溯(最近一次呼叫最后一次):
文件“/home/cruvadom/.p2/pool/plugins/org.python.pydev_6.0.0.2017091431/pysrc/_pydevd_bundle/pydevd_exec.py”,exec中的第3行
全局变量、本地变量中的exec exp
文件“”,第1行,在
文件“/usr/local/lib/python2.7/dist packages/tensorflow/python/client/session.py”,第889行,正在运行
运行_元数据_ptr)
文件“/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py”,第1098行,正在运行
raise VALUE ERROR('张量%s可能无法进给。'%subfeed\t)
ValueError:Tensor Tensor(“渐变/聚集\u 1\u渐变/ToInt32:0”,形状=(2,),数据类型=int32,设备=/设备:GPU:0)可能无法馈送。
似乎有一些额外的张量,我需要输入到图中进行计算。正确的方法是什么?我为什么要这样做


谢谢

如果运行“训练”操作,它将自动计算梯度。您可以从会话中检索渐变:

    tsess = tf.Session()
    tsess.run(tf.global_variables_initializer())
    _, grads_and_vars, loss = tsess.run([train_op ,grads, loss], {x: 1.0, z: 1})
    assert not np.isnan(loss), 'Something wrong! loss is nan...'

    #Get the gradients
    for g, v in grads_and_vars:
        if g is not None:
            grad_hist_summary = tf.summary.histogram("{}/grad_histogram".format(v.name), g)
            sparsity_summary = tf.summary.scalar("{}/grad/sparsity".format(v.name), tf.nn.zero_fraction(g))

我不想在处理梯度之前运行train op我想你可以在运行train op之前运行([grads],{x:1.0,z:1})来获得梯度
    tsess = tf.Session()
    tsess.run(tf.global_variables_initializer())
    _, grads_and_vars, loss = tsess.run([train_op ,grads, loss], {x: 1.0, z: 1})
    assert not np.isnan(loss), 'Something wrong! loss is nan...'

    #Get the gradients
    for g, v in grads_and_vars:
        if g is not None:
            grad_hist_summary = tf.summary.histogram("{}/grad_histogram".format(v.name), g)
            sparsity_summary = tf.summary.scalar("{}/grad/sparsity".format(v.name), tf.nn.zero_fraction(g))