tensorflow--卷积计算过程

1、卷积(Convolutional Neural Networks, CNN)计算过程

  • 全连接神经网络对识别和预测都有非常好的效果,但有时,如Mnist数据集中,输入是一幅28行28列的784个像素点的灰度值,仅两层全连接网络就有10多w个带训练参数(784128+128 + 12810+10),而实际中输入神经网络的是具有更高分辨率的彩色图片(近乎乘以3),使得全连接神经网络的输入特征过多,网络规模过大,待优化参数过多,很容易使得模型过拟合。为了减少模型参数,在实际应用中会先对原始图片进行特征提取,再把提取到的特征送给全连接网络。
  • 卷积计算是一种有效的特征提取方法。一般会用一个正方形的卷积核,按指定步长,在输入特征上滑动,遍历输入特征图上的每一个点。每一个步长,卷积核会与输入特征图出现重合区域,重合区域对应元素相乘、求和再加上偏置项得到输出特征的一个像素点。一般要使卷积核的通道数与输入特征图的通道数一致。所以,当前输入特征图使用了几个卷积核,就决定了输出特征图的深度(如果模型在某层特征提取能力不足,可以在这层多使用几个卷积核提高这一层的特征提取能力)

2、感受野(Receptive Field)

  • 卷积神经网络各输出特征图中的每个像素点,在原始输入图片上映射区域的大小(例如,一个5*5的原始图片,分别经过一个5 * 5和两个3 * 3的卷积核作用,都能得到一个感受野是5的输出特征图(输出是1 * 1))
  • 选一个5 * 5 还是两个3 * 3 呢?(近乎都是选两层3*3)
#  两层3*3计算量
(x-2)^2 * 9 + ((x-2) -2)^2 * 9 = 18 * x^2 - 108x + 180 

#  一层5*5计算量
(x-4)^2 * 25 = 25 * x^2 - 200x + 400 

3、全零填充(Padding)

  • 在卷积计算中保持输入特征图的尺寸不变,可以使用全零填充,在输入特征图周围填充0
  • 使用全零填充(padding=SAME):输出特征图边长 = 输入特征图边长 / 步长(向上取整)
  • 不使用(padding=VALID): 输出特征图边长 = (输入特征图边长 - 核长 + 1 )/ 步长(向上取整)

TF描述卷积层

tf.keras.layers.Conv2D(
    filters=卷积核个数,
    kernel_size=卷积核尺寸,
    strides=滑动步长,  # 横纵向相同写步长整数,或(纵向步长h, 横向步长w),默认1
    padding="same" or "valid"(默认),
    activation=激活函数,  # 如relu,sigmoid,tanh,softmax等
    input_shape=(高,宽,通道数)
)

4、批标准化(Batch Normalization, BN)

  • 神经网络对0附近的数据更敏感,但是随着网络层数的增加,特征数据会出现偏离0均值的情况。标准化可以使数据符合以0为均值,1为标准差的分布BN就是对一小批数据(batch),做标准化处理。常用在卷积操作和激活操作之间。
  • 使得输入数据的微小变化,更明显的体现到激活函数的输出,提升了激活函数对输入数据的区分力
  • 现实意义举例:顶级富豪几百亿的身家增加了几亿,和普通上班族年薪增加了几(十)万的模型在sigmoid函数里的表达
  • 但是标准化后的特征数据,集中在激活函数的线性表达区域(sigmoid函数在0附近导数很接近1),使得激活函数丧失了非线性特征,因此,在BN操作中为每个卷积核引入了两个可训练参数,缩放因子γ和偏移因子β,调整归一化的力度。

5、池化(pooling):用于减少特征数量。

  • 最大值池化:可提取图片纹理
  • 均值池化:可保留背景特征
[[1, 1, 2, 4],    
 [5, 6, 7, 8],
 [3, 2, 1, 0],
 [1, 2, 3, 4]]

# 用2*2的池化核、步长为2的最大值池化
[[6, 8,],
 [3, 4]]


# 用2*2的池化核、步长为2的均值池化
[[3.25, 5.25,],
 [2, 2]]

TF描述池化:

tf.keras.layers.MaxPool2D(
    pool_size=池化核尺寸,
    strides=池化步长,  # 步长整数,或纵向尺寸h,横向尺寸w
    padding="valid" or "same"  # 是否使用全零填充
)

tf.keras.layers.AveragePooling2D(
    pool_size=池化核尺寸,
    strides=池化步长,  # 步长整数,或纵向尺寸h,横向尺寸w
    padding="valid" or "same"  # 是否使用全零填充
)

6、舍弃(Dropout)

为了缓解神经网络过拟合,在神经网络训练过程中,常把隐藏层的部分神经元按照一定比例从神经网络中临时舍弃。在使用神经网络时,被舍弃的神经元再回复链接。
tf.keras.layers.Dropout(舍弃的概率)

7、总结

卷积神经网络,就是借助卷积核提取特征后,送入全连接网络。


cnn.png

卷积就是特征提取器,就是CBAPD

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding='same'),  # C
    tf.keras.layers.BatchNormalization(),  # B
    tf.keras.layers.Activation("relu"),  # A
    tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=2, padding="same"),  # P
    tf.keras.layers.Dropout(0.2)  # D
])
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。