Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在反向传播之前直接设置层的梯度?_Python_Tensorflow_Backpropagation_Gradient Descent - Fatal编程技术网

Python 如何在反向传播之前直接设置层的梯度?

Python 如何在反向传播之前直接设置层的梯度?,python,tensorflow,backpropagation,gradient-descent,Python,Tensorflow,Backpropagation,Gradient Descent,想象一个定义如下的小网络,其中线性是一个典型的辅助函数,为权重矩阵和激活函数定义TensorFlow变量: final\u layer=线性(线性(\u输入,10,tf.nn.tanh),20) 通常,这将通过损失梯度下降进行优化: loss=tf.reduce_sum(tf.square(最终_层-_目标)) 列车步进=tf.train.AdamOptimizer().最小化(损失) 但假设我从外部来源(例如,名为_deriv的tf.占位符)获得损耗w.r.t.最终_层的导数。如何将此梯度信息

想象一个定义如下的小网络,其中线性是一个典型的辅助函数,为权重矩阵和激活函数定义TensorFlow变量:

final\u layer=线性(线性(\u输入,10,tf.nn.tanh),20)

通常,这将通过损失梯度下降进行优化:

loss=tf.reduce_sum(tf.square(最终_层-_目标))
列车步进=tf.train.AdamOptimizer().最小化(损失)

但假设我从外部来源(例如,名为_deriv的tf.占位符)获得损耗w.r.t.最终_层的导数。如何将此梯度信息与内置优化器一起用于反向传播和更新网络参数

我目前使用的解决方法是构造一个由_deriv和final_层之间的内积组成的人工损耗(因为这个损耗的导数w.r.t.final_层将等于_deriv)

loss=tf.减少总和(最后一层*)
列车步进=tf.train.AdamOptimizer().最小化(损失)

这是非常浪费的,因为它需要做这个不必要的内积,并计算每个训练步骤的导数,即使我已经知道这个信息。有更好的办法吗


对于那些认为这是一件奇怪的事情需要做的人来说,这是实现的必要条件。

tf。渐变通过其
grad ys
参数提供此功能,请参阅。在你的例子中,
tf.gradients([final\u layer],变量列表,grad\u ys=[\u deriv])
将计算你想要的梯度


不幸的是,内置优化器似乎没有将
grad_ys
参数传递给
tf.gradients
。您可能需要在优化器类的方法中加入一些东西。

对于那些想知道的人,在TensorFlow 2中实现这一点的一个好方法是。具体来说,更改
train_step
函数以忽略本机
GradientTape()
,而是将外部计算的梯度传递给优化器。

有趣的问题。也许是在像这样的斜坡上挖掘?