在正向程序之后,为批处理数据生成了一个丢失和一个错误。然后根据链规则,将错误反向传播到先前的层以更新每个层中的参数。假设我有以下网络架构:
I->(W1)->C1->(W2)->C2->(W3)->O
I
是输入,O
是输出,W1,W2,W3
是3层的权重。 C1
和C2
是前两个图层的输出。使用O
和基本事实,我们获得了将被反向传播的损失和错误。我的问题是:在TensorFlow中,是否有任何方法可以将错误反向传播到C1
和C2
?
我知道我们可以按如下方式获取参数运算符:
W1_op = tf.get_default_graph().get_tensor_by_name('W1')
W1_op = ...
我的最终目的是检查我的网络中的错误是否正确,因为我无法检查是否正确计算了此网络的某个特定层(新的用户定义操作)中的梯度。我想通过检查此图层之前和之后的错误来检查其渐变(通过查看错误并比较错误)。
我知道我们可以使用tf.test.check_gradient
进行渐变检查,但似乎这个新运算符的梯度检查输出取决于输入。在某些情况下,可以接受梯度检查(即,理论梯度和数值梯度非常接近地通过阈值评估,例如1e-3),但在某些其他情况下,梯度检查可能会失败,这取决于关于那个操作的参数。 请看图。 x-axis
(对数标度)是参数,y-axis
是计算的梯度和评估的梯度之间的差异。如图所示,在某些参数配置中,差异非常小,但在其他情况下,梯度检查将失败。
因此,我不确定这是否适合学习是好的还是有效的。
在Caffe框架中,似乎errors
的每个图层都保存在diff
内存中。我想在每一层中获得这些反向传播的errors
。有人知道怎么做吗?