Pytorch学习笔记——在GPU上进行训练

文章目录

      • 1. 环境准备
      • 2. 导入必要库
      • 3. 加载数据集
      • 4. 定义简单的神经网络模型
      • 5. 检查和设置GPU设备
      • 6. 定义损失函数和优化器
      • 7. 训练模型
      • 8. 全部代码展示及运行结果

1. 环境准备

首先,确保PyTorch已经安装,且CUDA(NVIDIA的并行计算平台和编程模型)支持已经正确配置。可以通过以下代码检查CUDA是否可用:

print(torch.cuda.is_available())  # 如果返回True,则CUDA可用

配置PyTorch环境和CUDA支持,可以参考我写的这篇博客
Pytorch学习笔记——环境配置安装

2. 导入必要库

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Linear, Flatten, Sequential
from torch.utils.data import DataLoader
  • torch 是PyTorch的核心库。
  • torchvision 提供了用于计算机视觉任务的工具,包括数据集和变换。
  • nn 包含了构建神经网络所需的各种模块。
  • DataLoader 用于加载数据集并进行批处理。

3. 加载数据集

使用CIFAR-10数据集进行训练,它是一个常用的小型图像数据集。加载数据集并创建数据加载器。

# 加载数据集
dataset = torchvision.datasets.CIFAR10(root="data1", train=False, transform=torchvision.transforms.ToTensor(), download=True)
# 创建数据加载器
dataloader = DataLoader(dataset, batch_size=64)
  • torchvision.datasets.CIFAR10:下载并加载CIFAR-10数据集。
  • DataLoader:将数据集划分为小批次,并进行数据加载。

4. 定义简单的神经网络模型

定义一个简单的卷积神经网络(CNN)模型:

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 x
  • Conv2d:二维卷积层,用于提取图像特征。
  • MaxPool2d:最大池化层,用于下采样。
  • Flatten:将多维输入展平为一维,用于全连接层的输入。
  • Linear:全连接层,用于分类任务。

5. 检查和设置GPU设备

需要检查是否有可用的GPU,并将模型和数据移动到GPU上。

# 检查是否有可用的GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 将模型和数据转移到GPU上
mynn = NN().to(device)
print(mynn)
  • torch.device("cuda"):如果CUDA可用,则使用GPU;否则使用CPU。
  • to(device):将模型转移到指定的设备(CPU或GPU)。

6. 定义损失函数和优化器

定义损失函数和优化器来训练模型:

# 定义损失函数
loss = nn.CrossEntropyLoss().to(device)# 定义优化器
optim = torch.optim.SGD(mynn.parameters(), lr=0.01)
  • nn.CrossEntropyLoss:适用于分类问题的损失函数。
  • torch.optim.SGD:随机梯度下降优化器。

7. 训练模型

通过多个epoch对模型进行训练。在每个epoch中,进行前向传播、计算损失、反向传播和参数更新:

# 多轮学习 0 - 20 20轮
for epoch in range(20):running_loss = 0.0for data in dataloader:# 确保数据也转移到GPU上imgs, targets = data[0].to(device), data[1].to(device)optim.zero_grad()  # 清零梯度缓存outputs = mynn(imgs)  # 前向传播loss_value = loss(outputs, targets)  # 计算损失loss_value.backward()  # 反向传播,计算梯度optim.step()  # 根据梯度更新权重running_loss += loss_value.item()  # 累加损失值print(f"Epoch {epoch + 1}, Loss: {running_loss / len(dataloader)}")print("------------------------------")
  • optim.zero_grad():清零之前计算的梯度。
  • outputs = mynn(imgs):进行前向传播。
  • loss_value.backward():进行反向传播,计算梯度。
  • optim.step():根据计算的梯度更新权重。
  • running_loss:累加损失值以计算平均损失。

8. 全部代码展示及运行结果

# -*- coding: utf-8 -*-
# @Author: kk
import torch
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Linear, Flatten, Sequential
from torch.utils.data import DataLoader# 加载数据集
dataset = torchvision.datasets.CIFAR10(root="data1", train=False, transform=torchvision.transforms.ToTensor(), download=True)
# loader加载
dataloader = DataLoader(dataset, batch_size=64)# 网络
class NN(nn.Module):def __init__(self):super(NN, 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 x# 检查是否有可用的GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 将模型和数据转移到GPU上
mynn = NN().to(device)
print(mynn)
loss = nn.CrossEntropyLoss().to(device)# 优化器
optim = torch.optim.SGD(mynn.parameters(), lr=0.01)# 多轮学习  0 - 20  20轮
for epoch in range(20):running_loss = 0.0for data in dataloader:# 确保数据也转移到GPU上imgs, targets = data[0].to(device), data[1].to(device)optim.zero_grad()  # 清零梯度缓存outputs = mynn(imgs)  # 前向传播loss_value = loss(outputs, targets)  # 计算损失loss_value.backward()  # 反向传播,计算梯度optim.step()  # 根据梯度更新权重running_loss += loss_value.item()  # 累加损失值print(f"Epoch {epoch + 1}, Loss: {running_loss / len(dataloader)}")print("------------------------------")

运行结果如下,发现在每一轮过后,Loss在逐渐减小:
在这里插入图片描述

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

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

相关文章

用PyTorch从零开始编写DeepSeek-V2

DeepSeek-V2是一个强大的开源混合专家(MoE)语言模型,通过创新的Transformer架构实现了经济高效的训练和推理。该模型总共拥有2360亿参数,其中每个令牌激活21亿参数,支持最大128K令牌的上下文长度。 在开源模型中&…

vue3前端开发-小兔鲜项目-一些额外提醒的内容

vue3前端开发-小兔鲜项目-一些额外提醒的内容!今天这一篇文章,是提醒大家,如果你正在学习小兔鲜这个前端项目,有些地方需要提醒大家,额外注意的地方。 第一个:就是大家在进入二级页面后,有一个分…

深度学习-7-使用DCGAN生成动漫头像(实战)

参考什么是GAN生成对抗网络,使用DCGAN生成动漫头像 1 什么是生成对抗网络 生成对抗网络,英文是Generative Adversarial Networks,简称GAN。 GAN是一种无监督的深度学习模型,于2014年首次被提出。该算法通过竞争学习的方式生成新的、且与原始数据集相似的数据。 这些生成…

昇思25天学习打卡营第19天|生成式-DCGAN生成漫画头像

打卡 目录 打卡 GAN基础原理 DCGAN原理 案例说明 数据集操作 数据准备 数据处理和增强 部分训练数据的展示 构造网络 生成器 生成器代码 ​编辑 判别器 判别器代码 模型训练 训练代码 结果展示(3 epoch) 模型推理 GAN基础原理 原理介…

C#实战 | 天行健、上下而求索

本文介绍C#开发入门案例。 01、项目一:创建控制台应用“天行健,君子以自强不息” 项目说明: 奋斗是中华民族的底色,见山开山,遇水架桥,正是因为自强不息的奋斗,才有了辉煌灿烂的中华民族。今…

xmind--如何快速将Excel表中多列数据,复制到XMind分成多级主题

每次要将表格中的数据分成多级时,只能复制粘贴吗 快来试试这个简易的方法吧 这个是原始的表格,分成了4级 步骤: 1、我们可以先按照这个层级设置下空列(后买你会用到这个空列) 二级不用加、三级前面加一列、四级前面加…

MAT使用

概念 Shallow heap & Retained Heap Shallow Heap就是对象本身占用内存的大小。 Retained Heap就是当前对象被GC后,从Heap上总共能释放掉的内存(表示如果一个对象被释放掉,那会因为该对象的释放而减少引用进而被释放的所有的对象(包括…

【React】JSX 实现列表渲染

文章目录 一、基础语法1. 使用 map() 方法2. key 属性的使用 二、常见错误和注意事项1. 忘记使用 key 属性2. key 属性的选择 三、列表渲染的高级用法1. 渲染嵌套列表2. 条件渲染列表项3. 动态生成组件 四、最佳实践 在 React 开发中,列表渲染是一个非常常见的需求。…

【多模态】CLIP-KD: An Empirical Study of CLIP Model Distillation

论文:CLIP-KD: An Empirical Study of CLIP Model Distillation 链接:https://arxiv.org/pdf/2307.12732 CVPR 2024 Introduction Motivation:使用大的Teacher CLIP模型有监督蒸馏小CLIP模型,出发点基于在资源受限的应用中&…

【网络】tcp_socket

tcp_socket 一、tcp_server与udp_server一样的部分二、listen接口(监听)三、accept接收套接字1、为什么还要多一个套接字(明明已经有了个socket套接字文件了,为什么要多一个accept套接字文件?)2、底层拿到新…

从R-CNN到Faster-R-CNN的简单介绍

1、R-CNN RCNN算法4个步骤 1、一张图像生成1K~2K个候选区域(使用Selective Search方法) 2、对每个候选区域,使用深度网络提取特征 3、特征送入每一类的SVM分类器,判别是否属于该类 4、使用回归器精细修正候选框位置 R-CNN 缺陷 : 1.训练…

Java使用AsposePDF和AsposeWords进行表单填充

声明:本文为作者Huathy原创文章,禁止转载、爬取!否则,本人将保留追究法律责任的权力! 文章目录 AsposePDF填充表单adobe pdf表单准备引入依赖编写测试类 AsposeWord表单填充表单模板准备与生成效果引入依赖编码 参考文…

【C语言】链式队列的实现

队列基本概念 首先我们要了解什么是队列,队列里面包含什么。 队列是线性表的一种是一种先进先出(First In Fi Out)的数据结构。在需要排队的场景下有很强的应用性。有数组队列也有链式队列,数组实现的队列时间复杂度太大&#x…

【数据结构 | 哈希表】一文了解哈希表(散列表)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

虚拟局域网配置与分析-VLAN

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、相关知识 虚拟局域网(Virtual Local Area Network,VLAN)是一组逻辑上的设备和用户;不受物理位置的…

浅谈监听器之保存响应到文件

浅谈监听器之保存响应到文件 JMeter 提供了一个实用的监听器——“保存响应到文件”,该监听器能够自动将取样器的响应数据直接保存到指定的文件中,便于后续分析或存档。本文档旨在详细介绍如何配置和使用此监听器功能。 适用场景 ● 长时间运行的测试…

昇思25天学习打卡营第n天|本地安装mindspore之二|开始第一课的代码。以及对比xshell,MobaXterm

开始准备在本地的系统上跑例子了。从第一课开始吧。 1,下载代码 打开课程。 下载样例代码 https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/r2.3/tutorials/zh_cn/beginner/mindspore_quick_start.py 2,在本地Linux上输入并运…

Python新手如何制作植物大战僵尸?这篇文章教会你!

引言 《植物大战僵尸》是一款非常受欢迎的塔防游戏,玩家需要种植各种植物来抵御僵尸的进攻。在这篇文章中,我们将使用Python编写一个简化版的植物大战僵尸游戏,以展示如何使用Python创建游戏。 游戏规则 玩家将种植不同类型的植物来防御僵尸…

好用的电脑录屏软件免费推荐,拥有这3款就能高效录屏!

电脑录屏软件已成为我们记录生活、分享知识的得力助手。但是,市面上琳琅满目的录屏软件令人眼花缭乱,如何才能选择到一款好用的电脑录屏软件免费神器呢?今天,就让我来为您揭晓这个秘密! 首先,我们得明确一…

胖东来也要加入“打水仗”?瓶装水品牌又该如何出招

今年瓶装水行业的“战场”似乎格外热闹,比武汉的天气好像还要火热......从年头农夫山泉打出“纯净水”的牌,再到如今掀起价格内卷战,一箱12瓶的纯净水在某宝平台上仅售9.9元,平均下来每瓶单价不超一元,农夫山泉都出击了…