Convolutional Neural Network
pyTorch 英文官网
pyTorch 教程中文
pyTorch w3cschool
深度学习数据集汇总
常见的 CNN
文档
图像的通道数
灰度图的通道数为1,彩色图的通道为3
CNN 基本结构:
输入层
卷积层:对特征进行提取
池化层:对特征进行压缩
全连接层:和传统神经网络一样,用于分类
注
CNN 的层数 = 卷积层数 + 全连接层数
卷积神经网络和普通神经网络相比,
输入 CNN 的图像为三维图像,即为长、宽、颜色通道数(R、G、B)
CNN 相当于传统神经网络(用于分类)加上了卷积和池化层(对特征的提取和处理)
根据特征进行分类
卷积核(filter)
包含三个参数,长、宽、通道数。其中长宽相等,通道数和输入通道数相等。
卷积过程:
划分图像的区域,用卷积核(filter)扫描区域,卷积得到特征矩阵,三个通道同时进行
卷积核扫描
卷积核与被扫描区域做内积运算,得到一个数值。三个通道相加,再加上 bias 得到最终结果。得到的结果称为特征图(feature map)
多特征图
使用不同卷积核对图片进行扫描得到不同的特征图,特征更丰富。特征图个数称为深度,作为下一层卷积的通道数。提取特征后,各种特征在原图像的位置就没那么重要了。
通道数的确定
第一层通道数为 RGB 三通道,后面卷积层的通道数 = 前一层特征图的总数 = 前一层卷积核个数
CNN 常用参数
输入通道数(in_channels):输入通道数,第一层看输入图片,如果是灰度图则为1,后面的和前一层的 out_channels 一样
输出通道数(out_channels):代表该层用到的卷积核的个数,也代表得到的、传输给下一层的特征图的个数
滑动窗口步长(stride):卷积核每次移动走过的距离。一般设置为1
卷积核尺寸:常用的为 3x3 (不能太大,特征提取不明显)
边缘填充(pad/padding):为了解决区域边缘被扫描的次数较少的问题,在边缘添加一圈 0 ,使得原来的边界不为边界
注:padding = n 意思是在外围加 n 层。若原图 28 x 28,padding = 2,则一条边长度增加 4,尺寸变为 32 x 32
卷积核个数:决定了生成的特征图的数量、下一层的通道数。每个卷积核一定不同
ReLU 激活函数
Dropout:每一层随机丢弃一些神经元防止过拟合
池化层:
对卷积得到的特征进行筛选,筛选出重要的特征。
常用池化方法:
Max Pooling:扫描一定区域,选择区域中的最大值(提取最有用的特征)
网络结构:
卷积(CONV)后面接着 RELU 激活函数,两层该结构,一层池化,重复累加
从池化层进入全连接层前,需要先把三维的数据转化为一维的向量
残差神经网络 Resnet
随着 CNN 层数不断增加,效果不一定会越来越好,是为什么呢?因为某一层可能会效果不好,影响了总体的特征提取效果。Resnet 将其中效果不好的层的权重设置为 0 ,只保留对整体效果有益的层数,从而保证了,层数越多,深度越深,学习效果越好。不过提升程度可能很细微,但是总有提升。
迁移学习
代码
各层输入输出计算
卷积层和池化层计算方法一样,带入公式即可
# 输出图片大小的计算公式为:
inputSize = 28
kernel = 2
stride = 2
padding = 0
outputSize = (inputSize - kernel + 2 * padding) / stride + 1
print(outputSize,'\n')
全连接层计算:
若最后一层输出为 10 x 10 x 20 ,则作为全连接层的输入为 10 x 10 x 20 = 2000