笔记2:torch搭建VGG网络代码详细解释

VGG网络结构

VGG网络(Visual Geometry Group Network)是一种经典的深度学习卷积神经网络(CNN)架构,由牛津大学的视觉几何组(Visual Geometry Group)在2014年提出。VGG网络在ImageNet挑战赛2014中取得了优异的成绩,因此受到了广泛的关注和应用。本文的结构与常规不同,关于其内部结构详解参考:https://zhuanlan.zhihu.com/p/69281173
在这里插入图片描述

代码详细解释

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: LF
@time: 2024/5/9 10:41 
@file: GetVGGnet.py
@project: pythonProject
@describe: TEXT
@# ------------------------------------------(one)--------------------------------------
@# ------------------------------------------(two)--------------------------------------
"""
import torch.nn as nn
import torch.nn.functional as F
class GetVGGnet(nn.Module): #定义一个继承nn.Module的类# nn.Module是torch中搭建网络的基础类# ------------------------------------------( 初始函数定义网络)--------------------------------------def __int__(self): #网络搭建过程super(GetVGGnet,self).__int__() #对GetVGGnet进行初始化# ------------------------------------------(第一个卷积层:一次卷积操作)--------------------------------------# ------------------------------------------[输入cifar10的数据大小为3*28*28]--------------------------------------self.conv_1 = nn.Sequential(# 上面的nn.Sequential为序列(顺序)容器,搭建网络时会按照里面的顺序进行# in_channels表示输入的通道数或者叫深度,由于cifar10数据集是RGB格式,因此通道数是3# out_channels表示输出的通道数,VGGnet第一次输出的通道数为64,这与网络结构有关# kernel_size表示卷积时的卷积核(卷积窗口)的边长,VGGnet的卷积核大小为3*3# stride表示卷积核移动时的步长,这里默认为1# padding表示图像边缘填充,根据公式28-->28+2=30-->30-3+1= 28,加入之后图像的尺寸不变,此处有个坑,就是网络上说# padding=1是在图像边缘填充了一圈0,所以在这里触发了“SAME”属性(也就是图像输入输出的大小不变)# 这里说一下总结:如果卷积核边长为n,则padding = n//2,此时3奇数卷积的padding = 1,4偶数卷积为2即可保证输入输出不变nn.Conv2d(3,64,kernel_size=3,stride=1,padding=1),# 添加BatchNorm2d进行数据的归一化处理,这使得数据在进行Relu之前不会因为数据过大而导致网络性能的不稳定,64表示特征的数量nn.BatchNorm2d(64),# 激活层(relu函数)也可以采用Sigmoid激活函数,Tanh激活函数,目的是增强对网络的输出的表达能力nn.ReLU())# ------------------------------------------ [上一步输出以及下一步的输入数据大小为batchsize*64*28*28]]--------------------------------------# ------------------------------------------(第一个最大池化层)--------------------------------------# kernel_size表示最大池化时的卷积核大小,每次卷积时取2*2大小窗口中的像素最大值# stride表示最大池化的步长,与卷积时不同,这里的最大池化,每一个卷积核里面的像素不相关self.Max_pooling_1 = nn.MaxPool2d(kernel_size=2,stride=2)# ------------------------------------------ [上一步输出以及下一步的输入数据大小为batchsize*64*14*14]--------------------------------------# ------------------------------------------(第二个卷积层)--------------------------------------self.conv_2_1 = nn.Sequential(# 14-->14+2-->16-3+1 = 14nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(128),nn.ReLU())self.conv_2_2 = nn.Sequential(# 14-->14+2-->16-3+1 = 14nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(128),nn.ReLU())# ------------------------------------------ [上一步输出以及下一步的输入数据大小为batchsize*128*14*14]--------------------------------------# ------------------------------------------(第二个最大池化层)--------------------------------------self.Max_pooling_2 = nn.MaxPool2d(kernel_size=2, stride=2)# ------------------------------------------ [上一步输出以及下一步的输入数据大小为batchsize*128*7*7]--------------------------------------# ------------------------------------------(第三个卷积层)--------------------------------------self.conv_3_1 = nn.Sequential(# 7-->7+2-->9-3+1=7nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(256),nn.ReLU())self.conv_3_2 = nn.Sequential(# 7-->7+2-->9-3+1=7nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(256),nn.ReLU())# ------------------------------------------ [上一步输出以及下一步的输入数据大小为batchsize*256*7*7]--------------------------------------# ------------------------------------------(第三个最大池化层)--------------------------------------# 注意此处的最大池化与前几个不同,因为前一个卷积后的结果长宽是7*7,所以加入padding之后就是8*8,这样最大池化输出为4*4self.Max_pooling_3 = nn.MaxPool2d(kernel_size=2, stride=2,padding=1)# ------------------------------------------ [上一步输出以及下一步的输入数据大小为batchsize*256*4*4]--------------------------------------# ------------------------------------------(第四个卷积层)--------------------------------------self.conv_4_1 = nn.Sequential(# 4-->4+2-->6-3+1=4nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(512),nn.ReLU())self.conv_4_2 = nn.Sequential(# 4-->4+2-->6-3+1=4nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(512),nn.ReLU())# ------------------------------------------ [上一步输出以及下一步的输入数据大小为batchsize*512*4*4]--------------------------------------# ------------------------------------------(第四个最大池化层)--------------------------------------self.Max_pooling_4 = nn.MaxPool2d(kernel_size=2, stride=2)# ------------------------------------------ [上一步输出以及下一步的输入数据大小为batchsize*512*2*2]--------------------------------------# ------------------------------------------(全连接层)--------------------------------------# 在进行全连接之前,需要将输入张量转换转换一下维度:batchsize * 512 * 2 * 2 - --->batchsize * (512 * 4)# 全连接层 in_features表示输入张量大小,out_features表示输出张量大小(你现在做的项目预测输出的种类)self.fc = nn.Linear(in_features=512*4,out_features=10)# ------------------------------------------( 对网络的输出进行处理)--------------------------------------def forward(self, x): #自定义类函数,用于处理张量或者叫网络运行过程out = self.conv_1(x)out = self.Max_pooling_1(out)out = self.conv_2_1(out)out = self.conv_2_2(out)out = self.Max_pooling_2(out)out = self.conv_3_1(out)out = self.conv_3_2(out)out = self.Max_pooling_3(out)out = self.conv_4_1(out)out = self.conv_4_2(out)out = self.Max_pooling_4(out)# 下面的batchsize表示每次迭代需要使用的数据量# x就是我们将图像转换为张量的结果,关于这一步的处理过程,请参考博客(https://blog.csdn.net/qq_55750626/article/details/138585829?spm=1001.2014.3001.5501)# x.size(0) 这一步的意思是先获取tensor张量的大小,第一个值就是我们张量数据的大小,这里直接一次将数据全部喂入网络batchsize = x.size(0)# 将out转换维度,用于fc,注意fc的in_features参数大小为512*4out = out.view(batchsize,-1)# 全连接处理out = self.fc(out)# 直接用torch中的softmax概率分布函数处理,将预测值out(batchsize*10)转化为预测正确类的概率out = F.log_softmax(out,dim=1)return out

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3031964.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

软件开发项目实施方案-精华资料(Word原件)

依据项目建设要求,对平台进行整体规划设计更新维护,对系统运行的安全性、可靠性、易用性以及稳健性进行全新设计,并将所有的应用系统进行部署实施和软件使用培训以及技术支持。 根据施工总进度规划,编制本项目施工进度计划表。依据…

OSPF虚链路

原理概述 通常情况下,一个OSPF网络的每个非骨干区域都必须与骨干区域通过ABR路由器直接连接,非骨干区域之间的通信都需要通过骨干区域进行中转。但在现实中,可能会因为各种条件限制,导致非骨干区域和骨干区域无法直接连接&#x…

在家就可以轻松赚零花钱的副业

互联网的兴起让很多人实现了在家办公的梦想,同时也为人们提供了更多的挣钱方式。以下是4种可以在家中兼职副业赚钱的方法: 1. 写作工作 如果你善于写作,并且有一定的文学素养,那么可以通过自己的博客或其他媒体平台来写作&#…

SMART700西门子触摸屏维修6AV6 648-0CC11-3AX0

西门子工控机触摸屏维修系列型号:PС477,PC677,TD200,TD400,KTP178,TP170A,TP170B,TP177A,TP177B,TP270,TP277,TP27,MP370,MP277,OP27,OP177B等。 触摸屏故障有:上电黑屏, 花屏,暗屏,触摸失灵,按键损坏,电源板,高压板故障,液晶,主板坏等,内容错乱、进不了…

2024.5.6 关于 SpringCloud 的基本认知

目录 引言 微服务框架所包含的技术栈 面试题 微服务架构演变 单体架构 分布式架构 微服务架构 微服务技术对比 认识 SpringCloud SpringBoot 版本兼容关系 服务拆分和远程调用 服务拆分注意事项 远程调用 引入问题 引言 微服务是一种框架风格,按照业务…

解决离线服务器无法加载HuggingFaceEmbeddings向量化模型的问题

由于服务器是离线的,因此我先在本地到huggingface官网下载模型text2vec,然后上传到服务器上运行,报错: (MaxRetryError(HTTPSConnectionPool(host\huggingface.co\, port443): Max retries exceeded with url: /api/models/senten…

Windows 11 Manager (Win11系统优化大师) 中文破姐版 v1.4.3

01 软件介绍 ​Windows 11 Manager v1.4.3是一款综合性的系统优化工具,专为Win11设计。该工具包含超过40种功能,旨在全方位提升操作系统的性能。通过这些工具,用户可以对Windows 11进行深度优化和微调,清除不必要的文件&#xff…

Nginx 从入门到实践(3)——负载均衡、反向代理、动静分离

Nginx代理服务 Nginx代理服务 Nginx代理服务Nginx负载均衡反向代理反向代理的用途 Nginx配置攻略Nginx动静分离使用 Nginx 实现四层代理配置基本介绍使用 Nginx 实现四层代理配置 Nginx负载均衡 负载均衡(Load Balance)是由多台服务器以对称的方式组成一…

uniapp开发微信小程序,选择地理位置uni.chooseLocation

<view click"toCommunity">点击选择位置</view>toCommunity() {const that thisuni.getSetting({success: (res) > {const status res.authSetting// 如果当前设置是&#xff1a;不允许&#xff0c;则需要弹框提醒客户&#xff0c;需要前往设置页面…

【Ubuntu永久授权串口设备读取权限‘/dev/ttyUSB0‘】

Ubuntu永久授权串口设备读取权限 1 问题描述2 解决方案2.1 查看ttyUSB0权限&#xff0c;拥有者是root&#xff0c;所属用户组为dialout2.2 查看dialout用户组成员&#xff0c;如图所示&#xff0c;普通用户y不在dialout组中2.3 将普通用户y加入dialout组中2.4 再次查看dialout用…

Baidu Comate 编程插件:提升开发效率的利器

文章目录 引言简介目的 Baidu Comate插件概述定义与功能市场现状竞品分析 安装与配置VsCode 安装&#xff1a;注意事项 版本选择 核心特性详解功能介绍代码生成实时续写错误纠正 使用体验体验地址 引言 简介 基于文心大模型&#xff0c;结合百度积累多年的编程现场大数据和外…

C++运算符重载(操作符重载)

运算符重载 1. 运算符重载基础1.1 运算符重载语法1.2 运算符重载细节补充1.3 更多的运算符重载 2. 重载单目运算符3. 如何直接输入输出对象类型——重载运算符 << 和 >>3.1 单个对象实现 cou <<3.2 多个对象实现 cout<<3.3 右移运算符 输入 cin >&g…

nginx_01

1.安装 yum install epel-release -y # 安装yum的扩展包 yum install nginx -y systemctl start nginx.service #启动nginx systemctl enable nginx.service # netstat -lntup # 查看端口占用情况 # 可以看到nginx默认占用了80端口 2.nginx配置 # 注意配置文件的语法格式…

Django项目之电商购物商城 -- 修改/删除收货地址/设置默认地址

Django项目之电商购物商城 – 修改/删除收货地址/设置默认地址 修改和删除收货地址依旧实在user应用下进行 , 其思路和新增收货地址非常相似 依旧是更具前端的数据来写 在这里修改和删除地址的URL是相同的 , 所以我们只要设置一个模型类就可以实现这两个功能 一 . 修改地址…

了解 条码工具 Dynamsoft 在条码读取器中的形态运算

在图像处理中&#xff0c;术语形态学是指分析形状以填充小孔、去除噪声、提取轮廓等的一组操作。形态学操作很像空间卷积中的过滤过程。有两个部分在起作用&#xff1a;结构元素和预定义的计算规则。 点击下载Dynamsoft最新版https://www.evget.com/product/3691/download 结…

每天五分钟计算机视觉:使用极大值抑制来寻找最优的目标检测对象

本文重点 在目标检测领域,当模型预测出多个候选框(bounding boxes)时,我们需要一种方法来确定哪些候选框最有可能表示真实的目标。由于模型的不完美性和图像中目标的重叠性,往往会有多个候选框对应于同一个目标。此时,极大值抑制(Non-Maximum Suppression,NMS)技术就…

关于docker network网络

首先,我们来看看Docker默认的网络模式,即docker0网桥。 每当你安装Docker时,它会创建一个名为docker0的虚拟网桥,并设置一个IP地址范围供它进行端口映射等工作。所有Docker容器在创建时,都会自动连接到这个docker0网桥,并分配一个虚拟IP地址。这样,容器与主机之间,以及容器与容…

【JavaEE精炼宝库】多线程1(认识线程 | 创建线程 | Thread 类)

目录 一、认识线程 1.1 线程的概念&#xff1a; 1.2 为什么需要线程&#xff1a; 1.3 面试题.谈谈进程和线程的区别&#xff1a; 1.4 Java的线程和操作系统线程的关系&#xff1a; 二、创建线程 2.1 创建线程的5种写法&#xff1a; 2.1.1 写法1.继承 Thread 类&#xf…

简单的表单初始密码验证的实现

目录 简单示例&#xff1a;表单初始密码验证 1.1准备工作(图1&#xff09; 1.2 index部分 1.3 css部分 1.3.1先把css部分链接到index.html中&#xff0c;注意链接的地址。 1.3.2添加样式 1.4 JS部分 1.4.1 先把js部分链接到index.html中&am…

大华智能物联综合管理平台 fastjson远程代码执行漏洞复现

0x01 产品简介 大华ICC智能物联综合管理平台对技术组件进行模块化和松耦合,将解决方案分层分级,提高面向智慧物联的数据接入与生态合作能力。 0x02 漏洞概述 由于大华智能物联综合管理平台使用了存在漏洞的FastJson组件,未经身份验证的攻击者可利用 /evo-runs/v1.0/auths/…