一. 卷积层实现
在Tensorflow中,可以通过自定义权值的底层方式,也可以通过调用线程的卷积层类的高层方式搭建卷积层的网络。
1. 自定义权值
import tensorflow as tf
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.shape([2,5,5,4])'''
import tensorflow as tf
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.shape([2,2,2,4])'''
# 根据[cout]格式创建偏置向量
b = tf.zeros([4])
# 在卷积输出上叠加偏置向量,它会自动broadcasting 为[b,h',w',cout]
out = out + b
2. 卷积层
import tensorflow as tf
x = tf.random.normal([2,5,5,3])
layer = tf.keras.layers.Conv2D(4,kernel_size=3,strides=1,padding='SAME')
out = layer(x)
'''
out.shape([2,5,5,4])'''
二. 池化层
在卷积层中,通过调整步长来实现特征图高宽成倍缩小,池化层是专门进行图片缩减功能的网络层,主要有:最大池化层、平均池化层。
1. 最大池化层
tf.keras.layers.MaxPooling2D(pool_size=3,strides=2)
2. 平均池化层
tf.keras.layers.AveragePooling2D(pool_size=3,strides=2)
三. BatchNorm层
参数标准化层,使得网络的超参数设定更加自由,比如更大的学习率,更随意的网络初始化。
以LeNet-5网络模型为例,在卷积层后添加BN层
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)
])
BN层在训练阶段和测试阶段行为不同,通过设置网络的参数training=True来区分训练和测试(False)
out = network(x, training=True) #训练阶段
out = network(x, training=False) #测试阶段