來自書籍:TensorFlow深度學習
一、卷積神經網絡
1、卷積層
- 卷積核:kernel
- 步長:stride
- 填充:padding
- padding = same:如步長=2,卷積核掃描結束后還剩 1 個元素,不夠卷積核掃描了,這個時候就在后面補 1 個零,補完后滿足卷積核的掃描,這種方式就是same。
- padding = valid:如果說把剛才不足以掃描的元素位置拋棄掉,就是valid方式。
-
代碼實現:
(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, 格式padding=[[0,0],[上,下],[左,右],[0,0]] out = tf.nn.conv2d(x,w,strides=1,padding=[[0,0],[1,1],[1,1],[0,0]]) ##設置 padding = ‘same’,strides=1可以直接得到輸入與輸出同大小的卷積層 #輸入x大小 [2,5,5,3] , 輸出 out 大小[2, 5, 5, 4] out = tf.nn.conv2d(x,w,strides=1,padding='SAME') #當strides > 1時,padding = ‘same’,則輸出高和寬成1/s倍減少。 #輸入x大小 [2,5,5,3] , 輸出 out 大小[2, 2, 2, 4],因為(5+1)/3 = 2 out = tf.nn.conv2d(x,w,strides=3,padding='SAME')
(2)卷積層類
layers.Conv2D :在新建卷積層類時,只需要指定卷積核數量參數filters,卷積核大小kernel_size,步長 strides,填充padding 等即可。
#創建4個3×3大小的卷積核的卷積層,步長為1,padding=“same”: layer = layers.Conv2D(4,kernel_size=3,strides=1,padding='SAME') #創建4 個3 × 4 大小的卷積核,豎直方向移 動步長𝑠ℎ = 2,水平方向移動步長𝑠𝑤 =1 layer = layers.Conv2D(4,kernel_size=(3,4),strides=(2,1),padding='SAME')
2、池化層
- 最大統計量池化方法:MaxPooling1D、MaxPooling2D、MaxPooling3D
- 平均統計量池化方法:AveragePooling1D、AveragePooling2D和 AveragePooling3D。
- 全局池化方法:一維池化:GlobalMaxPooling1D和 GlobalAveragePooling1D。二維池化:GlobalMaxPooling2D和 GlobalAveragePooling2D。
3、BatchNorm層
layers.BatchNormalization():需設置training標志位來區分訓練階段和測試階段
LetNet-5 網絡模型:
network = Sequential([ # 網絡容器 layers.Conv2D(6,kernel_size=3,strides=1), # 插入BN層 layers.BatchNormalization(), layers.MaxPooling2D(pool_size=2,strides=2), layers.ReLU(), layers.Conv2D(16,kernel_size=3,strides=1), # 插入BN層 layers.BatchNormalization(), layers.MaxPooling2D(pool_size=2,strides=2), layers.ReLU(), layers.Flatten(), layers.Dense(120, activation='relu'), # 此處也可以插入BN層 layers.Dense(84, activation='relu'), # 此處也可以插入BN層 layers.Dense(10) ])
訓練階段:
with tf.GradientTape() as tape: # 插入通道維度 x = tf.expand_dims(x,axis=3) # 前向計算,設置計算模式,[b, 784] => [b, 10] out = network(x, training=True)
測試階段:
for x,y in db_test: # 遍歷測試集 # 插入通道維度 x = tf.expand_dims(x,axis=3) # 前向計算,測試模式 out = network(x, training=False)