0

我正在阅读有关对抗性图像和破坏神经网络的信息。我正在尝试逐步完成这篇文章,但由于我缺乏经验,我很难理解以下说明。

目前,我有一个MNIST数据集的逻辑回归模型。如果你给出一个图像,它会预测它最有可能是的数字......

saver.restore(sess, "/tmp/model.ckpt")
# image of number 7
x_in = np.expand_dims(mnist.test.images[0], axis=0)
classification = sess.run(tf.argmax(pred, 1), feed_dict={x:x_in})
print(classification)

现在,文章指出,为了打破这张图片,我们需要做的第一件事就是获取神经网络的梯度。换句话说,这将告诉我使图像看起来更像数字 2 或 3 所需的方向,即使它是 7。

文章指出,使用back propagation. 所以你可以定义一个函数......

compute_gradient(image, intended_label)

...这基本上告诉我们当时神经网络正在寻找什么样的形状。

对于那些更有经验的人来说,这似乎很容易实现,但逻辑却让我回避了。

从函数的参数中compute_gradient,我可以看到您向它提供了一个图像和一个标签数组,其中预期标签的值设置为 1。

但我不明白这应该如何返回神经网络的形状。

无论如何,我想了解我应该如何实现这个back propagation算法来返回神经网络的梯度。如果答案不是很直截了当,我想要一些分步说明,了解如何让我back propagation按照文章建议的方式工作。

换句话说,我不需要有人给我一些我可以复制的代码,但我也想了解如何实现它。

4

1 回答 1

1

反向传播涉及计算网络输出中的误差(成本函数)作为输入和网络参数的函数,然后计算成本函数相对于每个参数的偏导数。在这里详细解释太复杂了,但是来自免费在线书籍的这一章解释了反向传播在其通常的应用中作为训练深度神经网络的过程。

生成欺骗神经网络的图像只需将这一过程进一步扩展,超越输入层,延伸到图像本身。我们不是稍微调整网络中的权重来减少误差,而是稍微调整像素值来增加误差,或者减少错误类别的误差。

使用 Calc 101 中的技术来近似梯度有一种简单(尽管计算量很大)的​​方法:对于足够小的 e,df/dx 约为 (f(x + e) - f(x)) / e。

类似地,要使用这种技术计算图像的梯度,计算在单个像素上添加一个小变化后损失/成本的变化量,将该值保存为该像素的近似偏导数,然后重复每个像素。

那么关于图像的梯度大约是:

(
    (cost(x1+e, x2, ... xn) - cost(x1, x2, ... xn)) / e,
    (cost(x1, x2+e, ... xn) - cost(x1, x2, ... xn)) / e,
    .
    .
    .
    (cost(x1, x2, ... xn+e) - cost(x1, x2, ... xn)) / e
)
于 2017-03-17T12:53:28.210 回答