飞桨学习笔记之卷积神经网络基础

本文详细介绍了卷积神经网络的基础概念,包括卷积计算、填充、步幅、感受野以及多输入通道和批量操作。讨论了飞桨框架中的卷积API参数,如卷积核大小、步幅和填充。此外,还涵盖了池化、ReLU激活函数、批归一化和丢弃法的作用及实现。内容深入浅出,适合深度学习初学者和开发者参考。
摘要由CSDN通过智能技术生成


API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。
卷积核代表了对像素点的空间邻域内某种特征模式的提取。比如,有些卷积核提取物体边缘特征,有些卷积核提取物体拐角处的特征,图像上不同区域共享同一个卷积核。当输入图片大小不一样时,仍然可以使用同一个卷积核进行操作。

1 卷积

1.1 卷积计算

在这里插入图片描述
左边图大小是3×3,表示输入数据是一个维度为3×3的二维数组。一个卷积算子除了上面描述的卷积过程之外,还包括加上偏置项的操作。例如假设偏置为1,则上面卷积计算的结果为:
在这里插入图片描述
卷积核(kernel)也被叫做滤波器(filter),假设卷积核的高和宽分别为 k_h 和 k_w,则将称为 k_h × k_w 卷积,比如3×5卷积,就是指卷积核的高为3, 宽为5。

1.2 填充

卷积输出特征图的尺寸计算方法如下:
在这里插入图片描述
当卷积核尺寸大于1时,输出特征图的尺寸会小于输入图片尺寸。为了避免卷积之后图片尺寸变小,通常会在图片的外围进行填充(padding)。
在这里插入图片描述
填充的大小为1,填充值为0。填充之后,输入图片尺寸从4×4变成了6×6,使用3×3的卷积核,输出图片尺寸为4×4。
卷积核大小通常使用1,3,5,7这样的奇数,如果使用的填充大小为 p_h=(k_h−1)/2,p_w=(k_w−1)/2,则卷积之后图像尺寸不变。

1.3 步幅

当高和宽方向的步幅分别为 s_h 和 s_w 时,输出特征图尺寸的计算公式是:
在这里插入图片描述

1.4 感受野

在这里插入图片描述
当增加卷积神经网络深度的同时,感受野将会增大,输出特征图中的一个像素点将会包含更多的图像语义信息。
在这里插入图片描述

1.5 多输入通道、多输出通道和批量操作

例如:对于彩色图片有 RGB 三个通道,需要处理多输入通道的场景。
多输入通道计算过程:
在这里插入图片描述
假设输入图片的通道数为 Cin。

通常将卷积核的输出通道数叫做卷积核的个数。
多输出通道计算过程:
在这里插入图片描述
批量操作:
在这里插入图片描述

1.6 飞桨卷积API

paddle.fluid.dygraph.Conv2D 常用参数:

  1. num_channels (int) - 输入图像的通道数。
  2. num_fliters (int) - 卷积核的个数,和输出特征图通道数相同。
  3. filter_size(int|tuple) - 卷积核大小,可以是整数,比如3,表示卷积核的高和宽均为3 ;或者是两个整数的list,例如[3,2],表示卷积核的高为3,宽为2。
  4. stride(int|tuple) - 步幅,可以是整数,默认值为1;或者是两个整数的list,例如[3,2],表示垂直滑动步幅为3,水平滑动步幅为2。
  5. padding(int|tuple) - 填充大小,可以是整数,比如1;或者是两个整数的list,例如[2,1],表示竖直边界填充大小为2,水平边界填充大小为1。
  6. act(str)- 应用于输出上的激活函数,如Tanh、Softmax、Sigmoid,Relu等,默认值为None。

权重参数 w 的维度 [num_filters,Cin,filter_size_h,filter_size_w],偏置参数 b 的维度是 [num_filters]。

2 池化

池化是使用某一位置的相邻输出的总体统计特征代替网络在该位置的输出,其好处是当输入数据做出少量平移时,经过池化函数后的大多数输出还能保持不变。
在这里插入图片描述
池化窗口的大小称为池化大小,在卷积神经网络中用的比较多的是窗口大小为2×2,步幅为2的池化,此时输出特征图的尺寸为:
在这里插入图片描述

3 ReLU激活函数

Sigmoid 函数在反向传播过程中,容易造成梯度的衰减。Sigmoid 激活函数定义如下:
在这里插入图片描述
在这里插入图片描述
对 Sigmoid 函数求导数:
在这里插入图片描述
Sigmoid 函数的导数最大值为1/4。前向传播时,y=Sigmoid(x);而在反向传播过程中,x 的梯度等于 y 的梯度乘以 Sigmoid 函数的导数,使得 x 的梯度值最大也不会超过 y 的梯度的1/4。
最开始是将神经网络的参数随机初始化的,x 很有可能取值在数值很大或者很小的区域,这些地方都可能造成 Sigmoid 函数的导数接近于0,导致 x 的梯度接近于0;即使 x 取值在接近于0的地方,经过 Sigmoid 函数反向传播之后,x 的梯度不超过 y 的梯度的1/4,如果有多层网络使用了 Sigmoid 激活函数,则比较靠后的那些层梯度将衰减到非常小的值。
ReLU 激活函数的定义如下:
在这里插入图片描述
在这里插入图片描述
在 x≥0 的地方,ReLU 函数的导数为1,能够将 y 的梯度完整地传递给 x,而不会引起梯度消失。(在神经网络里面,将经过反向传播之后,梯度值衰减到接近于零的现象称作梯度消失现象。)

4 批归一化

批归一化的目的是对神经网络中间层的输出进行标准化处理,使得中间层的输出更加稳定。它的优点:

  1. 使学习快速进行(能够使用较大的学习率)。
  2. 降低模型对初始值的敏感性。
  3. 从一定程度上抑制过拟合。

通常我们会对神经网络的数据进行标准化处理,处理后的样本数据集满足均值为0,方差为1的统计分布,这是因为当输入数据的分布比较固定时,有利于算法的稳定和收敛。对于深度神经网络来说,由于参数是不断更新的,即使输入数据已经做过标准化处理,但是对于比较靠后的那些层,其接收到的输入仍然是剧烈变化的,通常会导致数值不稳定,模型很难收敛。

如果强行限制输出层的分布是标准化的,可能会导致某些特征模式的丢失,所以在标准化之后,Batch Normalization 会紧接着对数据做缩放和平移。

5 丢弃法

丢弃法(Dropout)是深度学习中一种常用的抑制过拟合的方法,其做法是在神经网络学习过程中,随机删除一部分神经元。训练时,随机选出一部分神经元,将其输出设置为0,这些神经元将不对外传递信号。
训练时由于部分神经元被随机丢弃了,输出数据的总大小会变小。比如:计算其 L1 范数会比不使用 Dropout 时变小,但是预测时却没有丢弃神经元,这将导致训练和预测时数据的分布不一样。为了解决这个问题,飞桨支持如下两种方法:

  1. downgrade_in_infer
    训练时以比例 r 随机丢弃一部分神经元,不向后传递它们的信号;预测时向后传递所有神经元的信号,但是将每个神经元上的数值乘以 (1−r)。
  2. upscale_in_train
    训练时以比例 r 随机丢弃一部分神经元,但是将那些被保留的神经元上的数值除以 (1−r);预测时向后传递所有神经元的信号,不做任何处理。

paddle.fluid.dygraph.Dropout API包含的主要参数如下:

  1. p (float32,可选) - 输入单元的丢弃概率,即输入单元设置为0的概率。默认值:0.5,该参数对元素的丢弃概率是针对于每一个元素而言,而不是对所有的元素而言。举例说,假设矩阵内有12个数字,经过概率为0.5的 dropout 未必一定有6个零。
  2. seed (int,可选) - 整型数据,用于创建随机种子。如果该参数设为 None,则使用随机种子。注:如果给定一个整型种子,始终丢弃相同的输出单元。训练过程中勿用固定不变的种子。默认值:None。
  3. is_test(bool) - 标记是否是测试阶段。此标志仅对静态图模式有效。对于动态图模式,请使用 eval() 接口。默认:False。
  4. dropout_implementation(str) - 丢弃法的实现方式,有 ’downgrade_in_infer’ 和 ’upscale_in_train’ 两种,默认是 ’downgrade_in_infer’。(不同框架对于 dropout 的默认处理方式可能不同。)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值