Tensorflow2 0之卷積層實現

2021-10-02 20:10:47 字數 3966 閱讀 5858

在 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...