Tensorflow2.0学习笔记-神经网络卷积操作

之前的学习中,仅仅是两层神经网络就含有数十万个待训练参数,而参数数量过多很容易引起过拟合,导致测试结果不准确,所以我们可以采用卷积计算的方法对输入数据进行特征提取,再采取dropout的方式,降低过拟合。

卷积

传统的神经网络使用矩阵乘法来建立和输出的连接关系,每一个输出单元与每一个输入单元都产生交。然而。卷积网络具有稀疏交互(也叫稀疏连接或者稀疏权重)的特征。这是使核的大小远小于输入的大小来达到的。当我们处理一张图像时,输入的图像可能存在成千上万个像素点,但是我们可以通过只占用几十到上百个像素点的核来检测一些小的有意义的特征。这代表着我们需要的参数更少,不仅减少了模型的储存需求还提高了统计效率。

卷积的计算方法

卷积计算可以认为是一种有效的图像特征提取方法。
  一般采用正方形卷积核,按照指定的步长,再输入特征图上滑动,遍历输入特征图中的每一个像素点。每一个步长,卷积核会与输入特征出现重合区域,重合区域对元素相乘、求和再加上偏置项得到输出特征的一个像素点。
  在这里插入图片描述
上图中,我们所用到的是一个4 * 3的输入和2 * 2的卷积核,但是并没有加偏置,如果卷积核中加有偏置b。那么输出的每一个元素都需要加上b

全零填充

我们在做卷积时,希望输入和输出特征图的尺寸不变时,可以使用全零填充。全零填充就是在输入特征图的周边填充0,再进行卷积运算。
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021011016091012.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzExNTYzMQ==,size_16,color_FFFFFF,t_70#pic_center =600x)

TF描述全零填充
  用参数padding = ‘SAME’ 或 padding = 'valid’表示,前者表示使用全零填充,后者表示不使用全零填充。卷积输出特征图纬度的计算方法:
  在使用全零填充时:输出特征图边长 = 输入特征图边长 / 步长,不能整除时,向上取整
  在不使用全零填充时:输出特征图边长 = (输入特征图步长 - 卷积核步长 +1)/ 步长,向上取整

TF描述卷积层
tf.keras.layers.Conv2D(
filters = 卷积核个数,
kernel = 卷积核尺寸,  # 正方形写核长整数,或(核高,核宽)
strides = 滑动步长,  # 横纵向相同写步长整数,或(纵向步长,横向步长),默认1
padding = ‘‘same’’ or “valid”,  # 使用全零填充是“same”,不使用是“valid”(默认) 
activation = “relu” or “sigmoid” or “tanh” or “softmax”等,# 如有BN此处不写
input_shape = (高、宽、通道数) # 输入特征图纬度,可省略
)
批标准化(BN)

神经网络对0附近的数据比较敏感,但是特征数据在进行训练时,可能会出现偏移0均值的情况,这时使用标准化,可以使数据符合以0为均值,1为标准差的正态分布,把偏移的特征数据重新拉回到0附近。
批标准化:对一小批数据(batch),做标准化处理。

其中,![在这里插入图片描述](https://img-blog.csdnimg.cn/20210110165324964.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzExNTYzMQ==,size_16,color_FFFFFF,t_70)

但是这种批标准化会使激活函数丧失非线性特性,因此在BN操作中为每个卷积核引入了两个可训练参数来保证网络的非线性表达力,这两个可训练参数会随着其他参数一起训练。

x i k = γ k H ′ i k + β k {\rm{x}}_{\rm{i}}^{\rm{k}}{\rm{ = }}{{\rm{\gamma }}_{\rm{k}}}{\rm{H'}}_{\rm{i}}^{\rm{k}}{\rm{ + }}{{\rm{\beta }}_{\rm{k}}} xik=γkHik+βk
  其中γ是缩放因子,β是偏移因子。
  在这里插入图片描述

池化

池化用于减少特征数据量。
最大值池化可以提取图片纹理,均值池化可以保留背景特征。不管什么池化函数,当输入做出少量平移时,池化能够帮助输入的表示近似不变。
下图中分别是2 * 2的池化核的最大值池化和均值池化。
在这里插入图片描述

TF描述池化
最大值池化

tf.keras.layers.MaxPool2D(
pool_size = 池化核尺寸, # 正方形写核长整数。或(核高,核宽)
strides = 池化步长,# 步长为整数。或(纵向步长,横向步长),默认为pool_size
padding = 'valid' or 'same'  # 使用全零填充实“same”不使用是“valid”
)

均值池化

tf.keras.layers.AveragePooling2D(
pool_size = 池化核尺寸, # 正方形写核长整数。或(核高,核宽)
strides = 池化步长,# 步长为整数。或(纵向步长,横向步长),默认为pool_size
padding = 'valid' or 'same'  # 使用全零填充实“same”不使用是“valid”
)
Dropout舍弃操作

在神经网络训练时,将一部分神经元按照一定概率从神经网络中暂时舍弃。神经网络使用时,被舍弃的神经网络恢复链接。
TF描述Dropout

tf.keras.layers.Dropout(舍弃概率)
卷积神经网络各操作结合
model = tf.keras.models.Sequential([
  Conv2D(filters = 6, kernel_size = (5, 5), padding = 'same'),  # 卷积层,卷积核个数为6,卷积核尺寸为5*5,全零填充
  BatchNomalization(),  # BN层
  Activation('relu'),
  MaxPool2D(pool_size = (2, 2), strides = 2, padding = 'same'),  # 最大池化,池化核大小为2*2,步长为2,全零填充
  Dropout(0, 2),  # dropout层,舍弃概率为0.2
])
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值