卷积神经网络——解决参数太多问题

一、全连接网路的局限性

  • 图像变大导致色彩书变多,不好解决
  • 不便处理高维数据
    对于比较复杂的高维数据,如果按照全连接的方法,则只能通过增加节点、增加层数的方式来解决。增加节点会引起参数过多的问题。由于隐藏层神经网络使用的是sigmod或tanh激活函数,其反向传播的有效成层数只能在4~6层左右。

二、理解卷积神经网络

三、网络结构

卷积神经网络的结构与全连接网络相比复杂很多。它的网络结构主要包括卷积层、池化层。细节又可以分为滤波器、步长、卷积操作、池化操作。

1.网络结构描述

对于一般的图片会使用多个卷积核(滤波器),将它们统一放到卷积层里操作,这一层中有几个滤波器,就会有得到几个feature map,接着还需要经过一个池化层(pooling),将生成的feature map缩小(降维)。
卷积层中的channel的个数代表卷积岑的深度。池化层中则只有一个滤波器。

2.卷积操作

  • 步长
  • 窄卷积:生成的feature map比原来的图片小
  • 同卷积:声场的feature map和原来的一样大
  • 全卷积:也叫反卷积,把原始图片中的每个像素点都用卷积操作展开。
  • 反向传播

多通道卷积
在卷积神经网路中,通道又分为输入通道和输出通道:

  • 输入通道:起始通道为图片的通道数,如果是中间层的卷积,输入通道就是上一层的输出通道。通道使用同一卷积核进行卷积操作,生成与输入通道匹配的feature map,然后将值加起来生成一张feature map
  • 输出通道:想输出几个feature map,就放几个卷积核,就是几个输出通道。

3.池化层

池化的主要的目的是降维,即在保持原有特征的基础上最大限度地将数据的维数变小。
池化的操作和卷积很像,只是算法不同:

  • 卷积是将对应像素上的点乘,然后相加
  • 池化则只关心滤波器的大小,不考虑内部的值。算法是,滤波器映射区域内的像素点取平均值或最大值。
  1. 均值池化:对里面所有不为0的像素点取均值
  2. 最大池化:取里面所有像素点的最大值
  3. 反向传播

四、卷积神经网络的相关函数

在tensorflow中,使用tf.nn.conv2d实现卷积操作,使用tf.nn.max_pool进行最大池化操作。

1.卷积函数tf.nn.conv2d

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)

  • input:指需要做卷积的输入图像,要求是tensor,具体[batch, in_height, in_width, in_channels],具体含义是“训练一个batch的图片数量,图片高度,图片宽度,图像通道数”
  • filter:卷积核,要求tensor,具体[filter_height, filter_width, in_channels, out_channels],具体含义是“卷积核的高度,滤波器的宽度,图像通道数,滤波器的个数(或者输入通道数,输出通道数)”
  • strides:卷积是每一维的步长,一维向量,长度4
  • padding:“valid”表示边缘不填充,“same”表示滤波器可以达到图像边缘,需要补0

3.池化函数tf.nn.max_pool(avg_pool)

tensorflow中的池化函数:
tf.nn.max_pool(input, ksize, strides, padding, name=None)
tf.nn.avg_pool(input, ksize, strides, padding, name=None)

  • input:同上
  • ksize:池窗口的大小,取一个四维向量,一般是[1, height, width, 1],因为一般不会在batch和channels上池化
  • strides:同上
  • padding:同上

五、反卷积神经网络

反卷积是指,通过测量输出和已知输入构成未知输入的过程。在神经网络中,反卷积过程并不具备学习的能力,仅仅是用于可视化一个已经训练好的卷积神经网络模型,没有学习训练的过程,通常与卷积过程一起使用。

1.反卷积原理

反卷积的具体操作比较复杂,具体步骤如下:

  • 首先是将卷积核翻转(并不是转置,而是上下左右方向进行递序操作)
  • 再将卷积结果作为输入,做补0的扩充操作,这一步是根据步长来进行的,例如1就不需要补0了
  • 在扩充后的输入基础上再对整体补0。以原始输入的shape作为输出,按照padding规则,计算padding的补0位置和个数。
  • 将上面操作后的结果作为输入,进行卷积核为filter,步长为1的卷积操作
反卷积函数

def conv2d_transpose(value, filter, output_shape, padding=“SMAE”, data_format=“NHWC”, name=None)

  • value:代表通过卷积操作之后的张量,一般用NHWC类型
  • filter:代表卷积核
  • output_shape:代表输出张量形状也是四维张量
  • strides:代表步长
  • padding:代表原始数据生成value时使用的是补0操作

2.反池化原理

池化有两种为最大池化和平均池化,其反池化也需要与其对应。

  • 平均池化的反池化操作比较简单,只需要将平均值对应的原始数据位置即可。
  • 最大池化相对复杂些,池化时需要记录最大值的位置,反池化时只保留最大值的位置,其他为0

六、善用函数封装库

卷积函数使用tf.contrib.layers.conv2d,池化使用tf.contrib.max_pool2d和tf.contrib.avg_pool2d,使用全连接作为输出层,tf.contrib.layers.fully_connected

1.tf.contrib.layers中具体函数

没有定义权重,没有初始化,没有过多的参数,都是tf.contrib.layers封装好的

七、深度学习的模型训练技巧

1.优化卷积核技术

在实际的训练中,为了加快速度,常常把卷积核裁开,如3×3的过滤器,可以裁成3×1和1×3两个过滤器,分别对原有输入做卷积操作,这样可以大大提高运算的速度。

  • 比如如果对一个5×5的原始图片进行一次3×3的同卷积,相当于每个点丢进行3×3,一共90次
  • 同样是这个图片先进行3×1再进行1×3,结果一样,但只进行了60次计算

2.多通道卷积计算

多通道卷积可以理解为一个新型的CNN网络模型,在原有的卷积模型上扩展。

  • 原有的卷积层使用单个尺寸的卷积核对输入数据卷积操作,生成若干个feature map
  • 而多通道卷积的变化就是,在单个卷积层中加入若干不同尺寸的过滤器,这样会使生成的feature map特征更加多样性。

3.批量归一化

还有一种应用十分广泛的优化方法——批量归一化(BN)。一般用在全连接或卷积神经网络中

批量归一化介绍

计算时loss值会变得很大,使得网络无法计算,这种现象叫做梯度爆炸。产生梯度爆炸的原因是因为网络的内部协变量转移,即正向传播不同城的参数会将反向训练计算时所参照的数据样本分布改变。
这就是引入批量正则化的目的。他的作用是要最大限度地保证每次的正向传播出入在同一分布上,这样反向计算时参照的数据样本分布就会与正向计算时的分布也一样了,保证了分布同一,对权重的调整才会更有意义。
了解原理之后,再来批量正则化的做法就会变得很简单,即将每一层运算出来的数据都归一化成均值为0和方差为1的高斯分布,这样就会在保留样本分布的同时,消除了层层之间的分布差异。

批量归一化定义

tensorflow中自带的BN函数定义
tf.nn.batch_normalization(x, mean, variance, offset, scale, variance_epsilon, name=None)

  • x:代表输入
  • mean:代表样本的均值
  • variance:代表方差
  • offset:代表偏移,后面需要用激活函数转换,这里可以用0
  • scale:代表缩放,乘以一个转换值,一般为1
  • variance_epsilon:为了避免分母为0的情况,给分母加一个极小的值,默认即可。

想用batc_normalization,必须由另一个函数配合tf.nn.moments,计算均值和方差
tf.nn.momnets(x, axes, name=None, keep_dims=False)
有了上面两个函数还不够,为了有更好的效果,我们希望用平滑指数衰减的方法来优化每次的均值与方差,用tf.tran.ExponentialMovingAverage函数。它的作用是让上一次的值对本次的值有个衰减后的影响,从而使每次的值练起来后会有相对平滑一些。

shadow_variable = decay * shadow_varaible + (1 - decay) * varialbe

  • decay:代表衰减指数
  • variable:代表批次样本中的值
  • 等式右边的shadow_variable:代表上次的样本的值
  • 等式左边的shadow_variable:代表计算出来的本次总样本的值
批量归一化的简单用法

TensorFlow中的layers模块里实现了BN函数
def batch_norm(inputs, decay=0.999, cneter=True, scale=False, epsilon=0.001…)

  • inputs:代表输入
  • decay:代表移动平均值的衰败速度,一般设置为0.9;值太小会导致均值和方差更新太快,太大会导致几乎没有衰减,出现过拟合
  • scale:一般不用设置为False
  • epsilon:为了避免分母为0的情况,给分母加一个极小的值,默认即可。
  • is_tarining:为True代表训练过程,不断更新样本均值和方差。False为测试过程。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值