AlexNet,VGG,NiN,GoogleNet,批量归一化
学着学着突然发现,数据分析numpy,matplotlib,pandas这一部分内容没学完,还有pytorch的一些代码没有学完,所以在看像AlexNet这一些代码实现的时候,很多都看不懂,也得慢慢的补上来了hhh。
这一周花了一些时间学习了数据分析的一些内容,然后继续学习深度学习。
AlexNet
AlexNet比LeNet复杂一点,先是11*11的卷积层,然后是一个最大池化层,再是5*5的卷积层,然后又是一个最大池化层,接下来是3个卷积层,一个最大池化层,最后是三个全连接层。
import torch
from torch import nn
from d2l import torch as d2l
net = nn.Sequential(
nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Flatten(),
nn.Linear(6400, 4096), nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(4096, 4096), nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(4096, 10))
ALexNet相比于LeNet来说是更大更深的一种网络,新进入了丢弃法,ReLU,最大池化层和数据增强。
VGG
VGG使用可重复使用的卷积块来构建深度卷积神经网络。
VGG网络可以分为2部分,第一部分主要由卷积层和汇聚层组成,第二部分由全连接层组成。
VGG-11:第一个模块有64个输出通道,每个后续模块将输出通道数量翻倍,直到该数字达到512。8个卷积层,3个全连接层。
import torch
from torch import nn
from d2l import torch as d2l
# 卷积层的数量和输出通道的数量
def vgg_block(num_convs, in_channels, out_channels):
layers = []
for _ in range(num_convs):
layers.append(nn.Conv2d(in_channels, out_channels,kernel_size=3, padding=1))
layers.append(nn.ReLU())
in_channels = out_channels
layers.append(nn.MaxPool2d(kernel_size=2,stride=2))
return nn.Sequential(*layers)
conv_arch = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))
def vgg(conv_arch):
conv_blks = []
in_channels = 1
# 卷积层部分
for (num_convs, out_channels) in conv_arch:
conv_blks.append(vgg_block(num_convs, in_channels, out_channels))
in_channels = out_channels
return nn.Sequential(
*conv_blks, nn.Flatten(),
# 全连接层部分
nn.Linear(out_channels * 7 * 7, 4096), nn.ReLU(), nn.Dropout(0.5),
nn.Linear(4096, 4096), nn.ReLU(), nn.Dropout(0.5),
nn.Linear(4096, 10))
net = vgg(conv_arch)
NiN、GoogleNet
NiN块:一个卷积层后跟两个全连接层,步幅为1,无填充,输出形状跟卷积层输出一样,起到全连接层的作用
NiN架构:无全连接层,交替使用NiN块和步幅为2的最大池化层,逐步减小高度和增大通道数,最后使用全局平均池化层得到输出,输入通道数是类别数。
NiN块使用卷积层加两个1*1卷积层,NiN使用全局平均池化层来替代VGG和AlexNet中的全连接层,不容易过拟合,参数更少。
GoogleNet:Inception块用4条有不同超参数的卷积层和池化层的路来抽取不同的信息,它的模型参数小,计算复杂度低,GoogleNet有9个Inception块,是第一个达到上百层的网络。
批量归一化
两个元素:可学习的参数γ和β
作用在全连接层和卷积层输出上,激活函数之前,或者全连接层和卷积层输入上。对于全连接层,作用在特征维,对于卷积层,作用在通道维。
批量归一化固定小批量中的均值和方差,然后学习出合适的偏移和缩放,可以加快收敛速度,一般不改变模型精度。