当前位置: 首页 > 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.hskmm.com/?act=detail&tid=32581

相关文章:

  • 使用SpringBoot + Thymeleaf + MyBatisPlus实现一个简单的书籍管理系统
  • Linux 基础
  • P2605 [ZJOI2010] 基站选址
  • NVIDIA Jetson AGX Xavier刷机教程
  • 洛谷p1462-通往奥格瑞码道路
  • 详细介绍:VR 太阳光参数与快速渲染
  • 位运算中没用的小技巧
  • 第六周
  • 超越基础:SightAI 智能路由与多模型选择实战 - sight
  • [Vulhub靶机]JARBAS靶机渗透
  • 10月16号
  • CF622D 题解
  • vue学习的总结
  • 最小二乘问题详解5:非线性最小二乘求解实例
  • AlexNet
  • 【28】C# WinForm入门到精通 ——多文档窗体MDI【属性、强大的方法、实例、源码】【多窗口重叠、水平平铺、垂直平铺、窗体传值】
  • 第五周预习
  • 2025 非标门/铸铝门/别墅大门厂家推荐榜:聚焦品质与服务的实力之选
  • 工业数字化未来:IT与OT融合实践
  • AI安全新威胁:提示注入与模型中毒攻击深度解析
  • 神经网络入门研读报告
  • 阅读《记录一类分治方法》笔记
  • CF2140E2
  • Codeforces 380E Sereja and Dividing 题解 [ 紫 ] [ 线段树 ] [ 贪心 ] [ 数学 ]
  • JPA教程
  • 夜莺监控设计思考(二)边缘机房架构思考
  • 搜维尔科技:具有人手级别抓握和操纵能力的灵巧手
  • v-model 的实现原理
  • 防塔游戏单机 王国保卫战全集下载 1~5部全系列MOD DLC修改版 安卓+ios+PC电脑版
  • 德州东站换乘攻略(仅供参考)