入力画像に対してあるレイヤーのグラデーションを計算しようとしています。勾配はtf.gradientsの入力画像サイズ
feature = g.get_tensor_by_name('inception/conv2d0_pre_relu:0')
gradient = tf.gradients(tf.reduce_max(feature, 3), x)
として定義され、私の入力画像は、inception is trained at
print(img.shape)
# output (299,299,3)
が、入力に対する勾配は
として算出することができる大きさである、(299299)の形状を有しています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)、(150,150,3)の形状になりますまた、この入力に対する勾配でimg_resized
を持っている場合:
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)に戻しますか?