基于Pytorch框架构建LeNet-5模型

Pytorch

  • 一、训练模型
    • 1.导入必要的库
    • 2.设置超参数
    • 3.数据预处理
    • 4.读取数据
  • 二、定义卷积神经网络
    • 1.定义卷积神经网络
    • 2.定义学习率
    • 3.实例化模型并且移动到GPU
    • 4.选择优化器
  • 三、定义调整学习率的函数
    • 1.定义调整学习率的函数
  • 四、训练模型
    • 1.设置模型为训练模式
    • 2.遍历训练数据加载器
    • 3.打印进度
  • 五、验证模型
    • 1.设置模型为验证模式
    • 2.初始化计数器
    • 3.遍历测试数据加载器
    • 4.计算准确率
    • 5.打印验证结果
  • 五、定义训练循环
    • 2.执行训练和验证
    • 3.保存模型

一、训练模型

1.导入必要的库

torch.nn.functional as F: 导入 PyTorch 的不带参数的函数模块,包含各种函数,如激活函数、池化层等。
torch.optim as optim: 导入 PyTorch 的优化器模块,用于定义优化器。
torch.cuda.is_available(): 导入 PyTorch 的 CUDA 模块,用于检查是否有可用的 CUDA GPU。
torch.device(‘cuda’ if torch.cuda.is_available() else ‘cpu’): 导入 PyTorch 的设备模块,用于定义计算设备。如果 CUDA GPU 可用,则定义为 ‘cuda’;否则定义为 ‘cpu’。

# 导入库
import torch.nn.functional as F
import torch.optim as optim
import torch
import torch.nn as nn
import torch.nn.parallel
import torch.optim
import torch.utils.data
import torch.utils.data.distributed
import torchvision.transforms as transforms
import torchvision.datasets as datasets

2.设置超参数

定义超参数,这些参数将用于控制模型的训练过程。

以下是超参数的详细说明:
CH_SIZE: 定义了每个训练批次的样本数量。较大的批大小可以提高计算效率,但可能会增加内存需求。在这个例子中,批大小被设置为 20。
EPOCHS: 定义了训练过程中迭代的轮数。每个 epoch 表示数据集被完整地遍历了一次。在这个例子中,训练过程被设置为进行 10 个 epoch。
DEVICE: 定义了计算设备。如果环境中存在可用的 GPU,它会定义为 ‘cuda’;如果环境中没有可用的 GPU,它会定义为 ‘cpu’。

# 设置超参数
#每次的个数
BATCH_SIZE = 20
#迭代次数
EPOCHS = 10
#采用cpu还是gpu进行计算
DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

3.数据预处理

定义数据预处理步骤,这些步骤将被应用于每个图像上,以增强数据的多样性并标准化数据格式。
以下是预处理步骤的详细说明:
1)Resize(100): 将图片大小调整为 100x100 像素。
2)RandomVerticalFlip(): 随机垂直翻转图片。
3)RandomCrop(50): 从原始图片中随机裁剪一个大小为 50x50 的区域。
4)RandomResizedCrop(150): 从原始图片中随机裁剪一个大小为 150x150 的区域,并随机调整裁剪区域的缩放比例。
5)ColorJitter(brightness=0.5, contrast=0.5, hue=0.5): 随机调整图片的亮度、对比度和色调。
6)ToTensor(): 将 PIL 图像转换为 PyTorch 张量。
7)Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]): 对图像进行归一化处理,将每个通道的均值和标准差调整为 0.5。

# 定义数据预处理
transform = transforms.Compose([transforms.Resize(100),transforms.RandomVerticalFlip(),transforms.RandomCrop(50),transforms.RandomResizedCrop(150),transforms.ColorJitter(brightness=0.5, contrast=0.5, hue=0.5),transforms.ToTensor(),transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
])

4.读取数据

使用 PyTorch 的数据加载和处理功能来读取数据集,并为训练和测试阶段准备数据加载器。

以下是代码的详细步骤:
1)dataset_train = datasets.ImageFolder(‘E:\xm\dataset\train’, transform): 创建一个ImageFolder数据集,用于加载和分类E:\xm\dataset\train目录中的图像。这个目录应该包含多个子目录,每个子目录代表一个类别,子目录中的图像将归属于该类别。transform变量包含了应用于每个图像的预处理操作。
2)print(dataset_train.imgs): 打印数据集中所有图像的文件路径和对应的类别索引。imgs是一个列表,每个元素是一个包含图像文件路径和类别索引的元组。
3)print(dataset_train.class_to_idx): 打印类别到索引的映射。class_to_idx是一个字典,键是类别名称,值是相应的索引。
4)dataset_test = datasets.ImageFolder(‘E:\xm\dataset\val’, transform): 创建一个ImageFolder数据集,用于加载和分类E:\xm\dataset\val目录中的验证图像。
5)print(dataset_test.class_to_idx): 这行代码打印验证数据集中类别到索引的映射。
6)train_loader = torch.utils.data.DataLoader(dataset_train, batch_size=BATCH_SIZE, shuffle=True): 创建一个训练数据加载器。DataLoader类接受一个数据集和一个批处理大小batch_size,以及一个shuffle标志,表示是否在每次遍历数据集时随机打乱数据的顺序。
7)test_loader = torch.utils.data.DataLoader(dataset_test, batch_size=BATCH_SIZE, shuffle=True): 创建一个测试数据加载器。与训练数据加载器类似,但它也用于加载验证数据集。

# 读取数据
dataset_train = datasets.ImageFolder('E:\\xm\dataset\\train', transform)
print(dataset_train.imgs)# 对应文件夹的label
print(dataset_train.class_to_idx)
dataset_test = datasets.ImageFolder('E:\\xm\dataset\\val', transform)# 对应文件夹的label
print(dataset_test.class_to_idx)# 导入数据
train_loader = torch.utils.data.DataLoader(dataset_train, batch_size=BATCH_SIZE, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset_test, batch_size=BATCH_SIZE, shuffle=True)

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

二、定义卷积神经网络

1.定义卷积神经网络

定义名为 ConvNet 的卷积神经网络类,它继承自 torch.nn.Module。这个类实现了一个简单的卷积神经网络结构,用于图像分类任务。

以下是网络结构的详细说明:
1)init(self): 构造函数中,定义了以下层:

  • 6 个卷积层(conv1 到 conv6),每个卷积层后面都跟着一个 ReLU 激活函数和 一个最大池化层(max_pool1 到max_pool4)。
  • 每个卷积层的输出通道数逐渐增加,从 32 到 128。
  • 两个全连接层(fc1 和 fc2),其中 fc1 具有512 个神经元,fc2 具有 1 个神经元(对应于二分类问题)。
  • 最后一个全连接层后面跟着一个 Sigmoid 激活函数。

2)forward(self, x): 前向传播函数接收输入 x,并依次通过以下层:

  • 6 个卷积和池化层的组合,用于提取图像特征。
  • 将最后一个池化层的输出特征图展平为一维向量。
  • 通过全连接层 fc1 和 fc2。
  • 通过 Sigmoid 激活函数生成最终输出。
class ConvNet(nn.Module):def __init__(self):super(ConvNet, self).__init__()self.conv1 = nn.Conv2d(3, 32, 3)self.max_pool1 = nn.MaxPool2d(2)self.conv2 = nn.Conv2d(32, 64, 3) self.max_pool2 = nn.MaxPool2d(2) self.conv3 = nn.Conv2d(64, 64, 3) self.conv4 = nn.Conv2d(64, 64, 3) self.max_pool3 = nn.MaxPool2d(2) self.conv5 = nn.Conv2d(64, 128, 3) self.conv6 = nn.Conv2d(128, 128, 3) self.max_pool4 = nn.MaxPool2d(2) self.fc1 = nn.Linear(4608, 512) self.fc2 = nn.Linear(512, 1)def forward(self, x): in_size = x.size(0) x = self.conv1(x) x = F.relu(x) x = self.max_pool1(x) x = self.conv2(x) x = F.relu(x) x = self.max_pool2(x) x = self.conv3(x) x = F.relu(x) x = self.conv4(x) x = F.relu(x) x = self.max_pool3(x) x = self.conv5(x) x = F.relu(x) x = self.conv6(x) x = F.relu(x)x = self.max_pool4(x) # 展开x = x.view(in_size, -1)x = self.fc1(x)x = F.relu(x) x = self.fc2(x) x = torch.sigmoid(x) return x

2.定义学习率

定义模型的学习率为 0.0001。

modellr = 1e-4

3.实例化模型并且移动到GPU

创建 ConvNet 模型实例,并使用 to(DEVICE) 方法将其移动到指定的计算设备上。如果 DEVICE 是 ‘cuda’,则模型将被移动到 GPU;如果 DEVICE 是 ‘cpu’,则模型将被移动到 CPU。

# 实例化模型并且移动到GPU
model = ConvNet().to(DEVICE)

4.选择优化器

创建 Adam 优化器,其中 model.parameters() 表示模型的所有参数,lr=modellr 表示学习率为 0.0001。

# 选择简单暴力的Adam优化器,学习率调低
optimizer = optim.Adam(model.parameters(), lr=modellr)

三、定义调整学习率的函数

1.定义调整学习率的函数

这个函数实现一个简单的学习率衰减策略,它能够根据当前的 epoch 调整学习率。

1)定义学习率衰减规则:

  • modellrnew = modellr * (0.1 ** (epoch // 5)) :定义了一个学习率衰减规则,其中 modellr
    是初始学习率,0.1 ** (epoch // 5) 表示每 5 个 epoch 学习率减少 10 倍。

2)打印新学习率:

  • print(“lr:”,modellrnew):打印出新的学习率。

3)调整优化器的学习率:

  • for param_group in optimizer.param_groups:
    遍历优化器中的每个参数组,并将每个参数组的学习率设置为新学习率。
def adjust_learning_rate(optimizer, epoch):"""Sets the learning rate to the initial LR decayed by 10 every 30 epochs"""modellrnew = modellr * (0.1 ** (epoch // 5)) print("lr:",modellrnew) for param_group in optimizer.param_groups: param_group['lr'] = modellrnew

四、训练模型

1.设置模型为训练模式

将模型设置为训练模式,这样模型在计算梯度时会使用 Dropout 和 BatchNorm 层。

# 定义训练过程
def train(model, device, train_loader, optimizer, epoch):model.train() 

2.遍历训练数据加载器

遍历 train_loader 中的每个批次,并将数据和标签移动到指定的设备上。然后,它执行前向传播、计算损失、反向传播和更新模型参数。

for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device).float().unsqueeze(1)
optimizer.zero_grad()
output = model(data)

# print(output)
loss = F.binary_cross_entropy(output, target)
loss.backward()
optimizer.step()

3.打印进度

在每 10 个批次后打印当前的轮次、批次数、损失值和进度百分比,以便监控训练进度。

if (batch_idx + 1) % 10 == 0:print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(epoch, (batch_idx + 1) * len(data), len(train_loader.dataset),100. * (batch_idx + 1) / len(train_loader), loss.item()))

五、验证模型

1.设置模型为验证模式

将模型设置为验证模式,这样模型在计算梯度时不会使用 Dropout 和 BatchNorm 层。

# 定义测试过程
def val(model, device, test_loader):model.eval()

2.初始化计数器

用于在每次迭代时累积损失、正确预测的数量和总样本数。

test_loss = 0
correct = 0
total = 0

3.遍历测试数据加载器

遍历 test_loader 中的每个批次,并将数据和标签移动到指定的设备上。然后,它执行前向传播并计算损失。由于模型处于验证模式,它不会计算梯度。同时,它累积损失、样本数和正确预测的数量。

  with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device).float().unsqueeze(1)output = model(data)test_loss += F.binary_cross_entropy(output, target, reduction='mean').item()pred = torch.tensor([[1] if num[0] >= 0.5 else [0] for num in output]).to(device)correct += pred.eq(target.long()).sum().item()total += target.size(0)  # 计算总数

4.计算准确率

accuracy = 100. * correct / total

5.打印验证结果

在验证过程结束时打印平均损失和准确率。

print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.2f}%)\n'.format(

test_loss, correct, total, 100 * correct / total))

说明:这个函数实现了一个基本的验证循环,它能够验证模型在测试数据集上的性能。在实际使用中,您可能需要根据您的具体任务调整超参数,并确保数据加载器的设置与模型的需求相匹配。

五、定义训练循环

1.调整学习率
在每个 epoch 开始时调整学习率。

# 训练
for epoch in range(1, EPOCHS + 1):adjust_learning_rate(optimizer, epoch)

2.执行训练和验证

在每个 epoch 中执行训练和验证过程。

   train(model, DEVICE, train_loader, optimizer, epoch) val(model, DEVICE, test_loader)

3.保存模型

在训练结束后保存模型的状态字典。

torch.save(model.state_dict(), 'ConvNet.pth')

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

# 二、测试模型import torch
from PIL import Image
import torchvision.transforms as transforms
from torchvision import models
from torch.autograd import Variable# 定义数据预处理
transform_test = transforms.Compose([transforms.Resize(100),transforms.RandomVerticalFlip(),transforms.RandomCrop(50),transforms.RandomResizedCrop(150),transforms.ColorJitter(brightness=0.5, contrast=0.5, hue=0.5),transforms.ToTensor(),transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
])# 定义类别
classes = ['cat', 'dog']  # 替换为您的实际类别名称# 检查是否有可用的 GPU
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 定义自定义的 VGG-19 模型
# 定义网络
class ConvNet(nn.Module):def __init__(self):super(ConvNet, self).__init__()self.conv1 = nn.Conv2d(3, 32, 3)self.max_pool1 = nn.MaxPool2d(2)self.conv2 = nn.Conv2d(32, 64, 3)self.max_pool2 = nn.MaxPool2d(2)self.conv3 = nn.Conv2d(64, 64, 3)self.conv4 = nn.Conv2d(64, 64, 3)self.max_pool3 = nn.MaxPool2d(2)self.conv5 = nn.Conv2d(64, 128, 3)self.conv6 = nn.Conv2d(128, 128, 3)self.max_pool4 = nn.MaxPool2d(2)self.fc1 = nn.Linear(4608, 512)self.fc2 = nn.Linear(512, 1)def forward(self, x):in_size = x.size(0)x = self.conv1(x)x = F.relu(x)x = self.max_pool1(x)x = self.conv2(x)x = F.relu(x)x = self.max_pool2(x)x = self.conv3(x)x = F.relu(x)x = self.conv4(x)x = F.relu(x)x = self.max_pool3(x)x = self.conv5(x)x = F.relu(x)x = self.conv6(x)x = F.relu(x)x = self.max_pool4(x)# 展开x = x.view(in_size, -1)x = self.fc1(x)x = F.relu(x)x = self.fc2(x)x = torch.sigmoid(x)return x# 实例化 Resnet50 类# 加载权重
model.load_state_dict(torch.load("ConvNet.pth"))
model.to(DEVICE)
model.eval()# 定义预测函数
def predict_image(image_path):# 打开图片image = Image.open(image_path)# 应用预处理image = transform(image).unsqueeze(0)  # 添加batch维度# 转换为Variable(如果模型需要)image = Variable(image).to(DEVICE)# 获取模型预测output = model(image)_, prediction = torch.max(output.data, 1)return classes[prediction.item()]# 上传的图片路径
uploaded_image_path = '44.jpg'
# 进行预测
predicted_class = predict_image(uploaded_image_path)print(f"The uploaded image is predicted as: {predicted_class}")

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

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

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

相关文章

揭秘循环购:消费即收益,如何助力商家月销百万?

大家好,我是吴军,今天要和大家分享一种颠覆性的商业模式——循环购。你是否听说过“消费1000送2000”这样的促销活动?是不是觉得太不可思议,商家岂不是在“送钱”?别急,让我为你揭开这背后的秘密。 循环购&…

RN开发搬砖经验之—“Calculated frame index should never be lower than 0“崩溃问题分析

问题重现 崩溃堆栈: Back traces starts. java.lang.RuntimeException: java.lang.IllegalStateException: Calculated frame index should never be lower than 0at com.facebook.react.animated.NativeAnimatedModule$1.doFrameGuarded(NativeAnimatedModule.ja…

计算机组成原理 | CPU子系统(1)基本概述

基本结构模型 运算与缓存部件 数据寄存部件 PSW不是很清楚 存储器是什么?属于那个结构里? 时序处理部件 cpu是大脑,控制器是神经元 ①通过硬件产生控制信号 ②通过软件产生控制信号 外频(系统时钟信号),…

Tesseract-OCR 5.0LSTM训练

准备工作 1.安装tesseract5.0版本 2.配置tesserac环境变量 3.jTessBoxEditor(需要java环境) 很多博客已有详细教程,不再赘述,本文以训练为主 最终文件目录: --tif 需要训练的tif文件 --lstmf 后文会讲到生成的方式 --txt 后文会讲到生成的方式 --box 后文…

【Day02】0基础微信小程序入门-学习笔记

文章目录 模板与配置学习目标WXML 模板语法1.数据绑定(类似于 Vue2 )2. 事件绑定3. 条件渲染4.列表渲染 WXSS模板样式1. rpx尺寸单位2.样式导入3. 全局样式和局部样式 全局配置1. window2. tabBar 页面配置网络数据请求总结 持续更新~ 模板与配置 学习目…

Databend 开源周报第 149 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 支持递归公共表…

Nvidia Isaac Sim图编程OmniGraph 入门教程 2024(6)

Nvidia Isaac Sim 入门教程 2024 版权信息 Copyright 2023-2024 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. …

创建一个Django项目

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 本小节我们将开始讲解如何使用Django创建一个项目,步骤如下: (1)首先在D盘(读者可以根据…

Java基础:IO流

目录 一、定义 1.引言 2.分类 (1)按照流的方向分 (2)按操作文件的类型分 3.体系结构 二、字节流(以操作本地文件为例) 1. FileOutputStream 类 (1)定义 (2&am…

使用 Iceberg、Tabular 和 MinIO 构建现代数据架构

现代数据环境需要一种新型的基础架构,即无缝集成结构化和非结构化数据、轻松扩展并支持高效的 AI/ML 工作负载的基础架构。这就是现代数据湖的用武之地,它为您的所有数据需求提供了一个中心枢纽。然而,构建和管理有效的数据湖可能很复杂。 这…

PR模板 | RGB特效视频标题模板Titles | MOGRT

RGB特效视频标题模板mogrt免费下载 4K分辨率(38402160) 支持任何语言 友好的界面 输入和输出动画 快速渲染 视频教程 免费下载:https://prmuban.com/39055.html 更多pr模板视频素材下载地址:https://prmuban.com

不翻墙安装yolov8环境下的RT-DETR并实现PCB表面缺陷检测

目录 一、新建conda环境二、安装yolov8环境1.克隆安装包2.安装依赖包3.测试模型 任务2:基于RT-DETR实现PKU-PCB表面缺陷检测数据准备 数据增强测试 总结 一、新建conda环境 创建并激活conda环境: 在conda创建一个名为yolov8的新环境,并在其中…

外贸行业 - 收汇日期

“收汇日期”指的是外贸业务中,出口方从进口方收到货款的具体日期。在外贸交易中,特别是使用信用证(Letter of Credit, L/C)、电汇(Telegraphic Transfer, T/T)、付款交单(Documents against Pa…

《2024云安全资源池 能力指南》

《2024云安全资源池 能力指南》这份报告不仅梳理了云安全资源池的发展历程,还深入探讨了其在当前云计算环境下的重要性和必要性。报告详细分析了云安全资源池的市场需求、技术架构、关键技术以及行业应用案例,为政企用户提供了全面的云安全解决方案。通过资料收集、问卷调研、企…

深入了解 GPT-4 和 ChatGPT 的 API---OpenAI Playground

文章目录 基本概念OpenAI API 提供的可用模型在 OpenAI Playground 中使用 GPT 模型 掌握GPT-4 和 ChatGPT 的 API 的使用方法,以便有效地将它们集成到 Python 应用程序中。首先,需要了解 OpenAI Playground。这将使你在编写代码之前更好地了解模型。接着…

如何将一个web端程序打包成一个pc端程序(exe文件)?

如何将一个Web端程序打包成一个PC端程序,例如一个可执行的EXE文件,是许多开发者常见的需求。下面将详细解释如何使用Nativefier工具将Web端程序打包成PC端程序的具体步骤。 目录 下载并安装Node.js验证Node.js和npm的安装安装Nativefier使用Nativefier打…

鸿蒙Harmony角落里的知识:从ECMA规范到ArkTS接口(一)

前言: 在深入理解和使用ArkTS中的数组操作之前,我们有必要先了解ECMAScript(ECMA)规范中的规定。ECMA规范是JavaScript语言的官方标准,而ArkTS作为JavaScript的超集,也遵守了这些规定。本系列文章旨在探讨…

学期结束如何发布期末成绩?

当期末的试卷最后一张被收起,当教室里的喧嚣逐渐沉寂,学生们的心中充满了对成绩的期待与忐忑。期末成绩,关乎着学生的心情,更关系到他们的未来学习动力。那么,如何在保护学生隐私的同时,高效地公布成绩呢&a…

文件怎么加密?电脑文件加密,分享5个实用方法

通常情况下,人们对手机数据的保护比对电脑数据更为重视。许多人使用指纹和密码来防止他人窥视聊天记录和照片。然而,电脑上的数据却常常被忽视。大多数用户仅设置了电脑登录密码,认为这样就足以保护电脑和其中的文件。然而如果你也是这样认为…

chatglm系列知识

一、目录 chatglm 是什么语言模型与transformer decoder 的区别解释prefix LM与Cause LMchatglm(prefix LM)与decoder-only LM 核心区别glm 架构chatglm 预训练方式chatglm 微调chatglm与chatglm2、chatglm3的区别chatglm 激活函数采用gelu, 为什么chat…