【一起深度学习-----VGG】

VGG

原理图:

为啥要使用VGG块呢?

对于AlexNet网络来说,虽然十分高效了,但是它并没有提供一个通用的模板,方便后续的研究。

故采用了模块化的思想,方便重复使用。

其实对比于AlexNet神经网络来说,VGG网络也只是保留了后边的全连接层,改变前边的卷积层部分,而卷积层部分可视为由一个个不同的卷积层组成的,可以循环添加。所以需要定义一个VGG块。如下:

python 复制代码
import time

import torch
from torch import nn
from d2l import torch as d2l

#vgg块,模块化思想,可用于快速构建深层的VGG网络
def vgg_block(num_convs,in_channels,out_channels):
    # 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))
    #  *layers,称为 "解包",就是说,把laerys列表中的所有层(每一个元素)传递给Sequential
    # 对于元组和列表来说,用 * 来解包。
    # 对于字典来说,用 ** 来解包
    return nn.Sequential(*layers)

设置卷积层中的架构。

python 复制代码
conv_arch = (
    #(卷积层数,输出通道)
    (1,64),(1,128),(2,256),(2,512),(2,512),
)

定义生成VGG神经网络:

python 复制代码
def vgg(conv_arch):
    conv_blks = []
    in_channels = 1 #本案例中使用的是fashion_mninst 属于灰度图
    for (num_convs,out_channels) in conv_arch:
        conv_blks.append(vgg_block(num_convs,in_channels,out_channels)) #循环添加每一个vgg块
        in_channels = out_channels
    return nn.Sequential(
        *conv_blks, #将所有的vgg块解包,形成vgg网络的前部,
        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))

对于全连接层为啥是 out_channels * 7 * 7 呢?观看下图计算过程(草稿字丑)

由于VGG神经网络的计算过大(相比于AlexNet网络来说),将其通道数给调小,实现如下:

python 复制代码
ratio = 4
# conv_arch :(卷积层数,通道数)
small_conv_arch = [(pair[0],pair[1] // ratio) for pair in conv_arch]
net = vgg(small_conv_arch)

终于可以开始训练了!

python 复制代码
lr, num_epochs, batch_size = 0.05, 10, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
time_start = time.time()
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
time_stop = time.time()
print(time_stop-time_start)

差点把电脑干报废,结果如下:

相关推荐
阿里云大数据AI技术13 小时前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
陕西企来客13 小时前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
阿里云大数据AI技术14 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO15 小时前
GEO技术服务选型指南
大数据·人工智能·python
阿里云大数据AI技术15 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架15 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab15 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能
AKAMAI15 小时前
你的源服务器可能是你做出的最昂贵决定
运维·人工智能·云计算
冬奇Lab15 小时前
【无标题】
人工智能·开源
专业贴准16 小时前
苏州SMT供料器设备选型分析:本地主流自动化企业技术特点与行业趋势
人工智能·自动化·制造