• 1. 卷积层与池化层
  • 卷积层:
  • 卷积层的目的是提取输入特征图的特征,卷积核是提取图像中的边缘信息
  • 卷积神经网络中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法最佳化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网路能从低级特征中迭代提取更复杂的特征。
  • 卷积利用卷积核对图像进行独行或者跨行(视情况而定)进行扫描,然后提取出图像特征。卷积操作其功能类似于传统图像处理中的滤波器。
  • 卷积核权值共享:一个卷积层可以有多个不同的卷积核,每一个filter在与输入矩阵进行点积操作的过程中,其权值是固定不变的。
  • 卷积核:
  • 用于提取图片的局部特征,不同的卷积核提取图片特征的效果不同。
  • 感受野:卷积核的大小 / 范围,卷积核所能感知的区域
  • 一个卷积层可以有若干个卷积核,卷积核的通道数=输入图片的通道数,每一个卷积核的通道与图片的对应通道进行点积+累加的操作,可以得到1个featrue map,假设有3个通道,那么可以得到3个featrue map,然后把这3个feature map对应的位置相加,即可得到1张featrue map,得到的这一张就是该卷积核与图片进行卷积操作的feature map。一般图片有3个通道(RGB通道),red、green、blue,然后卷积核的通道数为3,分别对应r、g、b,然后这对应的三个通道分别点积+累加,得到3个feature map,最后再把这3张feature ma相加,然后再加上偏移值b,就可以得到1张feature map。
  • 步幅:
  • 步幅是我们在输入矩阵上滑动滤波器矩阵的像素数。当步幅为1时,我们将过滤器一次移动一个像素。当步幅为2时,过滤器在我们滑动时一次跳跃⒉个像素。更大的步幅将产生更小的特征图。
  • 零填充:
  • 多通道卷积:
  • 多卷积核卷积:
  • 池化层:
  • 对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征,如下:
  • 有多种不同形式的非线性池化函数,一种是Avy Pooling(平均池化),一种是max Pooling(最大池化)。池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。
  • 平均池化:计算图像区域的平均值作为该区域池化后的值。
  • 最大池化:选图像区域的最大值作为该区域池化后的值。
  • 2. 激活函数的作用是什么
  • 如果输入变化很小,导致输出结构发生截然不同的结果,这种情况是我们不希望看到的,为了模拟更细微的变化,输入和输出数值不只是0到1,可以是0和1之间的任何数
  • 激活函数是用来加入非线性因素的,因为线性模型的表达力不够
  • 在神经网络中,对于图像,我们主要采用了卷积的方式来处理,也就是对每个像素点赋予一个权值,这个操作显然就是线性的。但是对于我们样本来说,不一定是线性可分的,为了解决这个问题,我们可以进行线性变化,或者我们引入非线性因素,解决线性模型所不能解决的问题。
  • 选取的激活函数要能保证数据输入与输出也是可微的,运算特征是不断进行循环计算,所以在每代循环过程中,每个神经元的值也是在不断变化的。
  • 3. AI Studio使用CNN实现猫狗分类
  • 运行项目前进行必要包的导入
  • 准备数据
  • train_reader和test_reader
  • 数据集下载
  • CNN网络搭建
  • 在CNN模型中,卷积神经网络能够更好的利用图像的结构信息。下面定义了一个较简单的卷积神经网络。显示了其结构:输入的二维图像,先经过三次卷积层、池化层和Batchnorm,再经过全连接层,最后使用softmax分类作为输出层。
  • (1)网络搭建:
  • 三个池化层到最后全连接输出层
  • (2)定义数据:
  • (3)获取分类器:
  • (4)定义损失函数和准确率:
  • 分类任务使用交叉熵损失函数,定义了一个损失函数之后,还有对它求平均值,因为定义的是一个Batch的损失值。
  • (5)定义优化方法
  • 使用Adam优化算法,指定学习率为0.001
  • 模型训练
  • (1)创建Executor
  • (2) 定义数据映射器
  • DataFeeder 负责将reader(读取器)返回的数据转成一种特殊的数据结构,使它们可以输入到 Executor
  • (3)定义绘制训练过程的损失值和准确率变化趋势的方法draw_train_process
  • (4)训练并保存模型
  • Executor接收传入的program,并根据feed map(输入映射表)和fetch_list(结果获取表) 向program中添加feed operators(数据输入算子)和fetch operators(结果获取算子)。 feed map为该program提供输入数据。fetch_list提供program训练结束后用户预期的变量。
  • 每一个Pass训练结束之后,再使用验证集进行验证,并打印出相应的损失值cost和准确率acc。
  • 模型预测
  • (1) 创建预测用的Executor
  • (2) 图片预处理
  • 首先将图片大小调整为32*32,接着将图像转换成一维向量,最后再对一维向量进行归一化处理。
  • (3) 开始预测
  • 通过fluid.io.load_inference_model,预测器会从params_dirname中读取已经训练好的模型,来对从未遇见过的数据进行预测。