卷积神经网络各输出特征图中的每个像素点,在原始输入图片上映射区域的大小.
如下图所示:
当用33卷积核在55输入特征图上卷积时,得到一个33的输出特征图(数字1),此时数字1映射到输入特征图55上,感受野是3;当在数字1上再次使用33卷积核,得到1的输出特征图(数字2),2映射到1上感受野是3,映射到55上感受野是5.
如果直接将55卷积核作用在55输入特征图上,得到数字3,3映射到输入特征图上感受野是5。
从上面可以看到,两层33卷积核和一层55卷积核的特征提取能力是一样的,那么选择哪种更好呢?
此时需要考虑两种类型所承载的待训练参数和计算量了,比较如下图所示:
当输入特征图边长大于10个像素点时,两层33卷积核优于一层55卷积核。
当希望卷积计算保持输入特征图的尺寸不变时,可以使用全零填充,也就是在输入特征图周围填充0。
如下图:进行全零填充后,卷积核33,步长1,输出特征图仍为55*1
卷积输出特征图维度的计算公式
如下图,左侧是使用全零填充,右侧不使用全零填充。
padding='SAME'
padding='VALID'
上图中#如有BN此处不写:意思是如果后面还有批标准化处理,则不写激活函数。
描述了三层卷积计算,分别用三种形式,可以根据自己习惯选择。
model = tf.keras.models.Sequential([
Conv2D(6,5,padding='valid',activation='sigmoid'),
MaxPool2D(2,2),
Conv2D(6,(5,5),padding='valid',activation='sigmoid'),
MaxPool2D(2,(2,2)),
Conv2D(filters=6,kernel_size=(5,5),padding='valid',activation='sigmoid'),
MaxPool2D(pool_size=(2,2),strides=2),
Flatten(),
Dense(10,activation='softmax')
])
(1)定义
神经网络对0附近的数据更敏感,但是随着网络层数的增加,特征数据会出现偏离0均值的情况。
tf.keras.layers.BatchNormalization()
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), #dropout层
])
如下图,用2*2池化核对输入图片以2为步长进行池化,输出图片将变成输入图片的四分之一大小。
上下两个分别是最大值池化和均值池化。
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), #dropout层
])
为了缓解神经网络过拟合,在神经网络训练时,将隐藏层的部分神经元按照一定概率从神经网络中暂时舍弃,神经网络使用时,被舍弃的神经元恢复链接。
tf.keras.layers.Dropout(舍弃的概率)
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), #dropout层
])