毕设第二周任务总结
Part1:专知课程,卷积神经网络
绪论
CNN的应用
- 基本应用:分类、检索、检测、分割
- 人脸识别及人脸表情识别
- 图像生成、图像风格转化
- 自动驾驶
传统神经网络 VS 卷积神经网络
-
深度学习三部曲:
step1: Neural Network
step2: Cost Function/Loss Function
step3: Optimization -
传统神经网络全连接网络处理图像:
参数太多:权重矩阵的参数太多 -> 过拟合 -
卷积神经网络:
局部关联,参数共享 -
相同之处:
CONV layer:卷积层
RELU layer:RELU激活层
POOL layer:池化层
FC layer:全连接层
基本组成结构
卷积(Convolutional Layer)
实际上个人理解是做了图像变换:y = WX + b(W为filter,X为输入,b为偏置常数)
涉及的基本概念:
input:输入
kernel/filter:卷积核/滤波器
weight:权重
receptive field:感受野
activation map/feature map:特征图
padding:填充
depth/channel:深度
output:输出
stride:步长
- 输出的特征图大小:
(N - F)/stride + 1 (padding = 0)
(N - F + padding * 2)/stride + 1 - 卷积核filter的数量决定输出后特征图的channel
池化(Pooling Layer)
- Pooling:
– 保留了主要特征的同时减少参数和计算量,防止过拟合,提高模型泛化能力
– 一般处于卷积层与卷积层之间,全连接层与全连接层之间 - Pooling的类型:
– Max Pooling:最大值池化
– Average pooling:平均池化
注:具体方法实现见PDF
全连接(Fully Connected Layer)
- 全连接层/FC layer
– 两层之间所有神经元都有权重链接
– 通常全连接层在卷积神经网络尾部
– 全连接层参数量通常最大
卷积神经网络典型结构
AlexNet
- 特点
– 大数据训练:百万计ImageNet图像数据
– 非线性激活函数:ReLU
– 防止过拟合:Dropout(随机失活),Data augmentation(数据增强)
– 双GPU实现(受当时设备技术影响) - 激活函数ReLU
– 解决了梯度消失问题
– 计算速度特别快,只需要判断输入是否大于0
– 收敛速度远快于sigmoid
ZFNet
网络结构和AlexNet相同,将卷积层1中的感受野大小从11X11改为7X7,步长由4改为2,卷积层3,4,5中的filter个数由384,384,256改为512,512,1024
VGG
8 layers(AlexNet) -> 16 - 19(VGG)
GoogleNet
- 特点
– 包含22个带参数的层(考虑pooling层就是27层),独立成块的层共约由100个
– 参数量大概是AlexNet的1/12
– 没有FC层
– 采用多卷积核增加特征多样性(inception模块)
inception V1:
inception V2:(插入1*1卷积核进行降维解决维度过高问题)
inception V3:(进一步对V2的参数量进行降低)
ResNet
ResNet(deep residual learning network, 152 layers)
- 残差的思想:去掉相同的主体部分,从而突出微笑的变化,详细见Part2。
Part2:京东专家结合 pytorch 代码讲解 ResNet
B站链接:PyTorch代码讲解ResNet
原理
CNN可抽象为一个复合函数H(x),但CNN在增加多层时会出现网络退化现象,层较深时难以通过H(x)预测,由残差学习方法,对于F(x)=H(x)-x来说会更好训练一些,所以我们令H(x) = F(x) + x来设计网络结构,如图(恒等映射与Shortcut即:identity Mapping Shortcut):
注:虚线处非恒等映射(结构发生变化)
- 不同网络结构ResNet:
- 由上图可将网络分为5个stage,每个stage由不同的block组成,每个block由不同的conv组成。
- Global Average Pooling层:对整个channel求平均,得到一个值,替代全连接层,参数会更少,防止过拟合
- 50层以上的ResNet与50层以下的ResNet的组成结构的不同:BottleNeck
传统方法(左图)顺序进行,使用BottleNeck(右图)先将256维数据使用一个11的卷积核降维至64维,进行33的卷积,再将维度增至256维,防止参数过多
代码
此处记录代码学习过程中重点部分函数功能(部分与Part3参考对应)
- nn.Conv2d(in_planes, out_planes, kernel_size, stride, padding, bias =False)
- nn.BatchNorm2d
- downsample 下采样
Part3:代码学习
部分函数参考
PyTorch加载数据:各函数讲解
nn.Sequential()参数参考
nn.Conv2d()参数参考
nn.Linear()参数参考
optimizer相关函数总结参考
nn.BatchNorm2d函数参考
疑问
- Part3 使用VGG16对CIFAR10分类部分最后self.classifier = nn.Linear(2048, 10)的2048这个参数有些疑惑,待解决。
- GoogleNet的inception和ResNet的降维思想有些类似。