7.2 手撕VGG11模型 & 使用Fashion_mnist数据训练VGG

VGG首先引入块的思想将模型通用模板化

VGG模型的特点

与AlexNet,LeNet一样,VGG网络可以分为两部分,第一部分主要由卷积层和汇聚层组成,第二部分由全连接层组成。

VGG有5个卷积块,前两个块包含一个卷积层,后三个块包含两个卷积层。 2 * 1 + 3 * 2 = 8个卷积层和后面3个全连接层,所以它被称为VGG11

AlexNet模型架构与VGG模型架构对比

python 复制代码
import torch
from torch import nn
from d2l import torch as d2l
import time
# 卷积块函数
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))
    '''
        `nn.Sequential(*layers)`中的`*layers`将会展开`layers`列表,将其中的每个层作为单独的参数传递给`nn.Sequential`函数,以便构建一个顺序模型。
    '''
    return nn.Sequential(*layers)
python 复制代码
# 定义卷积块的输入输出
conv_arch = ((1,64),(1,128),(2,256),(2,512),(2,512))
python 复制代码
# VGG有5个卷积块,前两个块包含一个卷积层,后三个块包含两个卷积层。 2 * 1 + 3 * 2 = 8个卷积层和后面3个全连接层,所以它被称为VGG11
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(
        # 5个卷积块部分
        *conv_blks,nn.Flatten(),
        # 3个全连接部分
        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)
    )
python 复制代码
net = vgg(conv_arch)
X = torch.randn(size=(1,1,224,224))
for blk in net:
    X = blk(X)
    print(blk.__class__.__name__,'output shape:\t',X.shape)
python 复制代码
Sequential output shape:	 torch.Size([1, 64, 112, 112])
Sequential output shape:	 torch.Size([1, 128, 56, 56])
Sequential output shape:	 torch.Size([1, 256, 28, 28])
Sequential output shape:	 torch.Size([1, 512, 14, 14])
Sequential output shape:	 torch.Size([1, 512, 7, 7])
Flatten output shape:	 torch.Size([1, 25088])
Linear output shape:	 torch.Size([1, 4096])
ReLU output shape:	 torch.Size([1, 4096])
Dropout output shape:	 torch.Size([1, 4096])
Linear output shape:	 torch.Size([1, 4096])
ReLU output shape:	 torch.Size([1, 4096])
Dropout output shape:	 torch.Size([1, 4096])
Linear output shape:	 torch.Size([1, 10])

为了使用Fashion-MNIST数据集,使用缩小VGG11的通道数的VGG11

python 复制代码
# 由于VGG11比AlexNet计算量更大,所以构建一个通道数校小的网络
ratio = 4
# 样本数pair[0]不变,通道数pair[1]缩小四倍
small_conv_arch = [(pair[0],pair[1] // ratio) for pair in conv_arch]
net = vgg(small_conv_arch)
X = torch.randn(size=(1,1,224,224))
for blk in net:
    X = blk(X)
    print(blk.__class__.__name__,'output shape:\t',X.shape)
python 复制代码
Sequential output shape:	 torch.Size([1, 16, 112, 112])
Sequential output shape:	 torch.Size([1, 32, 56, 56])
Sequential output shape:	 torch.Size([1, 64, 28, 28])
Sequential output shape:	 torch.Size([1, 128, 14, 14])
Sequential output shape:	 torch.Size([1, 128, 7, 7])
Flatten output shape:	 torch.Size([1, 6272])
Linear output shape:	 torch.Size([1, 4096])
ReLU output shape:	 torch.Size([1, 4096])
Dropout output shape:	 torch.Size([1, 4096])
Linear output shape:	 torch.Size([1, 4096])
ReLU output shape:	 torch.Size([1, 4096])
Dropout output shape:	 torch.Size([1, 4096])
Linear output shape:	 torch.Size([1, 10])
python 复制代码
'''开始计时'''
start_time = time.time()
lr,num_epochs,batch_size = 0.05,10,128
train_iter,test_iter = d2l.load_data_fashion_mnist(batch_size,resize=224)
d2l.train_ch6(net,train_iter,test_iter,num_epochs,lr,d2l.try_gpu())
'''时间结束'''
end_time = time.time()
run_time = end_time - start_time
# 将输出的秒数保留两位小数
print(f'{round(run_time,2)}s')
相关推荐
码字的字节7 小时前
深度学习损失函数的设计哲学:从交叉熵到Huber损失的深入探索
深度学习·交叉熵·huber
AntBlack8 小时前
从小不学好 ,影刀 + ddddocr 实现图片验证码认证自动化
后端·python·计算机视觉
凪卄12138 小时前
图像预处理 二
人工智能·python·深度学习·计算机视觉·pycharm
碳酸的唐8 小时前
Inception网络架构:深度学习视觉模型的里程碑
网络·深度学习·架构
AI赋能8 小时前
自动驾驶训练-tub详解
人工智能·深度学习·自动驾驶
seasonsyy8 小时前
1.安装anaconda详细步骤(含安装截图)
python·深度学习·环境配置
deephub8 小时前
AI代理性能提升实战:LangChain+LangGraph内存管理与上下文优化完整指南
人工智能·深度学习·神经网络·langchain·大语言模型·rag
go54631584659 小时前
基于深度学习的食管癌右喉返神经旁淋巴结预测系统研究
图像处理·人工智能·深度学习·神经网络·算法
Blossom.1189 小时前
基于深度学习的图像分类:使用Capsule Networks实现高效分类
人工智能·python·深度学习·神经网络·机器学习·分类·数据挖掘
宇称不守恒4.09 小时前
2025暑期—05神经网络-卷积神经网络
深度学习·神经网络·cnn