pytorch实现经典神经网络:VGG16模型之初探

文章链接
https://blog.csdn.net/weixin_44791964/article/details/102585038?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169675238616800211588158%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=169675238616800211588158&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-2-102585038-null-null.nonecase&utm_term=VGG&spm=1018.2226.3001.4450

VGG16原理链接
https://zhuanlan.zhihu.com/p/460777014

代码参考:
https://blog.csdn.net/m0_50127633/article/details/117045008?ops_request_misc=&request_id=&biz_id=102&utm_term=pytorch%20vgg16&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-117045008.142v95insert_down28v1&spm=1018.2226.3001.4187

https://blog.csdn.net/weixin_46676835/article/details/128730174?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169681442316800215096882%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=169681442316800215096882&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-5-128730174-null-null.142v95insert_down28v1&utm_term=pytorch%20vgg16&spm=1018.2226.3001.4187
在这里插入图片描述
在这里插入图片描述

分解一下:
卷积提取特征,池化压缩。
1、一张原始图片被resize到(224,224,3)。
2、conv1两次[3,3]卷积网络,输出的特征层为64,输出为(224,224,64),再2X2最大池化,输出net为(112,112,64)。

注意 池化不会改变通道数

在这里插入图片描述
根据公式第一步取stride=1,padding=1
在这里插入图片描述
stride=2 padding=0(不用写)

 nn.Conv2d(3,64,3,1,1),nn.Conv2d(64,64,3,1,1)nn.Conv2d(3,64,3,1,1),nn.Conv2d(64,64,3,1,1),nn.MaxPool2d(2,2)

3、conv2两次[3,3]卷积网络,第一次输入的特征层为64,输出net为(112,112,128),再2X2最大池化,输出net为(56,56,128)。

  nn.Conv2d(64,128,3,1,1),nn.Conv2d(128, 128, 3, 1, 1),nn.MaxPool2d(2,2)

4、conv3三次[3,3]卷积网络,输入的特征层为256,输出net为(56,56,256),再2X2最大池化,输出net为(28,28,256)。

 nn.Conv2d(128,256,3,1,1),nn.Conv2d(256,256,3,1,1),nn.Conv2d(256,256,3,1,1),nn.MaxPool2d(2,2)

5、conv3三次[3,3]卷积网络,输入的特征层为256,输出net为(28,28,512),再2X2最大池化,输出net为(14,14,512)。

nn.Conv2d(256,512,3,1,1),nn.Conv2d(512,512,3,1,1),nn.Conv2d(512,512,3,1,1),nn.MaxPool2d(2,2),

6、conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(14,14,512),再2X2最大池化,输出net为(7,7,512)。

 nn.Conv2d(512,512,3,1,1),nn.Conv2d(512,512,3,1,1),nn.Conv2d(512,512,3,1,1),nn.MaxPool2d(2,2)

7、利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,4096)。共进行两次。

 nn.Linear(25088,4096), #7×7×512nn.Linear(4096,4096),nn.Linear(4096,1000)

8、利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,1000)。
最后输出的就是每个类的预测。

  nn.Linear(4096,1000)

初步代码框架如下:

import torch
from torch import nnclass VGG(nn.Module):def __init__(self):super(VGG, self).__init__()self.MyVgg=nn.Sequential(nn.Conv2d(3,64,3,1,1),nn.Conv2d(64,64,3,1,1),nn.MaxPool2d(2,2),nn.Conv2d(64,128,3,1,1),nn.Conv2d(128, 128, 3, 1, 1),nn.MaxPool2d(2,2),nn.Conv2d(128,256,3,1,1),nn.Conv2d(256,256,3,1,1),nn.Conv2d(256,256,3,1,1),nn.MaxPool2d(2,2),nn.Conv2d(256,512,3,1,1),nn.Conv2d(512,512,3,1,1),nn.Conv2d(512,512,3,1,1),nn.MaxPool2d(2,2),nn.Conv2d(512,512,3,1,1),nn.Conv2d(512,512,3,1,1),nn.Conv2d(512,512,3,1,1),nn.MaxPool2d(2,2),nn.Linear(25088,4096), #7×7×512nn.Linear(4096,4096),nn.Linear(4096,1000))

补充与完善

1、记得进行数据拉平:
在这里插入图片描述
模型部分

class VGG(nn.Module):def __init__(self):super(VGG, self).__init__()self.MyVgg=nn.Sequential(nn.Conv2d(3,64,3,1,1),nn.Conv2d(64,64,3,1,1),nn.MaxPool2d(2,2),nn.Conv2d(64,128,3,1,1),nn.Conv2d(128, 128, 3, 1, 1),nn.MaxPool2d(2,2),nn.Conv2d(128,256,3,1,1),nn.Conv2d(256,256,3,1,1),nn.Conv2d(256,256,3,1,1),nn.MaxPool2d(2,2),nn.Conv2d(256,512,3,1,1),nn.Conv2d(512,512,3,1,1),nn.Conv2d(512,512,3,1,1),nn.MaxPool2d(2,2),nn.Conv2d(512,512,3,1,1),nn.Conv2d(512,512,3,1,1),nn.Conv2d(512,512,3,1,1),nn.MaxPool2d(2,2),nn.Flatten(),nn.Linear(25088,4096), #7×7×512nn.Linear(4096,4096),nn.Linear(4096,1000))def forward(self,x):x=self.MyVgg(x)return x

2、导入数据
使用cifar10数据集

import torch
from torch import nn
import torchvision
from torch.utils.data import DataLoaderdatasets_train=torchvision.datasets.CIFAR10("./data",train=True,download=True,transform=torchvision.transforms.ToTensor())
datasets_test=torchvision.datasets.CIFAR10("./data",train=False,download=True,transform=torchvision.transforms.ToTensor())
dataloader_train=DataLoader(datasets_train,batch_size=64)
dataloader_test=DataLoader(datasets_test,batch_size=64)

3、创建损失函数
使用交叉熵CrossEntropyLoss

from torch import nn
los_fun=nn.CrossEntropyLoss()

4、创建优化器:

learning_rate=0.001
optimizer=torch.optim.SGD(fenlei.parameters(),lr=learning_rate)

5、编写训练代码:

total_train_step=0
tatal_test_step=0
epoch=10for i in range(epoch):print("--------第{}轮训练开始-----".format(i+1))for data in dataloader_train:imgs,targets=dataoutputs=fenlei(imgs)loss=los_fun(outputs,targets)optimizer.zero_grad()loss.backward()total_train_step=total_train_step+1print("训练次数:{},Loss:{}".format(total_train_step, loss))

训练时报错:
在这里插入图片描述
原因我们假设输入的是224×224×3了
然而cfar10的数据集是32×32×3

所以我们需要加入resize操作:

from torchvision import transforms
datasets_train=torchvision.datasets.CIFAR10("./data",train=True,download=True,transform=transforms.Compose([transforms.ToTensor(),transforms.Resize([224,224])])       )

6、使用GPU训练:

#定义训练设备
device=torch.device('cuda'if torch.cuda.is_available()else 'cpu')
fenlei.to(device)
los_fun=los_fun.to(device)

我的

import torch
from torch import nn
import torchvision
from torch.utils.data import DataLoader
from torchvision import transforms
datasets_train=torchvision.datasets.CIFAR10("./data",train=True,download=True,transform=transforms.Compose([transforms.ToTensor(),transforms.Resize([224,224])])       )
datasets_test=torchvision.datasets.CIFAR10("./data",train=False,download=True,transform=torchvision.transforms.ToTensor())
dataloader_train=DataLoader(datasets_train,batch_size=24,drop_last=True)
dataloader_test=DataLoader(datasets_test,batch_size=64,drop_last=True)img,target=datasets_train[0]
print(img.shape)class VGG(nn.Module):def __init__(self):super(VGG, self).__init__()self.MyVgg=nn.Sequential(nn.Conv2d(3,64,3,1,1),nn.Conv2d(64,64,3,1,1),nn.MaxPool2d(2,2),nn.Conv2d(64,128,3,1,1),nn.Conv2d(128, 128, 3, 1, 1),nn.MaxPool2d(2,2),nn.Conv2d(128,256,3,1,1),nn.Conv2d(256,256,3,1,1),nn.Conv2d(256,256,3,1,1),nn.MaxPool2d(2,2),nn.Conv2d(256,512,3,1,1),nn.Conv2d(512,512,3,1,1),nn.Conv2d(512,512,3,1,1),nn.MaxPool2d(2,2),nn.Conv2d(512,512,3,1,1),nn.Conv2d(512,512,3,1,1),nn.Conv2d(512,512,3,1,1),nn.MaxPool2d(2,2),nn.Flatten(),nn.Linear(25088,4096), #7×7×512nn.Linear(4096,4096),nn.Linear(4096,1000))def forward(self,x):x=self.MyVgg(x)return xfenlei=VGG()from torch import nn
los_fun=nn.CrossEntropyLoss()learning_rate=0.001
optimizer=torch.optim.SGD(fenlei.parameters(),lr=learning_rate)total_train_step=0
tatal_test_step=0
epoch=10#定义训练设备
device=torch.device('cuda'if torch.cuda.is_available()else 'cpu')
fenlei.to(device)
los_fun=los_fun.to(device)for i in range(epoch):print("--------第{}轮训练开始-----".format(i+1))for data in dataloader_train:imgs,targets=dataimgs=imgs.to(device)targets=targets.to(device)outputs = fenlei(imgs)loss=los_fun(outputs,targets)optimizer.zero_grad()loss.backward()total_train_step=total_train_step+1if total_train_step%10==0:print("训练次数:{},Loss:{}".format(total_train_step, loss))

为啥人家的代码训练这么快?

在这里插入图片描述

在PyTorch中,nn.Dropout和nn.ReLU是常用的神经网络模块,分别用于正则化和激活函数。
nn.Dropout是一种正则化技术,旨在减少神经网络的过拟合问题。过拟合是指模型在训练集上表现很好,但在测试集上表现较差的现象。Dropout通过在训练过程中随机将一定比例的神经元置为0,以强制网络学习到冗余特征,从而提高模型的泛化能力。这可以防止过拟合,并提高网络的鲁棒性。
nn.ReLU是一种常用的激活函数,它被广泛应用在神经网络中。ReLU的全称是Rectified Linear Unit,它的定义很简单:对于输入x,当x小于0时,输出为0;当x大于等于0时,输出为x。ReLU函数的优点是计算简单、非线性、减轻梯度消失等。
在神经网络中,ReLU函数能够引入非线性,增加模型的拟合能力,并且减少梯度消失问题。当输入为负时,ReLU将输出为0,这有助于稀疏表示,从而使得网络更加有效地学习特征。
综上所述,nn.Dropout用于减少过拟合,提高泛化能力,而nn.ReLU用于引入非线性和解决梯度消失问题。它们在神经网络中的应用非常常见,并且经过广泛验证的有效技术。

明天看录播有助于理解他的代码:

import torch
import torchvision
import torchvision.transforms as transforms
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plttransform_train = transforms.Compose([transforms.Pad(4),transforms.ToTensor(),transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),transforms.RandomHorizontalFlip(),transforms.RandomGrayscale(),transforms.RandomCrop(32, padding=4),])transform_test = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))]
)device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform_train)
trainLoader = torch.utils.data.DataLoader(trainset, batch_size=24, shuffle=True)testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform_test)
testLoader = torch.utils.data.DataLoader(testset, batch_size=24, shuffle=False)vgg = [96, 96, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M']class VGG(nn.Module):def __init__(self, vgg):super(VGG, self).__init__()self.features = self._make_layers(vgg)self.dense = nn.Sequential(nn.Linear(512, 4096),nn.ReLU(inplace=True),nn.Dropout(0.4),nn.Linear(4096, 4096),nn.ReLU(inplace=True),nn.Dropout(0.4),)self.classifier = nn.Linear(4096, 10)def forward(self, x):out = self.features(x)out = out.view(out.size(0), -1)out = self.dense(out)out = self.classifier(out)return outdef _make_layers(self, vgg):layers = []in_channels = 3for x in vgg:if x == 'M':layers += [nn.MaxPool2d(kernel_size=2, stride=2)]else:layers += [nn.Conv2d(in_channels, x, kernel_size=3, padding=1),nn.BatchNorm2d(x),nn.ReLU(inplace=True)]in_channels = xlayers += [nn.AvgPool2d(kernel_size=1, stride=1)]return nn.Sequential(*layers)model = VGG(vgg)
# model.load_state_dict(torch.load('CIFAR-model/VGG16.pth'))
optimizer = optim.SGD(model.parameters(), lr=0.01, weight_decay=5e-3)
loss_func = nn.CrossEntropyLoss()
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.4, last_epoch=-1)total_times = 40
total = 0
accuracy_rate = []def test():model.eval()correct = 0  # 预测正确的图片数total = 0  # 总共的图片数with torch.no_grad():for data in testLoader:images, labels = dataimages = images.to(device)outputs = model(images).to(device)outputs = outputs.cpu()outputarr = outputs.numpy()_, predicted = torch.max(outputs, 1)total += labels.size(0)correct += (predicted == labels).sum()accuracy = 100 * correct / totalaccuracy_rate.append(accuracy)print(f'准确率为:{accuracy}%'.format(accuracy))for epoch in range(total_times):model.train()model.to(device)running_loss = 0.0total_correct = 0total_trainset = 0for i, (data, labels) in enumerate(trainLoader, 0):data = data.to(device)outputs = model(data).to(device)labels = labels.to(device)loss = loss_func(outputs, labels).to(device)optimizer.zero_grad()loss.backward()optimizer.step()running_loss += loss.item()_, pred = outputs.max(1)correct = (pred == labels).sum().item()total_correct += correcttotal_trainset += data.shape[0]if i % 1000 == 0 and i > 0:print(f"正在进行第{i}次训练, running_loss={running_loss}".format(i, running_loss))running_loss = 0.0test()scheduler.step()# torch.save(model.state_dict(), 'CIFAR-model/VGG16.pth')
accuracy_rate = np.array(accuracy_rate)
times = np.linspace(1, total_times, total_times)
plt.xlabel('times')
plt.ylabel('accuracy rate')
plt.plot(times, accuracy_rate)
plt.show()print(accuracy_rate)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java+SpringBoot+Vue企业OA管理系统的设计与实现 前后端分离【Java毕业设计·文档报告·代码讲解·安装调试】

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

乐鑫 ESP-Mesh-Lite在windows下的开发环境搭建(二)

上一篇文章的只能在例程文件夹内进行编译,一旦将示例程序复制到其他文件夹,清理后再编译时会出现编译错误。今天发现了一种的开发环境部署方法,实际上esp-mesh-lite文件夹里就有介绍,只是我还不熟悉IDF的操作,到今天才…

第二证券:华为全液冷超充上线,高压快充概念爆发,双杰电气等涨停

受华为全液冷超充上线消息提振,高压快充概念9日盘中强势拉升,到发稿,双杰电气、永贵电器“20cm”涨停,英可瑞、易事特涨超13%,伊戈尔、协鑫能科、宝馨科技、日丰股份等涨停,万祥科技、星云股份涨近8%。 消…

python中pytorch的广播机制——Broadcasting

广播机制 numpy 在算术运算期间采用“广播”来处理具有不同形状的 array ,即将较小的阵列在较大的阵列上“广播”,以便它们具有兼容的形状。Broadcasting是一种没有copy数据的expand 不过两个维度不相同,在前面插入维度1扩张维度1到相同的维…

大运新能源天津车展深度诠释品牌魅力 为都市人群打造理想车型

如今,新能源汽车行业发展潜力巨大,不断吸引无数车企入驻新能源汽车赛道,而赛道的持续紧缩也让一部分车企很难找到突破重围的机会。秉持几十年的造车经验,大运新能源凭借雄厚的品牌实力从一众车企中脱颖而出。从摩托车到重卡&#…

Java基于SpringBoot的高校招生系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 简介系统设计思路1 数据库设计2 系统整体设计 系统详细设计1系统功能模块2. 管理员功能模块3学生…

《安富莱嵌入式周报》第324期:单对以太网技术实战,IROS2023迪士尼逼真机器人展示,数百万模具CAD文件下载,闭环步进电机驱动器,CANopen全解析

周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程: 第8期ThreadX视频教程:应用实战,将裸机工程移植到RTOS的任务划分…

腾讯云秒杀活动入口及活动攻略整理分享

腾讯云是国内领先的云计算服务提供商之一,其提供的云服务器、云数据库、云存储等产品备受用户青睐。为了回馈广大用户,腾讯云经常推出各种优惠活动,其中最受关注的就是秒杀活动。本文将为大家整理分享腾讯云秒杀活动的入口及活动攻略&#xf…

系统打印服务已关闭,竟然是它的问题!

故障现象: 一台电脑不能打印文件,一点打印就弹出对话框提示打印服务已关闭。手动开启打印服务后,大约不到1分钟打印服务又自动关闭了。 故障检修: 电脑重新启动后再次重启打印服务,打印服务依然还是会自动关闭。估计是…

电机控制——高数基础

最近开始学习电机控制,将会写一个系列学习笔记,作为一个新手,肯定有理解不到位或错误的地方,仅供大家参考,欢迎交流指正。 先复习一下微积分和自动控制原理,大学学的忘得一干二净。本文大多摘自维基百科 …

Selenium自动化测试之学会元素定位

这是我经常被问到的一个问题,也是我很讨厌回答的问题,因为要想回答这个问题需要知道上下文。什么样式的元素,有哪些属性,是否有表单嵌套,都尝试了哪些定位方法。。。而且没几个提问者能事先详细的说明这些。哪儿像提bu…

深度学习DAY1:神经网络NN;二元分类

深度学习笔记 DAY1 深度学习基本知识 1.神经网络 1.1 单一神经元 所有神经元将房屋大小size作为输入x,计算线性方程,结果取max(0,y),输出预测房价y ReLU函数(线性整流函数)–max(0&#xf…

【Sentinel】Sentinel原码分析

本文内容来自【黑马】Sentinel从使用到源码解读笔记,做了部分修改和补充 目录 Sentinel 基本概念 基本流程 Node Entry 定义资源的两种方式 使用try-catch定义资源 使用注解标记资源 基于注解标记资源的实现原理 Context 什么是Context Context的初始化 …

AVS3:DMVR

AVS3中引入了解码端运动矢量修正(DMVR,Decoder side Motion Vector Refinement)技术,AVS3中的DMVR技术和G.266/VVC类似,它可以在解码端生成运动参数从而减少传输运动参数的码率开销。它的基本思想是将skip/direct模式生成的前后向…

20哈希表-三数之和

目录 LeetCode之路——15. 三数之和 分析: 官方题解: LeetCode之路——15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nu…

Step2:Java内存区域与内存溢出异常

文章目录 1.1 概述1. 2 运行时数据区域1. 3 HotSpot虚拟机对象探秘1. 4 作业:OutOfMemoryError异常体验1.1 概述 对于Java程序员来说,再虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄露和内存溢出的问题,看起来由虚…

C++ 初识STL

STL 1. 初识STL2. STL相关知识学习网站3. STL体系结构4. STL六大组件之间的关系5. STL六大组件使用例子6. 初识容器7. 初识分配器7.1 其他分配器7.2 为什么需要其他的分配器 1. 初识STL STL全称为标准模板库(Standard Template Library)。设计STL的初衷是…

【Java 进阶篇】CSS 选择器详解

CSS(层叠样式表)是一种用于描述网页上元素样式的语言。要想有效地使用CSS,了解CSS选择器是至关重要的,因为它们允许你选择要应用样式的HTML元素。在本文中,我们将详细介绍CSS选择器的各种类型和用法,以便你…

分库分表(3)——ShardingJDBC实践

一、ShardingSphere产品介绍 Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。 它们均提供标准化的数据分…

基于YOLOv8模型的足球目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOv8模型的足球目标检测系统可用于日常生活中检测与定位足球目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集…