来自书籍: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)