隐藏层过多,待训练的参数过多时,可能会造成模型的过拟合,可以利用卷积计算来提取图像特征,从而避免过拟合,提高模型的泛化能力。
卷积计算时,卷积核的深度需要和输入特征图的深度匹配(相等)。卷积核里存在待训练的参数,在进行反向传播的时候会被更新。
感受野是指卷积神经网络各输出特征图中的一个像素点,在原始输入图片上映射区域的大小。注意不管是第几层神经网络,感受野都是对于最原始的特征图而言的。
卷积核的优劣与否不能严格的有其大小来断定,具有相同感受野的一层或多层卷积网络计算的次数与特征图的大小有关。例如,两层3*3的卷积核和一层5*5的卷积核具有相同大小的感受野,但是在对于变长超过10的特征图中,两层3*3的计算量要小于一层5*5的卷积核,性能也更好。
有时我们如果想保持卷积前后的图像大小不变,我们便可以使用全0填充来扩大原始特征图的大小,
从而使其在卷积前后尺度不变。
tf.keras.layers.Conv2D(
filters=卷积核个数,
kernel_size=卷积核尺寸, # 正方形写核长,长方形写(核高, 核宽w)
strides=滑动步长, # 横纵向相同写步长整数,否则写(纵向步长h, 横向步长w) 默认1
padding="same" or "valid", # 使用全0填充是"same", 不使用是"valid"
activation="relu" or "sigmoid" or "tanh" or "softmax"等, # 如果后面有批标准化操作,则这里不写激活函数
input_shape=(高,宽,通道数) # 输入特征图维度,可以省略
)
神经网络对0附近的数据更敏感(激活函数在0附近的变化更加明显),但是随着网络层数的增加,数据可能偏离0均值,批标准化就是把偏移的数据重新拉回到0附近,常用在卷积操作和激活操作之间。
但是批标准化操作后数据完全符合标准化,使激活函数丧失了非线性的特征,因此在BN操作中为每个卷积核引入了另外两个可训练参数:缩放因子和偏移因子,优化了特征数据分布的宽窄和偏移量,保证了网络的非线性表达力。
标准化: 使数据符合0均值,1为标准差的分布
批标准化: 对一小批数据(batch), 做标准化处理
可以参考下面的代码把BN层加到卷积层和激活层之间:
model = tf.keras.models.Sequential([
Conv2D(Filters=6, kernel_size=(5, 5), padding="same"),
BatchNormalization(), # BN层
Activation('relu'),
MaxPool2D(pool_size=(2, 2), strides=2, padding="same"),
Dropout(0.2),
])
用于减少特征数据量
最大值池化可提取图片纹理,均值池化可保留背景特征。
tf.keras.layers.MaxPool2D(
pool_size=池化核尺寸, # 格式和上述的核的写法相同
strides=池化步长, # 格式上述, 默认和池化核的尺寸相同
padding="valid" or "same"
)
tf.keras.layers.AveragePooling2D(
pool_size=池化核尺寸,
strides=池化步长,
padding="valid" or "same"
)
为了防止神经网络训练过程中过拟合,常常把隐藏层的部分神经元按照一定比例从神经网络临时舍弃。在神经网络使用时再把所有的神经元恢复。
TF提供了Dropout函数
tf.keras.layers.Dropout(舍弃的概率)
model = tf.keras.models.Sequential([
Conv2D(filters=6, kernel_size=(5, 5), padding="same"),
BatchNormalization(),
Activation("relu"),
MaxPool2D(pool_size=(2, 2), strides=2, padding='same'),
Dropout(0.2), # Dropout层
])
借助卷积核提取特征后,送入全连接网络。
卷积就是特征提取器,就是CBABD
Conv2D()
BatchNormalization()
Activation()
MaxPool2D()
Dropout()