tf.gradients中的输入图像大小

时间:2016-12-08 19:03:09

标签: python neural-network tensorflow

我试图计算某个层相对于输入图像的渐变。渐变定义为

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)

我们看到渐变具有与输入图像相同的形状,这是预期的。

然而,似乎可以使用任何大小的图像但仍然可以获得渐变。例如,如果我有img_resized形状(150,150,3),则相对于此输入的渐变也将具有(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)的图像时,张量流是否将图像调整为(299,299,3)并计算具有形状的渐变(299,299,3),然后将渐变调整回(150,150,3)?< / p>

1 个答案:

答案 0 :(得分:0)

这是一种预期的现象,尤其是在初始网络的情况下,由于完全卷积网络,它可以与任何大小的输入一起工作。与Alexnet或VGG不同,它依赖于网络后期的完全连接层,完全卷积网络可以在任何大小的输入上工作。希望这能回答你的问题。