Skip to main content
 首页 » 编程设计

python之在 Tensorflow 中,如何检查梯度是否适合您的自定义操作

2024年10月17日26haluo1

我的问题是,如何确定反向传播路径,例如,在使用 tf.slice 时?

我举个例子。比方说,我有一个 K 分类问题。我可以用标准的方式做到这一点,比如

conv1 = # conv1+relu1+lrm1+pool1 
conv2 = # from conv1 
fc1 = # from conv2 to 128D fully connected + relu 
fc2 = # from fc2 to K-D fully connected 
batch_loss = tf.softmax_cross_entropy(fc2, labels) 
loss = tf.reduce_mean(batch_loss) 
... minimize(loss) 

在这种情况下,loss 的梯度将反向传播到每个权重。

比方说,我通过切片 labels 和 fc2 输出来计算自定义损失值(也许是因为我认为某个类更重要?)

label_sub = tf.slice(labels, ..) 
output_sub =  tf.slice(fc2, ..) 
batch_loss_sub = tf.softmax_cross_entropy(output_sub, label_sub) 
loss = tf.reduce_mean(batch_loss + batch_loss_sub) 
... minimize(loss) 

在这种情况下,我不知道反向传播是如何工作的。从“切片”中,我们没有丢失反向概率路径吗?

这可能是一个奇怪的伪代码,但我的问题是“使用 tf.slice 时,反向传播是如何工作的?”

请您参考如下方法:

这没什么神奇的。您提取张量的一部分并用于计算,因此“流经”该切片的所有偏导数都已明确定义。从数学的角度来看,它类似于拥有

f([x1,x2,x3,x4]) = f(x) = 2 * sum(slice(x, 2, 2)) + 1 = 2 * (x2 + x3) + 1 

你可以直接计算梯度

grad f(x) = [df / dx1, df / dx2, df / dx3, df / dx4] = [0, 2, 2, 0] 

现在,当您根据梯度的属性添加 f 原始损失 g 时,它也会被添加。所以

grad (f + g)(x) = grad f(x) + grad g(x) = [0, 2, 2, 0] + grad g(x) 

一切正常。

特别是,您始终可以在 TensorBoard 中可视化您的图形,双击“梯度”节点,您将准确地看到用于计算梯度的每个操作。