了解tf.gradients如何评估

时间:2018-04-01 22:49:25

标签: python tensorflow machine-learning

我正在研究如何打破线性分类器,但我无法理解tf.gradients

项目的目的是获取模型并在mnist数据集上进行训练。一旦它被训练,我正在拍摄图像,稍微改变它,并将其反馈给模型。但是,当我反馈它时,预测应该是不同的。例如,如果我有一个2的图像,并且我希望模型预测6,我会稍微改变图像,使图像看起来仍像2,但模型会认为它是6。

如何做到这一点只是一个简单的等式。我们采用损失函数的导数并取其符号并将其应用于图像乘以某个epsilon值。例如,等式是这样的......

new image = image + (epsilon * sign of derivative of loss function)

令我困惑的部分是tf.gradients。我正在看一个例子,但我很难理解它。

首先,提取10个数字2的图像。接下来,创建10个标签代表标签6.因此标签看起来如下......

[[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正在返回什么。

1 个答案:

答案 0 :(得分:1)

tf.gradient(ys, xs)返回ys w.r.t之和的符号偏导数。 xs中的x。 在您的情况下,您正在定义cross_entropy相对于x的偏导数(并提取第一个(也是唯一的)元素,因为tf.gradient返回一个列表)。< / p>

相对于输入的成本梯度可以指示您需要更新网络参数的数量以及执行此更新的方向,以便最大限度地降低成本。

因此,由于您想要欺骗分类器,您可以使用不同的标签计算某个输入的渐变,以便找到&#34;指示&#34; (或信号)您必须遵循以使网络将输入视为6

相关问题