我正在研究如何破坏线性分类器,但我无法理解tf.gradients
。
该项目的重点是建立一个模型并在 mnist
数据集上对其进行训练。一旦训练完成,我就会拍摄一张图像,稍微改变一下,然后将其反馈给模型。然而,当我反馈回来时,预测应该是不同的。例如,如果我有一张 2 的图像,并且希望模型预测 6,我会稍微更改图像,使图像看起来仍然像 2,但模型会认为它是 6。
这是如何完成的只是一个简单的方程式。我们对损失函数求导并取其符号并将其应用于乘以某个 epsilon 值的图像。例如,方程是这样的......
new image = image + (epsilon * sign of derivative of loss function)
令我困惑的部分是tf.gradients
。我正在查看一个示例,但我很难理解它。
首先,提取编号为2的10张图像。接下来,创建代表标签 6 的 10 个标签。因此标签如下所示...
[[0, 0, 0, 0, 0, 1, 0, 0, 0 ,0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
...etc...
然后成本函数的导数看起来像这样(cross_entropy
是成本函数)...
im_derivative = tf.gradients(cross_entropy, x)[0]
im_derivative = im_derivative.eval({x: x0,
y_: y_six,
keep_prob: 1.0})
x0
是 2 的 10 个图像,y_six
是代表数字 6 的标签。该导数的符号随后用于我上面演示的方程中.
我的问题是,tf.gradients
返回的到底是什么?为什么使用标签 6 而不是标签 2 来评估导数?我很难理解退回的是什么以及为什么使用假标签。我知道假标签可能是欺骗分类器所必需的,但很难看到这一点,因为我不明白 tf.gradients
返回的内容。
最佳答案
tf.gradient(ys, xs)
返回 ys 之和相对于 t 的符号偏导数。 x 中的 x。
在您的情况下,您正在定义 cross_entropy
相对于 x
的偏导数(并提取第一个(也是唯一的)元素,因为 tf.gradient
返回一个列表)。
相对于输入的成本梯度可以指示您需要更新多少网络参数以及在哪个方向上执行此更新,以便最大限度地降低成本。
因此,由于您想欺骗分类器,因此您需要计算具有不同标签的特定输入的梯度,以便找到您必须遵循的“指示”(或信号),以使网络考虑该输入6
。
关于python - 了解 tf.gradients 如何评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49603346/