我试图计算相对于输入图像的某一层的梯度。梯度被定义为
feature = g.get_tensor_by_name('inception/conv2d0_pre_relu:0')
gradient = tf.gradients(tf.reduce_max(feature, 3), x)我的输入图像的形状是(299,299),这是inception is trained at
print(img.shape)
# output (299,299,3)然后,相对于输入的梯度可以计算为
img_4d=img[np.newaxis]
res = sess.run(gradient, feed_dict={x: img_4d})[0]
print(res.shape)
# output (1,299,299,3)我们看到梯度与输入图像具有相同的形状,这是意料之中的。
然而,似乎一个人可以使用任何大小的图像,但仍然可以获得梯度。例如,如果我有一个形状为(150,150,3)的img_resized,关于此输入的梯度也将具有形状(150,150,3):
img_resized=skimage.transform.resize(img, [150,150], preserve_range=True)
img_4d=img_resized[np.newaxis]
res = sess.run(gradient, feed_dict={x: img_4d})[0]
res.shape
# output (1,150,150,3)那么为什么这是可行的呢?在我的简单图片中,输入图像的尺寸必须固定为(299,299,3),并且相对于输入的某一层的梯度将始终具有(299,299,3)的形状。为什么它能够生成其他大小的渐变?
换句话说,在上面的代码中发生了什么?当我们输入一个具有形状(150,150,3)的图像时,tensorflow是否将图像大小调整为(299,299,3)并计算具有形状(299,299,3)的梯度,然后将梯度大小调整回(150,150,3)?
发布于 2016-12-10 03:03:29
这是意料之中的现象,尤其是。在初始网络的情况下,由于是完全卷积网络,它可以与任何大小的输入一起工作。与Alexnet或VGG不同,它们依赖于网络后期的完全连接层,完全卷积网络可以在任何大小的输入上工作。希望这能回答你的问题。
https://stackoverflow.com/questions/41046951
复制相似问题