看到知乎上這樣一個問題:
下面這個圖所示,輸入數據是一個2個通道3*3的數據,過濾器是一個具有兩個通道的2*2的數據,按照一般卷積過程,即如果所示結果是一個通道的2*2的數據。
但是在tensorflow中,我們如下實現:
k = tf.constant([ 1,2 ,3,4,
? ? ? ? ? ? ? ? ? ? ? ? ? ? 5,6,7,8], dtype=tf.float32, name='k')
i = tf.constant([
? ? ? ? ? ? ? ? ? ? ? ?1, 3, 5,
? ? ? ? ? ? ? ? ? ? ? ?1, 3, 5,
? ? ? ? ? ? ? ? ? ? ? ?1, 3, 5,
? ? ? ? ? ? ? ? ? ? ? ? 2, 4, 6,
? ? ? ? ? ? ? ? ? ? ? ? 2, 4, 6,
? ? ? ? ? ? ? ? ? ? ? ? 2, 4, 6
? ? ? ? ? ? ? ? ? ? ? ? ], dtype=tf.float32, name='i')
kernel = tf.reshape(k, [2, 2, 2, 1], name='kernel')
image? = tf.reshape(i, [1, 3, 3, 2], name='image')
#res = tf.nn.conv2d(image, kernel, [1, 1, 1, 1], "VALID")
res = tf.squeeze(tf.nn.conv2d(image, kernel, [1, 1, 1, 1], "VALID"))# VALID means no padding
with tf.Session() as sess:
? ? ? ? ? ? print(sess.run(res))
結果不對
原因原來是data_format 參數的問題,圖像數據格式定義了一批圖片數據的存儲順序。在調用 TensorFlow API 時會經常看到 data_format 參數:
data_format 默認值為 "NHWC",也可以手動設置為 "NCHW"。這個參數規定了 input Tensor 和 output Tensor 的排列方式。
data_format 設置為 "NHWC" 時,排列順序為 [batch, height, width, channels];
? ? ? ? ? ? ? ? ? ? ? 設置為 "NCHW" 時,排列順序為 [batch, channels, height, width]。
其中 N 表示這批圖像有幾張,H 表示圖像在豎直方向有多少像素,W 表示水平方向像素數,C 表示通道數(例如黑白圖像的通道數 C = 1,而 RGB 彩色圖像的通道數 C = 3)。為了便于演示,我們后面作圖均使用 RGB 三通道圖像。兩種格式的區別如下圖所示:
NCHW 中,C 排列在外層,每個通道內像素緊挨在一起,即 'RRRRRRGGGGGGBBBBBB' 這種形式。
NHWC 格式,C 排列在最內層,多個通道對應空間位置的像素緊挨在一起,即 'RGBRGBRGBRGBRGBRGB' 這種形式。
于是我們的程序中將數據順序修改即可:
k = tf.constant([
1, 5,
2, 6,
3, 7,
4, 8
], dtype=tf.float32, name='k')
i = tf.constant([
1, 2, 3,
4, 5, 6,
1, 2, 3,
4, 5, 6,
1, 2, 3,
4, 5, 6
], dtype=tf.float32, name='i')
kernel = tf.reshape(k, [2, 2, 2, 1], name='kernel')
image? = tf.reshape(i, [1, 3, 3, 2], name='image')
#res = tf.nn.conv2d(image, kernel, [1, 1, 1, 1], "VALID")
res = tf.squeeze(tf.nn.conv2d(image, kernel, [1, 1, 1, 1], "VALID"))# VALID means no padding
with tf.Session() as sess:
? ? ? ? ? ? print(sess.run(image))
? ? ? ? ? ? print("------------------")
? ? ? ? ? ? print(sess.run(kernel))
? ? ? ? ? ? print("------------------")
? ? ? ? ? ?print(sess.run(res))
最終能如愿以償得到如圖右邊的結果。不過feature map的172應該改為174,手算也該如此
主要參考:http://mp.weixin.qq.com/s/I4Q1Bv7yecqYXUra49o7tw