在 tensorflow 中,通過tf.nn.conv2d 函式可以方便地實現2d 卷積運算。tf.nn.conv2d基於輸入?: ℎ ? ??? 和卷積核?: ? ? ??? ???? 進行卷積運算,得到輸出? ℎ′ ?′ ???? ,其中???表示輸入通道數,????表示卷積核的數量,也是輸出特徵圖的通道數。例如:
in [1]
:x = tf.random.normal([2
,5,5
,3])
# 模擬輸入,3 通道,高寬為5
# 需要根據[k,k,cin,cout]格式建立w 張量,4 個3x3 大小卷積核
w = tf.random.normal([3
,3,3
,4])
# 步長為1, padding 為0,
out = tf.nn.conv2d(x,w,strides=
1,padding=[[
0,0]
,[0,
0],[
0,0]
,[0,
0]])
out[1]
:# 輸出張量的shape
tensorshape([2
,3,3
,4])
其中padding 引數的設定格式為:
padding=[[0,0],[上,下],[左,右],[0,0]]
例如,上下左右各填充乙個單位,則padding 引數設定為 ,實現如下:
in [2]
:x = tf.random.normal([2
,5,5
,3])
# 模擬輸入,3 通道,高寬為5
# 需要根據[k,k,cin,cout]格式建立,4 個3x3 大小卷積核
w = tf.random.normal([3
,3,3
,4])
# 步長為1, padding 為1,
out = tf.nn.conv2d(x,w,strides=
1,padding=[[
0,0]
,[1,
1],[
1,1]
,[0,
0]])
out[2]
:# 輸出張量的shape
tensorshape([2
,5,5
,4])
特別地,通過設定引數padding=『same』、strides=1 可以直接得到輸入、輸出同大小的卷積層,其中padding 的具體數量由tensorflow 自動計算並完成填充操作。例如:
in [3]
:x = tf.random.normal([2
,5,5
,3])
# 模擬輸入,3 通道,高寬為5
w = tf.random.normal([3
,3,3
,4])
# 4 個3x3 大小的卷積核
# 步長為,padding 設定為輸出、輸入同大小
# 需要注意的是, padding=same 只有在strides=1 時才是同大小
out = tf.nn.conv2d(x,w,strides=
1,padding=
'same'
)out[3]
: tensorshape([2
,5,5
,4])
當?trides >1 時,設定padding='same』將使得輸出高、寬將成1
s\frac
s1倍地減少(s為步長)。例如:
in [4]
:x = tf.random.normal([2
,5,5
,3])
w = tf.random.normal([3
,3,3
,4])
# 高寬先padding 成可以整除3 的最小整數6,然後6 按3 倍減少,得到2x2
out = tf.nn.conv2d(x,w,strides=
3,padding=
'same'
)out [4]
:tensorshape([2
,2,2
,4])
卷積神經網路層與全連線層一樣,可以設定網路帶偏置向量。tf.nn.conv2d 函式是沒有實現偏置向量計算的,新增偏置只需要手動累加偏置張量即可。例如
# 根據[cout]格式建立偏置向量
b = tf.zeros([4
])# 在卷積輸出上疊加偏置向量,它會自動broadcasting 為[b,h',w',cout]
out = out + b
不知道broadcasting機制的可以去看我的另一篇部落格。
通過設定strides和padding可以控制卷積層的輸出大小,卷積層並不像全連線層一樣可以直接指定輸出層的大小。
通過卷積層類layers.conv2d 可以不需要手動定義卷積核?和偏置?張量,直接呼叫類例項即可完成卷積層的前向計算,實現更加高層和快捷。
在新建卷積層類時,只需要指定卷積核數量引數filters,卷積核大小kernel_size,步長strides,填充padding 等即可。如下建立了4 個3 × 3大小的卷積核的卷積層,步長為1,padding 方案為』same』:
layer = layers.conv2d(4,kernel_size=3,strides=1,padding=『same』)
如果卷積核高寬不等,步長行列方向不等,此時需要將kernel_size 引數設計為tuple格式(?ℎ ??),strides 引數設計為(?ℎ ??)。如下建立4 個3 × 大小的卷積核,豎直方向移動步長?ℎ = 2,水平方向移動步長?? = :
layer = layers.conv2d(4,kernel_size=(3,4),strides=(2,1),padding=『same』)
建立完成後,通過呼叫例項(的__call__方法)即可完成前向計算,例如:
in [5]
:# 建立卷積層類
layer = layers.conv2d(
4,kernel_size=
3,strides=
1,padding=
'same'
)out = layer(x)
# 前向計算
out.shape # 輸出張量的shape
out[5]
:tensorshape([2
,5,5
,4])
在類conv2d綜合,儲存了卷積核張量w和偏置b,可以通過類成員trainable_variables直接返回w和b的列表,例如:
in [6]
:# 返回所有待優化張量列表
layer.trainable_variables
out[6]
:[,3,3
,4) dtype=float32, numpy=
array([[
[[0.13485974,-
0.22861657
,0.01000655
,0.11988598],
[0.12811887
,0.20501086,-
0.29820845,-
0.19579397],
[0.00858489,-
0.24469738,-
0.08591779,-
0.27885547]]
, …,) dtype=float32, numpy=array([0
.,0.
,0.,
0.], dtype=float32)
>
]
通過呼叫layer.trainable_variables可以返回conv2d類維護的w和b張量,這個類成員在獲取網路層的待優化變數時非常有用。也可以直接呼叫類實力layer.kernel、layer.bias名訪問w和b張量 tensorflow2 0之one hot函式使用
先了解一下one hot要幹啥吧。來,咱先看個程式,你一定會很眼熟的。嘿,是不是發現什麼了?labels向量最後可以表示乘矩陣的方式,且 1 0 0 表示0,類推 0 1 0 0 表示1,這樣,可以表示 0 9總共九個數值。one hot的作用就是這樣的,作為儲存標籤的一種方式,用1的位置不同來區分...
Tensorflow2 0 一維卷積神經網路搭建
網上對於卷積神經網路的介紹大部分都是2d的,一維卷積神經網路的比較少,使用新框架的就更少了。如下 首先搭建網路,這裡以最簡單的sequential為例 先是卷積 sequential tf.keras.layers.conv1d 2,kernel size 1,padding same activa...
TensorFlow2 0之RNN情感分類問題實戰
tensorflow2.0之rnn情感分類問題實戰 import tensorflow as tf from tensorflow import keras from tensorflow.keras import sequential,layers,datasets,optimizers,loss...