我正在尝试使用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()
也只是返回[无]。这显然是一个非常初学的问题,但有人能指出我在哪里出错了吗?梯度为什么不做任何事情?
答案 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图像。