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

news2024/9/28 3:29:43

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 = 14
			nn.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 = 14
			nn.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=7
			nn.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=7
			nn.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*4
		self.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=4
			nn.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=4
			nn.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*4
		out = out.view(batchsize,-1)
		# 全连接处理
		out = self.fc(out)
		# 直接用torch中的softmax概率分布函数处理,将预测值out(batchsize*10)转化为预测正确类的概率
		out = F.log_softmax(out,dim=1)
		return out

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

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

相关文章

Visual Components 3D工厂仿真与物流规划解决方案

Visual Components是新一代的数字化工业仿真软件,涵盖3D工艺仿真、装配仿真、人机协作、物流仿真、机器人仿真、虚拟调试、数字孪生工厂等功能于一体的数字化工业仿真平台。 在智能制造的发展过程中,3D仿真技术已经成为推动产业升级、优化生产流程的重要…

LeetCode 513.找树左下角的值

LeetCode 513.找树左下角的值 1、题目 题目链接:513. 找树左下角的值 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null…

【论文速读】| LLM4FUZZ:利用大语言模型指导智能合约的模糊测试

本次分享论文:LLM4FUZZ: Guided Fuzzing of Smart Contracts with Large Language Models 基本信息 原文作者:Chaofan Shou, Jing Liu, Doudou Lu, Koushik Sen 作者单位:加州大学伯克利分校,加州大学欧文分校,Fuzz…

5.10.1 Pre-Trained Image Processing Transformer

研究了低级计算机视觉任务(例如去噪、超分辨率和去雨)并开发了一种新的预训练模型,即图像处理变压器(IPT)。利用著名的 ImageNet 基准来生成大量损坏的图像对。 IPT 模型是在这些具有多头和多尾的图像上进行训练的。此…

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

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

matlab绘制时间序列图,横坐标轴如何标注为月-日

Excel表格中有类似于如下 年月日对应的数据 导入 matlab中,为数值矩阵;了解该表格中的时间跨度为从2021年1月2日至2021年12月31日,中间没有缺失,绘图代码: % clear; timespan1[20210102 20211231]; datenn1datenum(da…

PDF批量编辑:PDF转HTML批量操作技巧,提升文档格式转换效率

在数字化办公日益普及的今天,PDF(Portable Document Format)作为一种跨平台的文件格式,广泛应用于各种文档的存储和传输。然而,PDF文件的不可编辑性使得在某些情况下,我们需要将其转换为HTML格式以便更好地…

Win10鼠标右键新增软件快速打开项

1、cmd 运行 regedit 2、找到该位置的shell文件夹 3、在shell文件夹下创建需要添加的软件名的文件夹,并修改相关信息 4、新建子文件夹command,并修改相关信息 5、效果

luceda ipkiss教程 70:合并GDS版图

通过代码拼版: 所有代码如下: from si_fab import all as pdk from ipkiss3 import all as i3class Design1(i3.GDSCell):def _default_filename(self):return "Ring_Test.gds"def _default_name(self):return "Design1"class Des…

安卓实现视频录制与显示和翻转摄像头

权限&#xff1a; <!-- 相机权限 --> <uses-featureandroid:name"android.hardware.camera"android:required"false" /> <uses-permission android:name"android.permission.CAMERA" /><!-- 录音权限&#xff08;包括麦克…

融资融券概念和操纵流程,案例解析

融资融券是一种金融工具&#xff0c;它允许投资者在证券市场上进行杠杆交易。简单来说&#xff0c;融资就是借钱买股票&#xff0c;融券就是借股票卖出。这种交易方式可以帮助投资者在短期内获得更高的收益&#xff0c;但同时也伴随着较高的风险。 案例背景&#xff1a; 假设…

云南区块链商户平台:抓包技术自制开票工具(二)

前言 上节我们分析了云南区块链商户平台的登录接口以及数据加密、解密&#xff0c;本节我们将构建一个项目框架&#xff0c;将大致的雏形制作出来 说明 由于我们使用开票软件都是在 云南区块链商户平台上操作&#xff0c;如果再开发电脑端就显得没必要&#xff0c;思考良久&…

百度公关一号位翻车的本质是,“精英主义”已经没有市场了 | 最新快讯

“精英主义”没市场了。 文&#xff5c;商隐社&#xff0c;作者 | 浩然 01 这几天商业圈持续发酵的热点新闻就是百度“公关一号位”璩静的“短视频翻车事件”。 一个名为“我是璩&#xff08;q&#xff09;静”&#xff0c;在自我介绍中标注了“百度副总裁”“公关一号位”“…

如何在Android手机上恢复已删除的视频?

有时&#xff0c;由于不同的原因&#xff0c;可能会发生意外的数据丢失灾难。 那么如何在Android手机内存或没有计算机的情况下恢复已删除的视频呢&#xff1f;本文将给你一个答案。 如何在Android上恢复已删除的视频&#xff1f; 不要惊慌&#xff01;您可以在Android手机上恢…

苹果M4芯片:推动AI时代的革新力量

随着科技的飞速发展&#xff0c;苹果公司一直以其创新精神引领着行业潮流。其中&#xff0c;M4芯片的推出无疑是苹果在人工智能领域迈出的重要一步。这款专为机器学习和AI计算而设计的芯片&#xff0c;不仅在新款iPad Pro等消费电子产品上亮相&#xff0c;更是预示着苹果即将开…

机器学习(四) ----------逻辑回归

目录 1 概述 2 极大似然估计 3 逻辑回归核心思想 3.1 对数似然损失&#xff08;Log-likelihood Loss&#xff09; 4 分类问题的评估方法 4.1 混淆矩阵&#xff08;Confusion Matrix&#xff09;&#xff1a; 4.2 准确率&#xff08;Accuracy&#xff09; 4.3 精确率&…

文本三剑客grep与正则表达式、元字符

正则表达式 正则表达式又称为正规表达式、常规表达式、在代码中常简写为regex、regex或RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串&#xff0c;简单来说&#xff0c;是一种匹配字符串的方法&#xff0c;通过一些特殊符号&#xff0c;实现快速查…

AcwingWeb应用课学习笔记

VSCode自动格式化 选中Format On Save不起作用 在设置中搜索default formatter&#xff0c;修改成Prettier-Code formatter meta标签 HTML 元素表示那些不能由其它 HTML 元相关&#xff08;meta-related&#xff09;元素&#xff08;(、,

全套停车场管理系统报价多少钱?停车场管理系统由哪些设备组成?

随着城市化进程的加快&#xff0c;汽车保有量的不断攀升&#xff0c;停车场的管理和运营成为城市基础设施建设的重要组成部分。一个高效、智能的停车场收费系统不仅能提升停车效率&#xff0c;还能增强用户体验&#xff0c;对城市的交通管理起到关键作用。本文将为您详细介绍全…

Linux NFS共享目录配置漏洞

Linux NFS共享目录配置漏洞 一、实验目的二、实验原理三、复现准备四、漏洞复现4.1、复现前提4.2、正式复现 一、实验目的 利用 NFS共享目录配置漏洞读取目标主机的 /etc/passwd 文件内容NFS 服务配置漏洞&#xff0c;赋予了根目录远程可写权限&#xff0c;导致 /root/.ssh/au…