Tensorflow 的 tf.nn.conv2d() 用法
參數
tf.nn.conv2d( input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)Input 輸入資料(如一張圖片)
Input 的型態被設定為一個 4D 的 tensor,這四個維度設定跟 data_format 這個參數有關,如果 data_format 設成 "NHWC"(預設值), 則四個維度的順序為:
[ Batch size(有多少張圖), Height(圖高幾個像素), Width(圖寬幾個像素), Channels (有幾個頻道 如 R-G-B 就為 3 個, 單色圖片就為 1) ]
若設成 "NCHW" ,就變成
[ Batch size, Channels, Height, Width ]
# tensor 宣告可以像這樣
x = tf.placeholder(tf.float32, shape=[1, 5, 5, 1])
輸入的資料可以像這樣
import numpy as np
import tensorflow as tf
x_in = np.array([
[
[[2], [1], [2], [0], [1]],
[[1], [3], [2], [2], [3]],
[[1], [1], [3], [3], [0]],
[[2], [2], [0], [1], [1]],
[[0], [0], [3], [1], [2]],
]
])
print(x_in.shape)
# 形狀就是(1, 5, 5, 1)
Filter 過濾器 (有時稱 kernel )
圖一:Convolution 卷積示意
過濾器之格式為:
[ Height (過濾器高) x Width (過濾器寬) x Input Channels (輸入幾個 channels - 是被 input 所決定的) x Output Channels (輸出幾個 channels - 如圖是 1) ]
特別說明一下,input channel 是被上一層的 channels 數所決定的,而 output channel 則是看下一層接住這個 convolution layer 的 input 會有多少。有興趣更深入的,這裡有進一步講解。
Strides 步進
進行 convolution 計算時,一步要前進多少。由於有四個面向 (即 data_format 所定義的 (NHWC 或 NCHW),所以這個值是一個 1D 的 tensor,但是有四個值,就照 data_format 所定義的順序,一次要跳多少。最常用的就是直接定義為 [1, 1, 1, 1]。Padding 填充
選擇有兩種,'SAME' or 'VALID',這兩種演算法有人用底下這個圖,我覺得最容易一目了然。以一個例子來說:- Input width = 13
- Filter width = 6
- Stride = 5
VALID就是當 filter 不斷滑過去計算,剩下的就丟掉 (drop)。SAME就是過程中不足的,自動補 0 進去。 更簡單來說,如果就整個 input 寬度的邊界來說,會跨過去的(當然要補值)就是 SAME,不會跨過去的就是 VALID。
Data_format 資料格式
前面一直在介紹的,有兩種資料排列方式,NHWC 與 NCHW,預設是 NHWC。N : 圖形批次 batch size
H : 圖形高度 image height
W: 圖形寬度 image width
C: 頻道數,前面解釋過,RGB圖為三個、單色圖為一個,如果非圖形則看自己要連結的下一層輸入數
Use_cudnn_on_gpu GPU加速
是一個布林值 ( True 或 False ),是否要使用 Nvidia 的類神經網路庫 cudnn 來作 GPU 加速。範例
import numpy as np
import tensorflow as tf
x_in = np.array(
[ [
[[1], [2], [3], [4], [5]],
[[5], [4], [3], [2], [1]],
[[1], [3], [5], [7], [9]],
[[2], [4], [6], [8], [10]],
[[1], [0], [1], [0], [1]],
]
])
# 設 out_channels==1
kernel = np.array([
[
[[1]],[[2]] ],
[ [[3]],[[4]]
],
])
x = tf.placeholder(tf.float32, shape=[1, 5, 5, 1])
k = tf.constant(kernel, dtype=tf.float32)
conv = tf.nn.conv2d(x, k, strides=[1, 1, 1, 1], padding='VALID')
with tf.Session() as sess:
result = sess.run(conv, feed_dict={x: x_in})
print(result.shape, result)
沒有留言:
張貼留言