如何计算渐变来欺骗图像分类器?

时间:2016-01-11 04:12:45

标签: python computer-vision tensorflow

我正在尝试使用TensorFlow中的标准技巧 - 图像分类器示例。

(也就是说,按照渐变调整输入图像,使其被错误分类,例如https://codewords.recurse.com/issues/five/why-do-neural-networks-think-a-panda-is-a-vulture。)

我从https://www.tensorflow.org/versions/master/tutorials/image_recognition/index.html下载了inception-v3模型,并让它对图像进行分类。

但我很难计算渐变来调整输入图像。我希望能在TensorFlow中得到一些帮助。

这是我一直在尝试的基本想法:

with tf.Session() as sess: 
  feed_dict = {'DecodeJpeg/contents:0': image_data}
  softmax_tensor = sess.graph.get_tensor_by_name('softmax:0')
    # at this point, sess.run(softmax_tensor, feed_dict) works...
  input_tensor = sess.graph.get_tensor_by_name('DecodeJpeg/contents:0')
  grad = tf.gradients(softmax_tensor, input_tensor)[0]
  real_grad = grad.eval(feed_dict)

即使sess.run()正常工作,tf.gradients()也只是返回[无]。这显然是一个非常初学的问题,但有人能指出我在哪里出错了吗?梯度为什么不做任何事情?

1 个答案:

答案 0 :(得分:2)

tf.gradients()返回[None]的原因是input_tensor在进入初始网络之前经历了不可微变换(即JPEG解码和强制转换)。相反,您应该使用JPEG解码的结果编辑:和强制转换),如下所示:

# This tensor is the result of the DecodeJpeg op.
decoded_input_tensor = sess.graph.get_tensor_by_name('Cast:0')

grad = tf.gradients(softmax_tensor, decoded_input_tensor)[0]

real_grad = grad.eval(feed_dict)

生成逼近分类器的图像后,可以使用tf.image.encode_jpeg() op将其转换回JPEG图像。