Pytorch深度学习-----实现神经网络模型在GPU上进行训练的方法

news2024/12/26 23:08:33

系列文章目录

PyTorch深度学习——Anaconda和PyTorch安装
Pytorch深度学习-----数据模块Dataset类
Pytorch深度学习------TensorBoard的使用
Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Compose,RandomCrop)
Pytorch深度学习------torchvision中dataset数据集的使用(CIFAR10)
Pytorch深度学习-----DataLoader的用法
Pytorch深度学习-----神经网络的基本骨架-nn.Module的使用
Pytorch深度学习-----神经网络的卷积操作
Pytorch深度学习-----神经网络之卷积层用法详解
Pytorch深度学习-----神经网络之池化层用法详解及其最大池化的使用
Pytorch深度学习-----神经网络之非线性激活的使用(ReLu、Sigmoid)
Pytorch深度学习-----神经网络之线性层用法
Pytorch深度学习-----神经网络之Sequential的详细使用及实战详解
Pytorch深度学习-----损失函数(L1Loss、MSELoss、CrossEntropyLoss)
Pytorch深度学习-----优化器详解(SGD、Adam、RMSprop)
Pytorch深度学习-----现有网络模型的使用及修改(VGG16模型)
Pytorch深度学习-----神经网络模型的保存与加载(VGG16模型)
Pytorch深度学习-----完整神经网络模型训练套路


文章目录

  • 系列文章目录
  • 一、cpu上训练和gpu上训练两者的区别
  • 二、进行gpu训练的方法步骤
    • 1.检查GPU是否可用,并将其作为计算设备(device)。
    • 2.将模型移动到GPU上
    • 3.将数据(imgs和targets)也移动到GPU上。
    • 4.将损失函数转移到device上去
  • 三、代码
  • 四、总结


一、cpu上训练和gpu上训练两者的区别

计算速度: GPU在并行计算上具有显著优势。相比于CPU,GPU拥有更多的计算核心,可以同时执行多个计算任务。神经网络的训练过程包含大量的矩阵运算和卷积操作,这些操作在GPU上可以并行计算,从而加速整个训练过程。CPU的计算能力较低,无法进行如此大规模的并行计算,导致在训练大型神经网络时速度较慢。

内存容量: GPU通常拥有更大的内存容量,可以存储和处理更大的数据集。在深度学习中,通常需要加载大量的训练数据,并将其保存在内存中以供模型训练使用。GPU的大内存容量可以容纳更多的数据,从而支持训练更大规模的模型。而CPU的内存容量相对较小,限制了可以处理的数据量。

并行性支持: GPU的架构被设计用于高度并行计算,这与神经网络的计算需求完美契合。神经网络中的许多计算操作,如矩阵乘法和卷积运算,可以通过并行计算在GPU上高效执行。GPU的并行计算能力使得神经网络在训练过程中能够同时处理多个数据样本,提高了训练速度。而在CPU上,由于较少的计算核心和较低的内存带宽,无法实现如此高效的并行计算。

总之,使用GPU进行神经网络模型训练相对于CPU具有更快的计算速度、更大的内存容量和更好的并行性支持。这使得GPU成为深度学习领域的重要工具,能够加速模型训练过程,处理更大规模的数据和网络。然而,对于一些小型模型和较小规模的数据集,使用CPU进行训练仍然是可行的选择。

二、进行gpu训练的方法步骤

以下步骤针对上一章节Pytorch深度学习-----完整神经网络模型训练套路里的代码进行总结

1.检查GPU是否可用,并将其作为计算设备(device)。

# 检查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

使用上述代码后如果可以用就是gpu进行训练,不可以用就是要cpu。

2.将模型移动到GPU上

通过调用to(device)方法将模型的参数和缓冲区移动到指定的设备上。

# 将模型移动到GPU上
lgl = lgl.to(device)

3.将数据(imgs和targets)也移动到GPU上。

在迭代训练和测试数据之前,将数据(imgs和targets)也移动到GPU上。

# 将数据移动到GPU上
imgs = imgs.to(device)
targets = targets.to(device)

4.将损失函数转移到device上去

# 将损失函数转换到device上去
loss_fn = loss_fn.to(device)

三、代码

import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# 加载自己搭建的神经网络
from model import *
'''
检查gpu是否可以用,并定义设备
'''
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
"""
1.数据集加载
"""
# 准备训练数据集
train_data = torchvision.datasets.CIFAR10(root="dataset", train=True, transform=torchvision.transforms.ToTensor(), download=True)
# 准备测试数据集
test_data = torchvision.datasets.CIFAR10(root="dataset", train=False, transform=torchvision.transforms.ToTensor(), download=True)
# 训练数据集的长度
train_data_sise = len(train_data)
print("训练数据集的长度为:{}".format(train_data_sise))
# 测试数据集的长度
test_data_sise = len(test_data)
print("测试数据集的长度:{}".format(test_data_sise))
# 加载数据集
train_dataloader = DataLoader(test_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)
"""
2.模型的创建,这里直接from model import * 故下面直接调用
"""
# 实例化网络模型
lgl = Lgl()
'''
将模型移动到GPU上
'''
lgl = lgl.to(device)
"""
3.损失函数和优化器
"""
# 定义交叉熵损失函数
loss_fn = nn.CrossEntropyLoss()
'''
# 将损失函数转换到device上去
'''
loss_fn = loss_fn.to(device)
# 进行优化器
learning_rate = 1e-2
optimizer = torch.optim.SGD(lgl.parameters(), lr=learning_rate)
"""
4.训练循环步骤
4.1 为训练做的参数准备工作
"""
# 开始设置训练神经网络的一些参数
# 记录训练的次数
total_train_step = 0
# 记录测试的次数
total_test_step = 0
# 记录是第几轮训练
epoch = 10
# 添加Tensorboard
writer = SummaryWriter("logs")
for i in range(epoch):
    print("----第{}轮训练开始----".format(i))
    """
    4.2 训练循环
    """
    # 训练步骤
    for data in train_dataloader:
        '''
        将数据(imgs和targets)也移动到GPU上
        '''
        imgs, targets = data
        imgs = imgs.to(device)
        targets = targets.to(device)
        outputs = lgl(imgs)
        loos_result = loss_fn(outputs, targets)
        # 优化器优化模型
        # 将上一轮的梯度清零
        optimizer.zero_grad()
        # 借助梯度进行反向传播
        loos_result.backward()
        optimizer.step()

        total_train_step = total_train_step + 1
        if total_train_step % 100 == 0:
            print("训练次数:{}, loss:{}".format(total_train_step, loos_result.item()))
            writer.add_scalar("train_loos", loos_result.item(), total_train_step)
    """
    5.测试循环
    """
    # 测试步骤开始
    total_test_loos = 0
    with torch.no_grad():
        for imgs, targets in test_dataloader:
            '''
            将数据(imgs和targets)也移动到GPU上
            '''
            imgs = imgs.to(device)
            targets = targets.to(device)
            outputs = lgl(imgs)
            loos_result = loss_fn(outputs, targets)
            total_test_loos = total_test_loos + loos_result.item()
    """
    6.测试过程的记录和输出
    """
    print("整体测试集上损失函数loos:{}".format(total_test_loos))
    writer.add_scalar("test_loos", total_test_loos, total_test_step)
    total_test_step = total_test_step + 1
    torch.save(lgl, "test_{}.pth".format(i))
    print("模型已保存")
"""
7.结束训练步骤
"""
writer.close()

控制台

训练数据集的长度为:50000
测试数据集的长度:10000
----0轮训练开始----
训练次数:100, loss:2.285776138305664
整体测试集上损失函数loos:358.6167891025543
模型已保存
----1轮训练开始----
训练次数:200, loss:2.2544846534729004
训练次数:300, loss:2.2689497470855713
整体测试集上损失函数loos:353.03117847442627
模型已保存
----2轮训练开始----
训练次数:400, loss:2.2088890075683594
整体测试集上损失函数loos:340.509489774704
模型已保存
----3轮训练开始----
训练次数:500, loss:2.087219476699829
训练次数:600, loss:1.967397928237915
整体测试集上损失函数loos:348.03623950481415
模型已保存
----4轮训练开始----
训练次数:700, loss:2.0620810985565186
整体测试集上损失函数loos:337.03663420677185
模型已保存
----5轮训练开始----
训练次数:800, loss:1.952288031578064
训练次数:900, loss:1.8533779382705688
整体测试集上损失函数loos:323.8458157777786
模型已保存
----6轮训练开始----
训练次数:1000, loss:1.8331818580627441
整体测试集上损失函数loos:310.2507711648941
模型已保存
----7轮训练开始----
训练次数:1100, loss:1.924048662185669
训练次数:1200, loss:2.0032200813293457
整体测试集上损失函数loos:298.8608967065811
模型已保存
----8轮训练开始----
训练次数:1300, loss:1.7624551057815552
训练次数:1400, loss:1.6117074489593506
整体测试集上损失函数loos:289.42032492160797
模型已保存
----9轮训练开始----
训练次数:1500, loss:1.7228881120681763
整体测试集上损失函数loos:281.9151908159256
模型已保存

tensorboard面板
在这里插入图片描述

四、总结

在代码中,通过调用torch.device("cuda")来指定使用GPU进行计算。这是一种通用的方式,可以让PyTorch自动选择当前系统中的可用GPU。如果系统中有多个GPU可用,PyTorch将默认使用第一个可用的GPU作为计算设备。

如果你希望明确指定使用哪一块GPU,可以使用torch.device("cuda:0")来指定使用第一块GPU,或者使用torch.device("cuda:1")来指定使用第二块GPU,以此类推。例如,如果你的系统有两块GPU,你可以将以下代码用于指定使用第二块GPU:

device = torch.device("cuda:1" if torch.cuda.is_available() else "cpu")

通过这种方式,你可以明确指定使用哪一块GPU来进行计算。需要注意的是,具体的GPU编号取决于系统中GPU的配置和可用情况,可以通过运行torch.cuda.device_count()来查看系统中可用的GPU数量以及它们的编号。

在这里插入图片描述

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

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

相关文章

css3新增选择器总结

目录 一、属性选择器 二、结构伪类选择器 三、伪元素选择器 四、UI状态伪类选择器 五、反选伪类选择器 六、target选择器 七、父亲选择器、后代选择器 八、相邻兄弟选择器、兄弟们选择器 一、属性选择器 (除IE6外的大部分浏览器支持) E&#…

数据库设计,理解第二范式和第三范式的区别

在学习数据库范式的时候,很多人搞不清第二范式和第三范式他到底是有啥区别。 想讲清楚第二范式与第三范式的区别,不得不聊到键和相关属性的概念 键和相关属性的概念 范式的定义会使用到主健和候选健,数据库中的健(Key)由一个或…

STM32F103C8T6开发笔记1:有线陀螺仪二自由度机械臂

经过之前几天的快速学习,今日尝试组装一款基于MPU6050陀螺仪控制的二自由度机械臂,本文对其使用器材以及基本原理进行介绍~ 组装效果图: 主要元器件如下: 器件个数15 KG以上 舵机3适合舵机的金属夹爪118650电池电源12V1云台支架2…

工博士与纷享销客达成战略合作,开启人工智能领域合作新篇章

近日&#xff0c;工博士与纷享销客在上海正式签署了战略合作协议&#xff0c;正式拉开了双方在人工智能与数字营销领域的合作序幕。这次合作将为双方带来更多机遇和发展空间&#xff0c;并为全球人工智能领域的客户提供更高效、智能的CRM解决方案。 < 双方项目人员合影 >…

React如何配置env环境变量

React版本&#xff1a; "react": "^18.2.0" 1、在package.json平级目录下创建.env文件 2、在‘.env’文件里配置环境变量 【1】PUBLIC_URL 描述&#xff1a;编译时文件的base-href 官方描述&#xff1a; // We use PUBLIC_URL environment variable …

③ vue组件

vue组件创建 在App.vue中添加。 技巧&#xff1a;先import&#xff0c;把vue组件地址写出来。然后在template中写名字。剩下的就自动生成。要看下import有没有多生成什么。 注意1&#xff1a; 注意2&#xff1a; 不只是能在App.vue中引入组件。任意组件中都可以引用其他组件…

msvcp110.dll丢失怎样修复,msvcp110.dll丢失修复方法

msvcp110.dll是Microsoft C库的一部分&#xff0c;它是运行依赖于该库的程序所必需的动态链接库文件。它的作用是提供C运行时库函数的实现&#xff0c;这些函数用于处理程序的内存管理、异常处理、多线程支持等。当系统中缺少或损坏了msvcp110.dll文件时&#xff0c;请及时修复…

STM32--TIM定时器(1)

文章目录 TIM简介定时器类型 通用定时器预分频器时序计数器时序定时中断基本结构TIM内部中断工程TIM外部中断工程 TIM简介 STM32的TIM&#xff08;定时器&#xff09;是一种非常常用的外设&#xff0c;用于实现各种定时和计数功能。它是基于时钟信号进行计数&#xff0c;并在计…

Redis的单线程与多线程

Redis的核心处理逻辑一直都是单线程 有一些分支模块是多线程(某些异步流程从4.0开始用的多线程&#xff0c;例如UNLINK、FLUSHALL ASYNC、FLUSHDB ASYNC等非阻塞的删除操作。网络I/O解包从6.0开始用的是多线程;) 为什么是单线程 多线程多好啊可以利用多核优势 官方给的解释 …

二、编写第一个 Spring MVC 程序

文章目录 一、编写第一个 Spring MVC 程序 一、编写第一个 Spring MVC 程序 代码示例 创建 maven 项目&#xff0c;以此项目为父项目&#xff0c;在父项目的 pom.xml 中导入相关依赖 <dependencies><dependency><groupId>junit</groupId><artifactI…

阿里云ACP知识点

前言&#xff1a;记录ACP错题 1、在创建阿里云ECS时&#xff0c;每台服务器必须要包含_______用来存储操作系统和核心配置。 系统盘&#xff08;不是实例&#xff0c;实例是一个虚拟的计算环境&#xff0c;由CPU、内存、系统盘和运行的操作系统组成&#xff1b;ESC实例作为云…

web基础和tomcat的安装,部署jpress应用

目录 1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。 1. 简述静态网页和动态网页的区别。 【1】定义区别 请求响应信息&#xff0c;发给客户端进行处理&#xff0c;由浏览…

81. 搜索旋转排序数组 II

题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 解题思路&#xff1a; 解法一&#xff1a;直接从前往后搜索&#xff0c;时间复杂度O(n) AC代码&#xff1a; class Solution {public boolean search(int[] nums, int target)…

在收藏夹里“积灰”的好东西——“收藏从未停止,行动从未开始”

方向一&#xff1a;分享一道你收藏的好题 小雅兰刚学数据结构与算法的时候&#xff0c;学的真的是很吃力&#xff0c;感觉链表真的特别的难&#xff0c;在学习了后面的知识之后&#xff0c;发现链表慢慢变得简单了&#xff0c;若是放在现在&#xff0c;小雅兰仍然觉得链表的知…

JProfiler —CPU评测

当JProfiler测量方法调用的执行时间及其调用堆栈时&#xff0c;我们称之为“CPU评测”。这些数据以多种方式呈现。根据你试图解决的问题&#xff0c;其中一个或另一个演示将是最有帮助的。默认情况下不会记录CPU数据&#xff0c;您必须打开CPU记录才能捕获有趣的用例。 一、调…

密码破解!字典攻击(C/C++代码实现)

字典攻击是一种通过系统地将字典中的每个单词作为密码输入&#xff0c;从而侵入受密码保护的计算机、网络或其他IT资源的方法。字典攻击也可以用于查找解密加密消息或文档所需的密钥。 字典攻击之所以有效&#xff0c;是因为许多计算机用户和企业坚持使用普通单词作为密码。这…

苏纷享首届生态人脉会成功举办,纷享销客助力伙伴共同发展

近日&#xff0c;纷享销客&苏纷享成功举办了首届生态人脉会&#xff0c;该活动于8月3日下午在苏州东方之门举行。本次会议汇聚了来自近20家企业的销售精英&#xff0c;包括金蝶、泛微、夏谷、蚂蚁分工、创享、黑湖智造等众多知名企业。会议秉持着“建立生态、共同发展、深耕…

软工导论知识框架(九)软件项目管理

通过计划、组织、控制一系列活动&#xff0c;合理配置使用资源&#xff0c;达到既定目标的活动。项目管理优先于任何技术之前&#xff0c;并且贯穿于整个软件生命周期全过程。 一.软件规模度量 1.代码行技术 估计每个功能需要源代码&#xff08;参考类似项目的历史数据&#…

论文详解 ——《SNR-Aware Low-light Image Enhancement》

文章目录 Abstract1.Introduction2. Related Work3. Our Method3.1 Long- and Short-range Branches3.2 SNR-based Spatially-varying Feature Fusion3.3 SNR-guided Attention in Transformer3.4 Loss Function 4. Experiments4.1. Datasets and Implementation Details4.2 Co…

实验二十七、电压传输特性的测量

一、题目 利用 Multisim 测试图1 所示各电路的电压传输特性。 图 1 电压比较器 图1\,\,电压比较器 图1电压比较器 二、仿真注意事项 &#xff08;1&#xff09;仿真电路所有的 A \textrm A A 均采用虚拟电压比较器。合理选择稳压管的限流电阻&#xff0c;使其既稳压又不至于…