当前位置: 首页 > news >正文

VGG使用块的网络

VGG使用块的网络

一.手写VGG架构

import torch
from torch import nn
import d2l
#1.VGG块
def VGG_block(nums_conv,in_chanels,out_chanels):#卷积层数,输入通道数,输出通道数layers=[]#一个VGG里面的层for i in range(nums_conv):layers.append(nn.Conv2d(in_chanels,out_chanels,3,padding=1))layers.append(nn.ReLU())in_chanels=out_chanels#下一层输入等于本层输出layers.append(nn.MaxPool2d(kernel_size=2,stride=2))return nn.Sequential(*layers)
#VGG网络由多个VGG块组成
def VGG_net(conv_info):#传入有关每一个块的卷积情况conv_blocks=[]in_chanels=1#默认输入通道初始是1for (nums_conv,out_chanels) in conv_info:conv_blocks.append(VGG_block(nums_conv,in_chanels,out_chanels))in_chanels=out_chanels#下一层输入等于本层输出return nn.Sequential(*conv_blocks,nn.Flatten(),nn.Linear(7*7*out_chanels,4096),nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(4096,4096),nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(4096,10))
conv_info=((1,64),(1,128),(2,256),(2,512),(2,512))
net=VGG_net(conv_info)
X=torch.randn((1,1,224,224))
for layer in net:X=layer(X)print(layer.__class__.__name__,X.shape)

分析代码:

VGG网络架构,由多个VGG块以及3个全连接层组成

每个VGG块可以不同,VGG块由多个3*3padding=1的卷积层和一个2*2stride=2的最大池化层组成

(1)VGG块

def VGG_block(nums_conv,in_chanels,out_chanels):#卷积层数,输入通道数,输出通道数layers=[]#一个VGG里面的层for i in range(nums_conv):layers.append(nn.Conv2d(in_chanels,out_chanels,3,padding=1))layers.append(nn.ReLU())in_chanels=out_chanels#下一层输入等于本层输出layers.append(nn.MaxPool2d(kernel_size=2,stride=2))return nn.Sequential(*layers)

 (2)VGG网络

def VGG_net(conv_info):#传入有关每一个块的卷积情况conv_blocks=[]in_chanels=1#默认输入通道初始是1for (nums_conv,out_chanels) in conv_info:conv_blocks.append(VGG_block(nums_conv,in_chanels,out_chanels))in_chanels=out_chanels#下一层输入等于本层输出return nn.Sequential(#这一部分和AlexNet一样,三层全连接层*conv_blocks,nn.Flatten(),nn.Linear(7*7*out_chanels,4096),nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(4096,4096),nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(4096,10))

二.训练VGG网络 

import torch
from torch import nn
from d2l import torch as d2l
#1.VGG块
def VGG_block(nums_conv,in_chanels,out_chanels):#卷积层数,输入通道数,输出通道数layers=[]#一个VGG里面的层for i in range(nums_conv):layers.append(nn.Conv2d(in_chanels,out_chanels,3,padding=1))layers.append(nn.ReLU())in_chanels=out_chanels#下一层输入等于本层输出layers.append(nn.MaxPool2d(kernel_size=2,stride=2))return nn.Sequential(*layers)#VGG网络由多个VGG块组成
def VGG_net(conv_info):#传入有关每一个块的卷积情况conv_blocks=[]in_chanels=1#默认输入通道初始是1for (nums_conv,out_chanels) in conv_info:conv_blocks.append(VGG_block(nums_conv,in_chanels,out_chanels))in_chanels=out_chanels#下一层输入等于本层输出nn.Flatten()return nn.Sequential(*conv_blocks,nn.Flatten(),nn.Linear(7*7*out_chanels,4096),nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(4096,4096),nn.ReLU(),nn.Dropout(p=0.5),nn.Linear(4096,10))
conv_info=((1,64),(1,128),(2,256),(2,512),(2,512))
#因为这个VGG网络层数太多运行太慢,所以把输出通道除4
ratio=4
smallconv_info=[(pair[0],pair[1]//ratio) for pair in conv_info]
net=VGG_net(smallconv_info)
batch_size=128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size=batch_size,resize=224)#数据集
lr=0.05
nums_epochs=10
d2l.train_ch6(net,train_iter,test_iter,nums_epochs,lr,d2l.try_gpu())

 

http://www.gsyq.cn/news/22528.html

相关文章:

  • 使用SpringBoot + Thymeleaf + MyBatisPlus实现一个简单的书籍管理系统
  • 创业思路
  • P2605 [ZJOI2010] 基站选址
  • kafka连接认证
  • CF622D 题解
  • vue学习的总结
  • 【28】C# WinForm入门到精通 ——多文档窗体MDI【属性、强大的方法、实例、源码】【多窗口重叠、水平平铺、垂直平铺、窗体传值】
  • 第五周预习
  • 2025 非标门/铸铝门/别墅大门厂家推荐榜:聚焦品质与服务的实力之选
  • 工业数字化未来:IT与OT融合实践
  • 阅读《记录一类分治方法》笔记
  • CF2140E2
  • 实验指导-基于阿里云Serverless应用引l擎SAE的服务部署迀移 - 详解
  • 夜莺监控设计思考(二)边缘机房架构思考
  • 德州东站换乘攻略(仅供参考)
  • Date 2025.10.6
  • macOS 双开/多开微信WeChat完整教程(支持 4.X 及以上版本) - 实践
  • 初识pytorch:更新网络参数的反向传播、损失函数和优化器
  • Composition API 与 React Hook 很像,区别是什么?
  • cc
  • 普源精电RIGOL DS2202A示波器保存波形到CSV文件过慢解决方法:保存为WFM格式、通过LAN接口使用SCPI+PyVISA控制
  • 动手学深度学习——引言
  • CF1989E Distance to Different
  • 给档案装上“智慧大脑”:文档抽取技术的四大赋能场景
  • P11816QOJ1250 Pionki 轮廓线DP
  • Bug——PaddleX人脸识别报错:Process finished with exit code -1073741819 (0xC0000005) - 教程
  • linux系统scatter/gather I/O技术
  • Joeys shell
  • 软件工程学习日志2025.10.16
  • Apifox 9 月更新| AI 生成接口测试用例、在线文档调试能力全面升级、内置更多 HTTP 状态码、支持将目录转换为模块 - 实践