我正在阅读一篇文章,它讲解如何欺骗神经网络以预测任何你想要的图像。我正在使用mnist数据集。
这篇文章提供了相对详细的步骤,但作者使用了Caffe。
无论如何,我的第一步是使用TensorFlow创建一个逻辑回归函数,该函数在mnist数据集上进行了训练。因此,如果我恢复逻辑回归模型,就可以使用它来预测任何图像。例如,我将数字7输入到以下模型中...
这将打印出数字
现在文章解释了为了破解神经网络,我们需要计算神经网络的梯度。这是神经网络的导数。
文章指出,要计算梯度,我们首先需要选择一个预期的结果作为目标,并将输出概率列表设置为0,预期结果为1。反向传播是一种用于计算梯度的算法。
然后提供了代码来说明如何在中计算梯度...
现在,我的问题是,我很难理解这个函数如何仅通过将图像和概率输入函数就能够得到梯度。因为我并不完全理解这段代码,所以我很难将这个逻辑翻译成TensorFlow。
我想我对Caffe框架的工作原理感到困惑,因为我之前从未见过/使用过它。如果有人能够逐步解释这个逻辑是如何工作的,那就太好了。
我已经知道反向传播的基础知识,所以您可以假设我已经知道它的工作原理。
以下是文章链接:https://codewords.recurse.com/issues/five/why-do-neural-networks-think-a-panda-is-a-vulture
这篇文章提供了相对详细的步骤,但作者使用了Caffe。
无论如何,我的第一步是使用TensorFlow创建一个逻辑回归函数,该函数在mnist数据集上进行了训练。因此,如果我恢复逻辑回归模型,就可以使用它来预测任何图像。例如,我将数字7输入到以下模型中...
with tf.Session() as sess:
saver.restore(sess, "/tmp/model.ckpt")
# 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)
>>>[7]
这将打印出数字
[7]
,是正确的。现在文章解释了为了破解神经网络,我们需要计算神经网络的梯度。这是神经网络的导数。
文章指出,要计算梯度,我们首先需要选择一个预期的结果作为目标,并将输出概率列表设置为0,预期结果为1。反向传播是一种用于计算梯度的算法。
然后提供了代码来说明如何在中计算梯度...
def compute_gradient(image, intended_outcome):
# Put the image into the network and make the prediction
predict(image)
# Get an empty set of probabilities
probs = np.zeros_like(net.blobs['prob'].data)
# Set the probability for our intended outcome to 1
probs[0][intended_outcome] = 1
# Do backpropagation to calculate the gradient for that outcome
# and the image we put in
gradient = net.backward(prob=probs)
return gradient['data'].copy()
现在,我的问题是,我很难理解这个函数如何仅通过将图像和概率输入函数就能够得到梯度。因为我并不完全理解这段代码,所以我很难将这个逻辑翻译成TensorFlow。
我想我对Caffe框架的工作原理感到困惑,因为我之前从未见过/使用过它。如果有人能够逐步解释这个逻辑是如何工作的,那就太好了。
我已经知道反向传播的基础知识,所以您可以假设我已经知道它的工作原理。
以下是文章链接:https://codewords.recurse.com/issues/five/why-do-neural-networks-think-a-panda-is-a-vulture