卷积神经网络
二维卷积层
二维互相关计算
1 | from mxnet import autograd, nd |
1 | Outputs: |
二维卷积层
1 | class Conv2D(nn.Block): |
边缘检测
1 | from mxnet import autograd, nd |
1 | Outputs: |
通过数据学习核数组
1 | from mxnet import autograd, nd |
1 | batch 2, loss 4.949 |
互相关运算和卷积运算
- 二者类似。为了得到卷积运算的输出,只需将核数组左右翻转并上下翻转,再与输入数组做互相关运算。
- 深度学习中核数组都是学出来的:卷积层使用互相关运算或卷积运算都不影响模型预测时的输出。
特征图和感受野
- 二维卷积层输出的二维数组可以看作是输入在空间维度(宽和高)上某一级的表征,也叫特征图(feature map)
- 影响元素x的前向计算的所有输入区域(可能大于输入的实际尺寸)叫做x的感受野(receptive field)
- 可以通过更深的卷积神经网络使特征图中单个元素的感受野变得更加广阔,从而捕捉输入上更大尺寸的特征。
练习:自定义互相关计算类的自动求梯度
1 | from mxnet import autograd, nd |
1 | Outputs: |
填充和步幅
1 | from mxnet import nd |
1 | Outputs: |
多输入通道和多输出通道
多输入和多输出通道
1 | from mxnet import nd |
1 | Outputs: |
1×1卷积层
1 | from mxnet import nd |
1 | Outputs: |
池化层
二维最大池化和平均池化
1 | from mxnet import nd |
1 | Output: |
填充和步幅、多通道
1 | from mxnet import nd |
1 | Outputs: |
卷积层和池化层
类型 | 特点 |
---|---|
卷积层 | ①互相关运算 ②对应通道的卷积核与对应的输入互相关运算,结果累加成单通道 ③躲通道输出需要多输出卷积核,1×1卷积可以通过调整网络层之间的通道数控制模型复杂度 ④每个通道的卷积核大小一致(不一致行不行?),参数可不同,需要初始化 |
池化层 | ①最大池化和平均池化 ②对应通道的输入与池化窗口做池化运算,结果不累加,与输入通道数相同 ③每个通道的池化窗口一致,没有参数,也不需要初始化 ④池化步幅默认与窗口大小相同 |
卷积神经网络(LeNet)
名称 | 结构 |
---|---|
LeNet | ①卷积层:通道数6,核大小5,激活函数sigmoid ②最大池化层:窗口大小2,步幅2 ③卷积层:通道数16,核大小5,激活函数sigmoid ④最大池化层:窗口大小2,步幅2 ⑤全连接层:输出个数120,激活函数sigmoid ⑥全连接层:输出个数84,激活函数sigmoid ⑦全连接层:输出个数10 |
1 | import mxnet as mx |
1 | # 各层输出形状: |
1 | Outputs: |
注意:
这里发现一个问题:
获取的数据集mnist_train是(height,width,channel)的形状,LoadData后是(batch_size, channels, height, width),而Dense计算后的是(batch_size,channels*height*width),之前的Softmax回归等的原生实现和简洁实现注意数据的形状转换。
MXNet API中的Conv2D的输入说明Inputs:
data: 4D input tensor with shape (batch_size, in_channels, height, width) when layout is NCHW. For other layouts shape is permuted accordingly.
深度卷积神经网络(AlexNet)
名称 | 结构 |
---|---|
AlexNet | ①卷积层:通道数96,核大小11,步幅4,激活函数ReLU ②最大池化层:窗口大小3,步幅2 ③卷积层:通道数256,核大小5,填充2,激活函数ReLU ④最大池化层:窗口大小3,步幅2 ⑤卷积层:通道数384, 核大小3,填充1,激活函数ReLU ⑥卷积层:通道数384, 核大小3,填充1,激活函数ReLU ⑦卷积层:通道数256,核大小3,填充1,激活函数ReLU ⑧最大池化层:窗口大小3,步幅2 ⑨全连接层:输出个数4096,激活函数ReLU ⑩丢弃层:丢弃概率0.5 ⑪全连接层:输出个数4096,激活函数ReLU ⑫丢弃层:丢弃概率0.5 ⑬全连接层:输出个数10 |
1 | from mxnet import gluon, init, nd, autograd |
1 | # 各输出层形状: |
1 | Outputs: |
使用重复元素的网络(VGG)
名称 | 结构 | 说明 |
---|---|---|
VGG块 | ①连续数个卷积层:channels=num_channels, padding=1,kernel_size=3 ②最大池化层:strides=2, pool_size=2 |
卷积层保持输入的高和宽不变 池化层对其减半 |
VGG网络 | ①VGG块:单卷积层(通道64) ②VGG块:单卷积层(通道128) ③VGG块:双卷积层(通道256) ④VGG块:双卷积层(通道256) ⑤VGG块:双卷积层(通道512) ⑥全输出层:通道4096,激活函数ReLU ⑦丢弃层:丢弃概率0.5 ⑧全输出层:通道4096,激活函数ReLU ⑨丢弃层:丢弃概率0.5 ⑩全输出层:通道10 |
卷积层+全输出层 |
1 | import mxnet as mx |
1 | # 各层输出形状: |
1 | # resize = 224 |
网络中的网络(NiN)
名称 | 结构 | 说明 |
---|---|---|
NiN块 | ①卷积层:num_channels, kernel_size, strides, padding ②1×1卷积层:num_channels, kernel_size=1, activation=’relu’ ③1×1卷积层:num_channels, kernel_size=1, activation=’relu’ |
无 |
NiN网络 | ①NiN块:channels=96, kernel_size=11, strides=4, padding=0 ②最大池化层:pool_size=3, strides=2 ③NiN块:channels=256, kernel_size=5, strides=1, padding=2 ④最大池化层:pool_size=3, strides=2 ⑤NiN块:channels=384, kernel_size=3, strides=1, padding=1 ⑥最大池化层:pool_size=3, strides=2 ⑦丢弃层:丢弃概率0.5 ⑧NiN块:channels=10, kernel_size=3, strides=1, padding=1 ⑨全局平均池化层 ⑩平整层:将四维转成二维,(批量大小,10) |
无 |
1 | import mxnet as mx |
1 | # 各层输出的形状: |
1 | training on gpu(1): |
含并行连结的网络(GoogLeNet)
名称 | 结构 |
---|---|
Inception Block (c1, c2, c3, c4) |
①线路1: 1×1卷积层:channels=c1, kernel_size=1, activation=’relu’ ②线路2: 1×1卷积层:channels=c2[0], kernel_size=1, activation=’relu’ 3×3卷积层:channels=c2[1], kernel_size=3, padding=1, activatio=’relu’ ③线路3: 1×1卷积层:channels=c3[0], kernel_size=1, activation=’relu’ 5×5卷积层:channels=c3[1],kernel_size=5, padding=2, activation=’relu’ ④线路4: 3×3最大池化层:pool_size=3, strides=1. padding=1 1×1卷积层:channels=c4, kernel_size=1, activation=’relu’ |
名称 | 结构 |
---|---|
GoogLeNet | ①Block 1: 7×7卷积层:channels=64, kernel_size=7, strides=2, padding=3, activation=’relu’ 3×3最大池化层:pool_size=3, strides=2, padding=1 ②Block 2: 1×1卷积层:channels=64, kernel_size=1, activation=’relu’ 3×3卷积层:channels=192, kernel_size=3, padding=1, activation=’relu’ 3×3最大池化层:pool_size=3, strides=2, padding=1 ③Block 3: Inception(64, (96, 128), (16, 32), 32) Inception(128, (128, 192), (32, 96), 64) 3×3最大池化层:pool_size=3, strides=2, padding=1 ④Block 4: Inception(192, (96, 208), (16, 48), 64) Inception(160, (112, 224), (24, 64), 64) Inception(128, (128, 256), (24, 64), 64) Inception(112, (144, 288), (32, 64), 64) Inception(256, (160, 320), (32, 128), 128) 3×3最大池化层:pool_size=3, strides=2, padding=1 ⑤Block 5: Inception(256, (160, 320), (32, 128), 128) Inception(384, (192, 384), (48, 128), 128) 全局平均池化层 ⑥全连接层:channels=10 |
1 | from mxnet import gluon, init, nd, autograd |
1 | # 各层输出形状: |
1 | # lr = 0.1 |
批量归一化(Batch Normalization)
类型 | 说明 |
---|---|
数据标准化 | 适用于浅层模型,模型训练时,当每层中参数更新时,靠近输出层的输出较难出现剧烈变化 |
批量归一化 | 适用于深层模型,即使输入数据已做标准化,训练中模型参数的更新依然很容易造成靠近输出层输出的剧烈变化。 模型训练时,利用小批量上的均值和标准差,不断调整神经网络中间输出,从而使整个神经网络在各层的中间输出的数值更稳定 |
原生实现
1 | from mxnet import autograd, gluon, init, nd |
简洁实现
1 | from mxnet import autograd, gluon, init, nd |
残差网络(ResNet)
名称 | 结构 |
---|---|
Residual Block | ①3×3卷积层:channels=num_channels, kernel_size=3, padding=1, strides=strides ②批量归一化层 ③激活函数层 ④3×3卷积层:channels=num_channels, kernel_size=3, padding=1, strides=strides ⑤批量归一化层 ⑥(可选)1×1卷积层:channels=num_channels, kernel_size=1, strides=strides ⑦激活函数层 |
1 | from mxnet import autograd, gluon, init, nd |
1 | # 各层输出形状: |
1 | training on gpu(0): |
稠密连结网络(DenseNet)
1 | from mxnet import autograd, gluon, init, nd |
1 | training on gpu(0) |