动手学深度学习(Pytorch版)代码实践 -卷积神经网络-25使用块的网络VGG

embedded/2024/10/20 23:38:43/

25使用块的网络VGG

在这里插入图片描述

import torch
from torch import nn
import liliPytorch as lp
import matplotlib.pyplot as plt# 定义VGG块
# num_convs: 卷积层的数量
# in_channels: 输入通道的数量
# out_channels: 输出通道的数量
def vgg_block(num_convs, in_channels, out_channels):layers = []# 添加num_convs个卷积层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)  # 返回包含所有层的序列# 定义VGG架构
conv_arch = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))  # 每个元组表示(卷积层数量, 输出通道数量)dropout = 0.5  # 定义dropout率
def vgg(conv_arch):conv_blks = []in_channels = 1  # 输入通道数为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.Dropout(dropout),  # dropout层,防止过拟合nn.Linear(4096, 4096),  # 第二个全连接层nn.ReLU(),  # ReLU激活函数nn.Dropout(dropout),  # dropout层nn.Linear(4096, 10)  # 输出层,使用的Fashion-MNIST数据集,10分类)net = vgg(conv_arch)  # 创建VGG网络# 测试网络结构,打印每一层的输出形状
X = torch.randn(size=(1, 1, 224, 224))  # 创建一个随机输入张量
for blk in net:X = blk(X)print(blk.__class__.__name__, 'output shape:\t', X.shape)    
"""
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])
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])
"""# 训练模型
# VGG-11比AlexNet计算量更大,因此我们构建了一个通道数较少的网络,足够用于训练Fashion-MNIST数据集。
ratio = 8  # 缩小通道数的比例
small_conv_arch = [(pair[0], pair[1] // ratio) for pair in conv_arch]  # 缩小后的卷积层结构
net = vgg(small_conv_arch)  # 创建缩小后的VGG网络# 定义训练参数
lr, num_epochs, batch_size = 0.01, 10, 128  # 学习率、训练轮数和批量大小
train_iter, test_iter = lp.loda_data_fashion_mnist(batch_size, resize=224)  # 加载训练和测试数据
lp.train_ch6(net, train_iter, test_iter, num_epochs, lr, lp.try_gpu())  # 训练模型
plt.show()  # 显示绘图# loss 0.346, train acc 0.873, test acc 0.872
# 1733.7 examples/sec on cuda:0

运行结果:
在这里插入图片描述


http://www.ppmy.cn/embedded/51260.html

相关文章

【CSS】cursor属性的作用,怎么使用

cursor属性的作用 cursor属性在CSS中用于定义元素在用户和浏览器交互时所显示的光标样式。它可以改变鼠标光标的外观,以提供更好的用户体验和交互性。通过cursor属性,可以为元素设置不同的光标样式,如箭头、手型、十字、等待、文本输入等。这…

DVWA-XSS(Stored)-beef

用Low Level来测试beef的使用 beef配置 如果kali没有beef的,进行下载 apt install beef-xss使用 beef-xss # 命令方式启动 beef-xss-stop # 命令方式关闭 systemctl start beef-xss.service #开启beefsystemctl stop beef-xss.service #关闭…

【深度学习】sdwebui A1111 加速方案对比,xformers vs Flash Attention 2

文章目录 资料支撑资料结论sdwebui A1111 速度对比测试sdxlxformers 用contorlnet sdxlsdpa(--opt-sdp-no-mem-attention) 用contorlnet sdxlsdpa(--opt-sdp-attention) 用contorlnet sdxl不用xformers或者sdpa ,用contorlnet sdxl不用xformers或者sdpa …

富唯智能复合机器人

复合机器人&产品概述 富唯智能复合机器人集协作机器人、移动机器人和视觉引导技术于一体,搭载ICD系列核心控制器,一体化控制整个复合机器人系统,并且可以对接产线系统,搭配我司自研的2D/3D视觉平台,能够轻松实现工…

Linux下更新curl版本

一、前景 由于低版本的curl存在一定的漏洞,会对我们的服务器安全造成问题,所以,我们需要将curl由低版本安装到高版本。 二、步骤 1、首先检测服务器安装的curl版本 curl --version 2、查看服务器安装的curl的安装包 rpm -qa curl 3、卸载旧…

Java程序之动物声音“模拟器”

题目: 设计一个“动物模拟器”,希望模拟器可以模拟许多动物的叫声和行为,要求如下: 编写接口Animal,该接口有两个抽象方法cry()和getAnimalName(),即要求实现该接口的各种具体的动物类给出自己的叫声和种类…

qmt量化交易策略小白学习笔记第41期【qmt编程之期货数据--如何获取当前主力合约】

qmt编程之获取期货数据 qmt更加详细的教程方法,会持续慢慢梳理。 也可找寻博主的历史文章,搜索关键词查看解决方案 ! 感谢关注,咨询免费开通量化回测与获取实盘权限,欢迎和博主联系! 获取当前主力合约 …

[Qt的学习日常]--窗口

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、窗口的分…