2016-12-08 8 views
0

入力画像に対してあるレイヤーのグラデーションを計算しようとしています。勾配は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)に戻しますか?

答えて

0

これは予想される現象です。完全畳み込みネットワークであるため、任意のサイズの入力で動作することができる開始ネットの場合には、完全畳み込みネットワークは、ネットワークの後の部分でFully Connectedレイヤに依存するAlexnetやVGGとは異なり、任意のサイズの入力に対応できます。希望があなたの質問に答えることを望みます。