神经网络模型实现(训练、测试)

目录

  • 一、神经网络骨架:
  • 二、卷积操作:
  • 三、卷积层:
  • 四、池化层:
  • 五、激活函数(以ReLU为例):
  • 六、模型搭建:
  • 七、损失函数、梯度下降:
  • 八、模型保存与加载:
  • 九、模型训练:
  • 十、模型测试:

一、神经网络骨架:

import torch
from torch import nn#神经网络
class CLH(nn.Module):def __init__(self):super().__init__()def forward(self, input):output=input+1return outputclh = CLH()
x = torch.tensor(1.0)
output = clh(x)
print(output)

二、卷积操作:

import torch
import torch.nn.functional as Finput = torch.tensor([[1,2,0,3,1],[0,1,2,3,1],[1,2,1,0,0],[5,2,3,1,1],[2,1,0,1,1]
])
#卷积核
kernel = torch.tensor([[1,2,1],[0,1,0],[2,1,0]
])
#变化为卷积规定输入格式的维度:这里二维(x,y)转四维(t,z,x,y)
input = torch.reshape(input,(1,1,5,5))
kernel = torch.reshape(kernel,(1,1,3,3))#对输入矩阵的上下左右进行分别padding扩充1列0,执行一次stride步长为1的卷积
output = F.conv2d(input, kernel, stride=1, padding=1)
print(output)

运行结果:
在这里插入图片描述

执行过程:
在这里插入图片描述

三、卷积层:

卷积在神经网络中用于提取输入数据的特征,通过与卷积核进行卷积操作来实现特征的提取和学习。

import torchvision
from torch import nn
from torch.utils.data import DataLoader
import torch.nn.functional as Ftest_data = torchvision.datasets.CIFAR10("./dataset",train=False,transform=torchvision.transforms.ToTensor(),download=False)
#将数据划分为batch,每个batch有64个样本
dataloader = DataLoader(test_data,batch_size=64)#神经网络
class CLH(nn.Module):def __init__(self):super(CLH,self).__init__()#神经网络中设置一个卷积层,in_channels表示输入通道数,out_channels表示输出通道数,并且卷积核尺寸为3×3的随机矩阵self.conv1 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)def forward(self,input):#对输入数据执行一次二维卷积return self.conv1(input)clh = CLH()#data是一个batch
for data in dataloader:imgs,targets = dataoutput = clh(imgs)#torch.Size([64, 3, 32, 32])表示[batchs大小,每个batch的通道数,每个通道x轴像素数,每个通道y轴像素数]print(imgs.shape)#torch.Size([64, 6, 30, 30])表示[batchs大小,每个batch的通道数,每个通道x轴像素数,每个通道y轴像素数]#其中每个通道由32×32像素变为30×30像素,其余的像素点组合成该batch的其他通道print(output.shape)

在这里插入图片描述

四、池化层:

最大池化的作用是为了保留特征同时将数据量缩小。
例如:1080p图像经过最大池化层变为720p。

import torch
from torch import nn
from torch.nn import MaxPool2d
#输入像素变为tensor类型
input = torch.tensor([[1,2,0,3,1],[0,1,2,3,1],[1,2,1,0,0],[5,2,3,1,1],[2,1,0,1,1]
],dtype=torch.float32)
#变化为池化规定输入格式的维度:这里二维(x,y)转四维(t,z,x,y)
input = torch.reshape(input,(1,1,5,5))#神经网络
class CLH(nn.Module):def __init__(self):super(CLH,self).__init__()#神经网络中设置一个池化层,ceil_mode表示池化合覆盖输入数据不够时是否计算self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True)def forward(self,input):#对输入数据执行一次最大池化操作return self.maxpool1(input)#创建神经网络
clh = CLH()output = clh(input)
print(output)

运行结果:
在这里插入图片描述

执行过程:
1

五、激活函数(以ReLU为例):

import torch
from torch import nn
from torch.nn import MaxPool2d, ReLU#输入像素变为tensor类型
input = torch.tensor([[1,2,0,3,1],[0,1,2,3,1],[1,2,1,0,0],[5,2,3,1,1],[2,1,0,1,1]
],dtype=torch.float32)
#变化为池化规定输入格式的维度:这里二维(x,y)转四维(t,z,x,y)
input = torch.reshape(input,(1,1,5,5))#神经网络
class CLH(nn.Module):def __init__(self):super(CLH,self).__init__()#神经网络中设置一个激活函数self.relu = ReLU()def forward(self,input):#对输入数据执行一次最大池化操作return self.relu(input)#创建神经网络
clh = CLH()output = clh(input)
print(output)

运行结果:
在这里插入图片描述

六、模型搭建:

在这里插入图片描述
上面的卷积神经网络模型共有8个隐藏层(卷积层+池化层)和1个输出层。

from torch import nn
from torch.nn import Module
from torch.nn import Conv2d
from torch.nn import MaxPool2d, Flatten, Linear, Sequential
import torch# 神经网络
class CLH(nn.Module):def __init__(self):super(CLH, self).__init__()#搭建模型架构,模型会按顺序从上到下执行self.model1 = Sequential(#卷积层,提取特征Conv2d(3, 32, 5, padding=2),#最大池化层,减小数据维度,防止过拟合MaxPool2d(2),#卷积层Conv2d(32, 32, 5, padding=2),#最大池化层MaxPool2d(2),#卷积层Conv2d(32, 64, 5, padding=2),#最大池化层MaxPool2d(2),#展平层,将输入数据展平为一维Flatten(),#全连接(线性)层,输入1024长度的一维向量,学习输入数据的非线性关系,输出64的特征一维向量Linear(1024, 64),)def forward(self, x):x = self.model1(x)return xclh = CLH()
print(clh)
#构建一个全0的输入,batch大小64,三通道,宽高为32×32
input = torch.ones((64, 3, 32, 32))
output = clh(input)
print(output.shape)

输出结果:
在这里插入图片描述

七、损失函数、梯度下降:

from torch import nn
from torch.nn import Conv2d
from torch.nn import MaxPool2d,Flatten,Linear, Sequential
import torch
import torchvision
from torch.utils.data import DataLoader
#获取数据,CIFAR10是一个十分类数据集
dataset = torchvision.datasets.CIFAR10("./dataset",train= False, transform =torchvision.transforms.ToTensor(), download=False)
#切分数据为batch
dataloader = DataLoader(dataset, batch_size=1, drop_last=True)#神经网络模型搭建
class Tudui(nn.Module):def __init__(self):super(Tudui,self).__init__()self.model1 = Sequential(Conv2d(3, 32, 5, padding=2),MaxPool2d(2),Conv2d(32, 32, 5, padding=2),MaxPool2d(2),Conv2d(32,64,5, padding=2),MaxPool2d(2),Flatten(),Linear(1024,64),Linear(64, 10))def forward(self, x):x = self.model1(x)return xtudui = Tudui()#损失函数
loss = nn.CrossEntropyLoss()
#SGD(随机梯度下降)优化器,用于更新模型clh中的参数以最小化损失函数
optim = torch.optim.SGD(tudui.parameters(), lr=0.01)#每个batch(data)执行如下操作
for data in dataloader:#特征和真实标签值imgs, targets = data#训练结果outputs = tudui(imgs)#计算损失result_loss = loss(outputs, targets)#每轮训练梯度清零,避免梯度累积optim.zero_grad()#反向传播计算损失函数关于模型各个参数的梯度(偏导数)result_loss.backward()#根据梯度更新模型参数,使用梯度下降算法进行参数更新optim.step()print(result_loss)

运行结果:
在这里插入图片描述

八、模型保存与加载:

保存:

import torchvision
import torch
vgg16 = torchvision.models.vgg16(pretrained=False)
# 保存方式1--保存模型结构及模型参数
torch.save(vgg16,"vgg16_method1.pth")# 保存方式2--仅保存模型参数存为字典,不保存模型结构(官方推荐)
torch.save(vgg16.state_dict(),"vgg16_method2.pth")

读取:

import torch
import torchvision
# 保存方式1对应的加载模型结构 + 参数方式
model = torch.load("vgg16_method1.pth")
print(model)# 保存方式2对应的加载模型参数方式
model2 = torch.load("vgg16_method2.pth") #加载的是字典
print(model2)vgg16 = torchvision.models.vgg16(pretrained=False) #为方式2创建模型结构并加载参数的完整写法
vgg16.load_state_dict(torch.load("vgg16_method2.pth"))
print(vgg16)

九、模型训练:

在这里插入图片描述
上面的卷积神经网络模型共有8个隐藏层(卷积层+池化层)和1个输出层。

from torch.utils.tensorboard import SummaryWriterimport torch
import torchvision
import torch.nn as nn
from torch.utils.data import DataLoader# 定义训练的设备
device = torch.device("cuda")
# 准备训练集
train_data = torchvision.datasets.CIFAR10("./dataset", train=True, transform=torchvision.transforms.ToTensor(),download=True)
# 准备测试集
test_data = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor(),download=True)
# len()获取数据集长度
train_data_size = len(train_data)
test_data_size = len(test_data)
print("训练数据集的长度为:{}".format(train_data_size))
print("测试数据集的长度为:{}".format(test_data_size))# 利用dataloader加载数据集,一个batch包含64个图片样本
train_dataloader = DataLoader(train_data, batch_size=64, drop_last=True)
test_dataloader = DataLoader(test_data, batch_size=64, drop_last=True)# 创建网络模型,这里一般将网络模型单独定义一个文件
class CLH(nn.Module):def __init__(self):super(CLH, self).__init__()self.model = nn.Sequential(#卷积层nn.Conv2d(3, 32, 5, 1, 2),#最大池化层nn.MaxPool2d(2),nn.Conv2d(32, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(2),#展平为一维nn.Flatten(),  # 展平后的序列长度为 64*4*4=1024#全连接层nn.Linear(1024, 64),nn.Linear(64, 10))def forward(self, x):x = self.model(x)return xclh = CLH()
#设置为GPU训练
clh = clh.to(device)# 损失函数
loss_fn = nn.CrossEntropyLoss()
loss_fn = loss_fn.to(device)# 优化器(梯度下降算法)对clh.parameters()中的参数进行更新
learning_rate = 1e-2
optimizer = torch.optim.SGD(clh.parameters(), lr=learning_rate)# 设置训练网络的一些参数
# 1.记录训练的次数
total_train_step = 0
# 2.记录测试的次数
total_test_step = 0
# 3.训练的轮数
epoch = 10# 添加tensorboard可视化结果
writer = SummaryWriter("../logs_train")#训练epoch轮
for i in range(epoch):print("-------------第 {} 轮训练开始------------".format(i + 1))# 训练步骤开始clh.train()#对于每个batch(data,包含64张图片)for data in train_dataloader:#获取batch中的样本和真实值标签imgs, targets = dataimgs = imgs.to(device)targets = targets.to(device)#该batch的训练结果output = clh(imgs)#计算该batch(data)上的损失loss = loss_fn(output, targets)# 优化器优化模型#梯度清零optimizer.zero_grad()#计算损失函数关于每个参数的梯度loss.backward()#梯度下降算法更新参数optimizer.step()total_train_step = total_train_step + 1print("训练次数:{}, Loss:{}".format(total_train_step, loss.item()))writer.add_scalar("train_loss", loss.item(), total_train_step)# 测试步骤开始(感觉更像验证,但是并没有更新一些学习率之类的参数,仅仅进行了测试)clh.eval()total_test_loss = 0total_accuracy = 0#设置禁止更新梯度,防止测试集更新模型参数with torch.no_grad():#对于测试集上的每个batch(data,包含64张图片)for data in test_dataloader:imgs, targets = dataimgs = imgs.to(device)targets = targets.to(device)#仅计算预测结果而不更新参数(torch.no_grad())outputs = clh(imgs)#计算该batch(data)上的损失loss = loss_fn(outputs, targets)#计算整个测试集上的损失total_test_loss = total_test_loss + loss.item()print("整个测试集上的Loss:{}".format(total_test_loss))writer.add_scalar("test_loss", total_test_loss, total_test_step)total_test_step = total_test_step + 1#每轮(epoch)训练完成后保存该轮的训练模型torch.save(clh, "clh_{}.pth".format(i))print("-------------第{}轮训练结束,模型已保存-------------".format(i + 1))writer.close()

部分执行结果:
在这里插入图片描述
在这里插入图片描述

十、模型测试:

import torchvision
from PIL import Image
import torch
#注意导入模型结构文件
from CLHmodule import *#获取测试样本
image_path = "./dog.png"
image = Image.open(image_path)
print(image)#将测试样本转换为模型规定的格式(和训练集样本尺寸要一样)
image = image.convert('RGB')
transform = torchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),torchvision.transforms.ToTensor()])
image = transform(image)
print(image)
image = torch.reshape(image,(1,3,32,32))#加载模型
model = torch.load("clh_0.pth",map_location=torch.device("cuda"))
print(model)#执行预测
model.eval()
with torch.no_grad():image = image.to("cuda")output = model(image)
#预测结果,十分类结果为10个值的一维向量,表示各个分类上的可能性
print(output)
#输出可能性最大的结果
print(output.argmax(1))

输出结果:
在这里插入图片描述

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

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

相关文章

Leetcode2160. 拆分数位后四位数字的最小和:

问题描述: 给你一个四位 正 整数 num 。请你使用 num 中的 数位 ,将 num 拆成两个新的整数 new1 和 new2 。new1 和 new2 中可以有 前导 0 ,且 num 中 所有 数位都必须使用。 比方说,给你 num 2932 ,你拥有的数位包括…

AP ERP与汉得SRM系统集成案例(制药行业)

一、项目环境 江西某医药集团公司,是一家以医药产业为主营、资本经营为平台的大型民营企业集团。公司成立迄今,企业经营一直呈现稳健、快速发展的态势, 2008 年排名中国医药百强企业前 20 强,2009年集团总销售额约38亿元人民币…

(秋招复习)自动驾驶与机器人中的SLAM技术(一)

秋招复习之--自动驾驶与机器人中的SLAM技术1 前言第一章 自动驾驶基础知识第二章 基础数学知识回顾旋转的表示SO(3)的BCH近似运动学表示线速度与加速度的处理一些常见的雅可比滤波器和最优化理论 第三章 惯性导航与组合导航IMU系统运动学IMU航迹推算卫星导航基于ESKF的简单组合…

PostgreSQL的引号、数据类型转换和数据类型

一、单引号和双引号(重要): 1、在mysql没啥区别 2、在pgsql中,实际字符串用单引号,双引号相当于mysql的,用来包含关键字; -- 单引号,表示user_name的字符串实际值 insert into t_user(user_nam…

【springboot】中使用--WebMvcConfigurer

WebMvcConfigurer 一、页面跳转控制器step1:创建视图,resources/templates/index.htmlstep2:创建SpringMVC配置类step3:测试功能 二、数据格式化step1:创建 DeviceInfo 数据类step2:自定义 Formatterstep3: 登记自定义的 DeviceFormatterstep4: 新建 Con…

Linux epoll 机制——原理图解与源码实现分析

epoll概述 epoll是Linux内核为处理大批量文件描述符而作了改进的poll,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。 epoll可以理解为event poll,它是一种事件驱动的I/O模型,可以用来替代传统的select和poll模型…

数据结构 - 栈(精简介绍)

文章目录 普通栈Stack用法Q 最长有效括号 单调栈Q 接雨水 普通栈 栈就是一个先进后出的结构 想象一个容器,往里面一层一层放东西,最早放进去的东西被压在下面(所以放元素也叫压栈),要拿到这个最低层的东西需要先把上面…

Puromycin(嘌呤霉素)— pac基因筛选抗生素

Puromycin是由Streptomyces alboniger(白黑链霉菌)产生的一种氨基糖苷类抗生素,可抑制原核细胞和真核细胞的肽基转移。Puromycin可抑制革兰氏阳性菌、多种动物细胞和昆虫细胞的生长,但是真菌和革兰氏阴性菌对Puromycin具有抗性&am…

CCF-Csp算法能力认证, 202312-2因子化简含解析

CCF-Csp算法能力认证, 202312-1仓库规划含解析 前言 推荐书目,在这里推荐那一本《算法笔记》(胡明),需要PDF的话,链接如下 「链接:https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?…

SCI一区级 | Matlab实现SSA-CNN-GRU-Multihead-Attention多变量时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【SCI一区级】Matlab实现SSA-CNN-GRU-Multihead-Attention麻雀算法优化卷积门控循环单元融合多头注意力机制多变量时间序列预测,要求Matlab2023版以上; 2.输入多个特征,输出单个…

手机如何播放电脑的声音?

准备工具: 有线耳机,手机,电脑,远控软件 1.有线耳机插电脑上 2.电脑安装pc版远控软件,手机安装手机端控制版远控软件 3.手机控制电脑开启声音控制 用手机控制电脑后,打开声音控制,电脑播放视频…

Qt 使用Installer Framework制作安装包

Qt 使用Installer Framework制作安装包 引言一、下载安装 Qt Installer Framework二、简单使用2.1 创建目录结构 (文件夹结构)2.2 制作程序压缩包2.3 制作程序安装包 引言 Qt Installer Framework (安装程序框架)是一个强大的工具集,用于创建自定义的在线和离线安装…

JVM--HostSpot算法细节实现

1.根节点枚举 定义: 我们以可达性分析算法中从GC Roots 集合找引用链这个操作作为介绍虚拟机高效实现的第一个例 子。固定可作为GC Roots 的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如 栈帧中的本地变量表&a…

SVN与Git功能差异对比分析

最近在调研学习Git管理和分支模型相关内容,外延到了SVN和Git差异、工作原理等相关细节,学习整理如下。 SVN(Subversion)与 Git 的最大不同,主要包括以下几个方面: 交流探讨,加入群聊【Java学习…

Docker搭建本地私有仓库

目录 1.下载运行registry 镜像 2.添加私有镜像仓库地址 3.为镜像添加标签 4.上传到私有仓库 5.查看私有仓库的所有镜像 6.测试私有仓库下载 1.下载运行registry 镜像 docker pull registry docker run -d -v /data/registry:/var/lib/registry -p 5000:5000 --restartal…

通过vue3 + TypeScript + uniapp + uni-ui 实现下拉刷新和加载更多的功能

效果图: 核心代码: <script lang="ts" setup>import { ref, reactive } from vue;import api from @/request/api.jsimport empty from @/component/empty.vueimport { onLoad,onShow, onPullDownRefresh, onReachBottom } from @dcloudio/uni-applet form …

消费金融系统开发回忆录

架构设计图 整个支付链路上的功能 支付系统应该有&#xff1a;账户管理、渠道管理、支付管理、对账管理、清算管理、结算管理 一笔支付订单&#xff0c;在支付系统侧就是要记录清楚&#xff0c;谁发起的、对哪个商品进行支付、通过哪个渠道支付、支付时间、支付结果等…

Unity XR Interaction Toolkit(VR、AR交互工具包)记录安装到开发的流程,以及遇到的常见问题(一)!

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、XR Interaction Toolkit是什么&#xff1f;二、跨平台交互三、 AR 功能四、XR Interaction Toolkit的特点五、XR Interaction Toolkit 示例总结 前言 随着VR行业的发展&#…

huawei USG6001v1学习---防火墙相关知识(2)

目录 1.安全策略 2.防火墙的状态检测和会话表技术 3.FTP 4.用户认证 5.认证策略 1.安全策略 传统包过滤技术 --- 其本质就是ACL访问控制列表&#xff0c;根据数据包的特征进行过滤&#xff0c;对比规则&#xff0c; 执行对应的动作&#xff1b; 这里数据包的特征 --- …

【Linux】编辑器vscode与linux的联动

1.vscode简单学习 vscode是编辑器&#xff0c;可以写各种语言的程序 下载链接&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 来用一下vscode 我们保存了就能在我们的那个文件夹里面看到这个 这个就是编辑器&#xff0c;跟我们的文本文件好像差不多&#…