AlexNet读取数据集 与VGG-11网络
原始论文AlexNet在ImageNet上进行训练的,但是本书在这里使用的是Fashion-MNIST数据集,即使在现在GPU上,训练ImageNet模型同时使其收敛需要数小时或者数天时间。将AlexNet直接应用于Fashion_MNIST的一个问题是,Fashion-MNIST图像的分辨率低于IMageNet图像,为了解决这个问题,我们将分辨率提高到224像素x224像素,这里需要使用d2l.load_data_fashion_mnist 函数中的resize 参数执行此调整。
batch_size = 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
7.4.1 训练AlexNet
现在AlexNet可以开始被训练了。与6.6节中的LeNet相比,这里的主要变化时使用更低的学习率训练,这是因为网络更深广,图像分辨率更高,训练卷积网络的成本更高。
lr, num_epochs = 0.01, 10
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l_try_gpu())
loss 0.326, train acc 0.881, test acc 0.883
总结:
AlexNet的架构与LeNet相似,但是使用更多的卷积层和更多的参数来拟合大规模的ImageNet数据集
今天,AlexNet 已经被更有效的架构超越,从浅层网络到深层网络的关键一步。
尽管AlexNet代码只比LeNet多几行
暂退法,ReLU和预处理是提升计算机视觉任务性能的其他关键步骤。
7.2 使用块的网络
虽然AlexNet证明深层神经网络桌有成效,没有提供一个通用的模版来指导后续的研究人员设计新的网络,下面几个章节中,将介绍一些常用于设计深层网络的启发式概念。
7.2.1 VGC块
经典卷积神经网络的基本组成部分是下面的这个序列。
1 带填充以保持分辨率的卷积层
2 非线性激活函数,如ReLU
3 汇聚层,如最大汇聚层
而一个VGC块与之类似,由一系列的卷积层组成,后面再加上用于空间降采样的最大汇聚层, 在最初的VGC论文中,使用了带有3x3卷积核,填充为1的卷积层,以及带有2x2汇聚窗口,步骤为2,下面代码中,我们定义一了名为vgg_block的函数来实现一个VGC块。
该函数有3个参数,分别对应于卷积层的数量num_convs, 输入通道的数量in_channels 和输出通道的数量out_channels
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)
7.2.2 VGG网络
与AlexNet ,LeNet一样,VGG网络可以分为两部分,第一部分主要卷积层和汇聚层组成,第二部分由全连接层组成,
VGG神经网络连接图7-3的几个VGG块,其中有超参数变量conv_arch,该变量指定了没哥VGG块中卷积层个数和输出通道,全连接模块则与AlexNet中相同。
原始VGG网络有5个卷积块,其中前2个包含一个卷积层,后3个块包含两个卷积层,第一个块有64个输出通道,后续每个块将输出通道数翻倍,直到输出通道数达到512,由于该网络使用8个卷积层和3个全连接层,因此它通常被称为VGG-11。
conv_arch = ((1,64),(1,128),(2,256),(2,512),(2,512))
下面的代码实现了VGG-11,可以通过在conv_arch上执行for循环来简单实现。
def vgg(conv_arch):
conv_blks=[]
in_channels 1
#卷积层部分
for (num_convs, out_channels) in conv_arch:
conv_bits.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()m nn.Dropout(0.5),
nn.Linear(4096, 10))
)
net = vgg(conv_arch)
vgg网络结构
全连接层 1000
全连接层4096
全连接层4096
接下来,我们将构建一个高度和宽度都为224的单通道数据样本,观察每个层输出的形状。
X = torch.randn(size=(1,1,224,224))
for blk in net:
x = blk(x)
正如代码中看到的,将每个块的高度和宽度减半,最终高度和宽度都为1,最后展平表示,送入全连接层处理。
7.2.3 训练模型
由于VGG11比AlexNet计算更大,构建了一个通道数比较少的网络,足够用于熏硫胺FashionMNIST数据集。
ratio = 4
small_conv_arch = [(pair(0), pair[1]//ratio) for pair in conv_arch]
net = vgg(small_conv_arch)
除了使用略高的学习率,模型训练过程与7.1节中的AlexNet类似。