探索PyTorch:从入门到实践的demo全解析

news2025/1/1 8:40:56

探索PyTorch:从入门到实践的demo全解析

  • 一、环境搭建:PyTorch的基石
    • (一)选择你的“利器”:安装方式解析
    • (二)步步为营:详细安装步骤指南
  • 二、基础入门demo:点亮第一盏灯
    • (一)张量操作:深度学习的“积木”
    • (二)自动求导:模型学习的“幕后英雄”
  • 三、数据处理demo:喂饱你的模型
    • (一)Dataset与DataLoader:数据加载的“黄金搭档”
    • (二)数据预处理:打磨数据的“利器”
  • 四、模型构建demo:搭建智慧大脑
    • (一)构建简单神经网络:从感知机到多层网络
    • (二)经典卷积神经网络:图像识别的“神器”
  • 五、模型训练与优化demo:雕琢模型的艺术
    • (一)损失函数:模型的“指南针”
    • (二)优化器:攀登高峰的“助力器”
  • 六、进阶应用demo:拓展无限可能
    • (一)生成对抗网络:创造的“魔法”
    • (二)迁移学习:站在巨人肩膀上的“智慧”
  • 七、多卡并行训练demo:加速前进的“引擎”
    • (一)单机多卡设置:开启并行之路
    • (二)多机多卡探索:分布式训练的“星辰大海”
  • 八、PyTorch的未来展望

开启PyTorch之旅
在这里插入图片描述

在深度学习的广袤天地里,PyTorch已然成为一颗璀璨夺目的明星,熠熠生辉。它由Facebook人工智能研究团队精心打造,以其卓越的性能、简洁的语法和强大的功能,为广大研究者和开发者提供了一个得心应手的工具,助力他们在深度学习的征程中披荆斩棘,探索未知。
无论是初出茅庐、对深度学习满怀热忱的新手,还是经验丰富、在领域内深耕多年的行家,这篇PyTorch Demo大全都将成为你们不可或缺的得力助手。对于新手而言,它宛如一座明亮的灯塔,照亮你们前行的道路,引领你们从PyTorch的基础知识学起,逐步掌握其核心概念与操作技巧,通过一个个精心设计的Demo,让你们在实践中感受深度学习的魅力,从而顺利踏入这一充满挑战与机遇的领域。而对于资深开发者,这里的高级Demo和实战案例,则像是一把把精准的手术刀,帮助你们深入剖析复杂模型的构建与优化,探索前沿技术的应用,让你们在深度学习的前沿阵地不断突破创新,攀登更高的技术巅峰。
深度学习绝非纸上谈兵,唯有通过大量的实践,才能真正领悟其中的奥秘。接下来,就让我们怀揣着对知识的渴望,携手踏入PyTorch的精彩世界,用代码书写属于我们的深度学习传奇。

一、环境搭建:PyTorch的基石

(一)选择你的“利器”:安装方式解析

在开启PyTorch之旅前,我们需先为其搭建一个稳固的“家园”,也就是安装环境。目前,常见的安装方式有Anaconda和pip,它们各有千秋,适用于不同的场景。
Anaconda宛如一位贴心的管家,为我们提供了一站式的解决方案。它不仅内置了丰富多样的科学计算库,如NumPy、SciPy等,还具备强大的环境管理功能,能让我们在同一台机器上轻松切换不同版本的Python环境,避免项目间的包冲突,就像为每个项目都打造了一个独立的“小天地”。对于初学者或是需要同时进行多个不同项目开发的研究者来说,Anaconda无疑是绝佳选择,它能让复杂的环境配置变得简单有序,让你专注于代码创作。
而pip则像是一把轻便的瑞士军刀,简洁高效。它是Python的原生包管理工具,使用起来直接明了。如果你对Python环境已经较为熟悉,且项目需求相对单一,只需要快速安装PyTorch及其依赖,pip便能迅速满足你的需求,无需额外安装庞大的Anaconda套件。不过,使用pip时要格外留意包的版本兼容性,以免引发冲突。

(二)步步为营:详细安装步骤指南

接下来,以Anaconda为例,为大家详细介绍PyTorch的安装步骤。
首先,前往Anaconda官网(https://www.anaconda.com/)下载适合你操作系统的版本,安装过程如同普通软件安装一般,一路“Next”即可,但需注意在选择安装路径时,尽量避开系统盘(C盘),以防日后系统重装导致数据丢失。安装完成后,打开Anaconda Prompt(Windows系统)或终端(Mac/Linux系统)。
第一步,创建虚拟环境,输入以下命令:

conda create -n pytorch_env python=3.8

这里我们创建了一个名为“pytorch_env”的虚拟环境,并指定Python版本为3.8,你可根据实际需求调整。创建过程中,终端会提示你安装一些依赖包,输入“y”确认即可。
第二步,激活虚拟环境:

conda activate pytorch_env

激活后,你会发现命令行前缀变为“(pytorch_env)”,表明已成功进入该环境。
第三步,安装PyTorch。前往PyTorch官网(https://pytorch.org/),在首页你会看到一个配置安装选项的区域。根据你的电脑硬件配置(是否有GPU及对应的CUDA版本),选择相应的选项,官网会自动生成适合你的安装命令。例如,若你有NVIDIA GPU且CUDA版本为11.3,安装命令可能如下:

conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch

将此命令复制到已激活的Anaconda Prompt中,回车执行,Anaconda便会自动从指定源下载并安装PyTorch及其相关依赖库,静静等待安装完成即可。
安装完成后,不妨进行一个小测试,在命令行中输入“python”进入Python交互环境,再输入以下代码:

import torch
print(torch.__version__)

若能成功输出PyTorch的版本号,恭喜你,PyTorch已成功安装,你的深度学习探索之旅正式启航!

二、基础入门demo:点亮第一盏灯

(一)张量操作:深度学习的“积木”

在PyTorch的世界里,张量(Tensor)宛如神奇的积木,是构建一切模型与算法的基石。它恰似一位千变万化的魔术师,可以轻松化身为不同形状、不同维度的数据载体,为我们在深度学习的海洋中畅游提供了便利。
创建张量的方式多种多样,犹如开启一扇扇通往不同数据世界的大门。你可以使用torch.rand函数,像一位随机的艺术家,挥洒灵感,创造出元素值在0到1之间均匀分布的张量,为模型训练注入随机性;也可用torch.zeros打造全0张量,如同搭建一座宁静的数字空城,等待数据的填充;若想得到全1张量,torch.ones便能满足需求,它像是点亮了一盏盏明灯,让数据空间充满光明。而torch.tensor则像一位精准的工匠,能根据给定的具体数据雕琢出定制化的张量。例如:

import torch

# 生成一个2x3的随机张量,数据在0到1之间均匀分布
random_tensor = torch.rand(2, 3)  
print(random_tensor)

# 创建一个3x4的全0张量
zero_tensor = torch.zeros(3, 4)  
print(zero_tensor)

# 构建一个2x2的全1张量
one_tensor = torch.ones(2, 2)  
print(one_tensor)

# 依据给定数据生成张量
custom_tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])  
print(custom_tensor)

张量的形状变换操作更是为数据处理提供了极大的灵活性,犹如神奇的变形魔法。.view函数宛如一把精巧的手术刀,能够精准地重塑张量的形状,让数据以全新的结构呈现,满足不同模型层的输入要求;.reshape函数则像一位温柔的重塑师,同样可以改变张量的维度排列,且在某些情况下更加智能,能自动推断缺失的维度大小;而.transpose函数好似一位旋转大师,轻松地对张量的维度进行转置,让数据的视角焕然一新。举个例子:

# 先创建一个1维张量
original_tensor = torch.arange(6)  
print(original_tensor)

# 使用view将其变换为2x3的二维张量
reshaped_tensor = original_tensor.view(2, 3)  
print(reshaped_tensor)

# 再用reshape变回1维张量
restored_tensor = reshaped_tensor.reshape(-1)  
print(restored_tensor)

# 创建一个2x3的二维张量
matrix_tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])  
print(matrix_tensor)

# 对其进行转置
transposed_tensor = matrix_tensor.transpose(0, 1)  
print(transposed_tensor)

索引与切片操作让我们能像在数据的宝藏库中精准寻宝一般,快速获取所需的数据片段。通过指定索引,我们可以瞬间定位到张量中的特定元素,如同在星空中找到最耀眼的那颗星;切片操作则能让我们批量获取连续或间隔的数据块,就像从一整条数据项链上取下特定的几段珍珠。例如:

# 构建一个3x4的张量
data_tensor = torch.randn(3, 4)  
print(data_tensor)

# 获取第2行第3列的元素
element = data_tensor[1, 2]  
print(element)

# 取出前两行数据
slice_tensor = data_tensor[:2, :]  
print(slice_tensor)

张量还支持丰富多样的数学运算,它们如同精密的计算器,能高效地处理数据。加法、减法、乘法、除法等基本运算,以及矩阵乘法等高级运算,都能在张量之间流畅地进行。并且,PyTorch遵循广播机制,能自动适配不同形状的张量进行运算,就像一位智慧的协调者,让数据运算无缝对接。例如:

# 生成两个形状不同的张量
tensor_a = torch.randn(2, 3)  
tensor_b = torch.randn(3)  

# 进行加法运算,自动广播
result_add = tensor_a + tensor_b  
print(result_add)

# 执行乘法运算
result_mul = tensor_a * tensor_b  
print(result_mul)

(二)自动求导:模型学习的“幕后英雄”

自动求导机制无疑是PyTorch中最为耀眼的一颗明珠,它默默在幕后发力,为模型的学习与优化提供了强大的动力,宛如一位智慧超群的导师,指引着模型参数一步步走向最优解。
在PyTorch里,每个张量都拥有一个名为.requires_grad的神奇属性,它宛如一盏信号灯,一旦开启(设置为True),PyTorch便会如同一位严谨的记录员,一丝不苟地记录下该张量后续所经历的所有操作,构建起一个精密的计算图。这个计算图恰似一张无形的大网,将张量之间的运算关系紧密相连,为后续的梯度计算铺就道路。例如:

import torch

# 创建一个张量,并开启自动求导
x = torch.tensor([2.0], requires_grad=True)  
print(x)

# 对张量进行操作
y = x ** 2 + 3 * x  
print(y)

当模型的前向传播计算完成,输出结果已然明晰,此时我们便可轻启.backward()函数,它如同冲锋的号角,触发反向传播的进程。在这一过程中,PyTorch会依据链式法则,沿着计算图的脉络,逆向而行,精准计算出每个张量相对于损失函数的梯度,如同沿着河流溯源,找出每一滴水的源头。这些梯度值随后会被妥善存储在张量的.grad属性中,等待我们取用,以更新模型的参数,推动模型不断进化。例如:

# 假设这是损失函数的值,为了演示方便,直接给定
loss = torch.tensor([5.0])  
# 执行反向传播
loss.backward()  
# 查看x的梯度
print(x.grad) 

让我们通过一个更为详细的线性回归示例,深入感受自动求导的魅力。假设我们拥有一组简单的数据点(x, y),期望找到一条最优的直线 y = wx + b,使得这条直线尽可能贴近这些数据点,这就如同在散点的星空中寻找一条最契合的轨迹。我们的目标是最小化损失函数,这里选用均方误差作为衡量标准,它像一把精准的尺子,度量着预测值与真实值之间的差距。

import torch

# 模拟一些输入数据和对应的真实标签
x_data = torch.tensor([[1.0], [2.0], [3.0], [4.0]], dtype=torch.float32)
y_data = torch.tensor([[3.0], [5.0], [7.0], [9.0]], dtype=torch.float32)

# 初始化权重和偏置,开启自动求导
w = torch.tensor([[1.0]], dtype=torch.float32, requires_grad=True)
b = torch.tensor([[0.0]], dtype=torch.float32, requires_grad=True)

# 定义模型预测函数
def forward(x):
    return x @ w + b

# 定义损失函数
def loss_function(y_pred, y_true):
    return ((y_pred - y_true) ** 2).mean()

# 设置学习率和训练轮数
learning_rate = 0.01
epochs = 100

for epoch in range(epochs):
    # 前向传播
    y_pred = forward(x_data)
    # 计算损失
    loss = loss_function(y_pred, y_data)
    # 反向传播
    loss.backward()

    # 更新权重和偏置,手动实现梯度下降
    with torch.no_grad():
        w -= learning_rate * w.grad
        b -= learning_rate * b.grad

        # 梯度清零,为下一次迭代做准备
        w.grad.zero_()
        b.grad.zero_()

    if (epoch + 1) % 10 == 0:
        print(f"Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}")

print(f"Final weights: {w.item():.4f}, bias: {b.item():.4f}")

在这个示例中,每一次迭代都包含了前向传播、损失计算、反向传播以及参数更新的完整流程。在前向传播时,模型依据当前的权重 w 和偏置 b 对输入数据 x_data 进行预测,得出预测值 y_pred;随后,损失函数精确度量出预测值与真实标签 y_data 之间的均方误差 loss。紧接着,反向传播启动,loss.backward() 指令下达后,PyTorch沿着计算图回溯,精确计算出 w 和 b 关于损失函数的梯度,并存储在 .grad 属性中。最后,在 torch.no_grad() 的保护下,我们依据梯度下降算法,小心翼翼地更新 w 和 b 的值,让模型朝着最优解稳步迈进。每经过 10 个训练周期,我们还会查看当前的损失值,以便实时监控模型的学习进展,就像航海时不断校准航向,确保最终能抵达成功的彼岸。

三、数据处理demo:喂饱你的模型

(一)Dataset与DataLoader:数据加载的“黄金搭档”

在深度学习的奇妙旅程中,数据宛如珍贵的燃料,而Dataset与DataLoader则像是一对默契无间的“黄金搭档”,为模型的高效运行源源不断地输送动力。
当我们面对个性化的数据集时,自定义Dataset类就如同打造一把专属的钥匙,开启数据的宝库。它需要我们精心继承torch.utils.data.Dataset基类,并且用心雕琢两个至关重要的魔法方法:getitem__与__len。__getitem__方法宛如一位贴心的向导,它依据给定的索引,精准地穿梭于数据的迷宫之中,将对应的样本数据与标签巧妙提取并返回,确保模型能够按图索骥,获取所需;__len__方法则像是一位严谨的管家,一丝不苟地清点着数据集的样本总数,让模型对数据的规模了如指掌。
假设我们手头有一个猫咪和狗狗图片分类的任务,图片存储在不同的文件夹下,对应的标签便是文件夹名称。下面这段代码便能搭建起一个专属的图片数据集类:

from torch.utils.data import Dataset
from PIL import Image
import os

class CatDogDataset(Dataset):
    def __init__(self, root_dir, transform=None):
        self.root_dir = root_dir
        self.transform = transform
        self.image_paths = []
        self.labels = []
        for label in os.listdir(root_dir):
            label_dir = os.path.join(root_dir, label)
            if os.path.isdir(label_dir):
                for image_name in os.listdir(label_dir):
                    image_path = os.path.join(label_dir, image_name)
                    self.image_paths.append(image_path)
                    self.labels.append(label)

    def __getitem__(self, index):
        image_path = self.

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

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

相关文章

hiprint结合vue2项目实现静默打印详细使用步骤

代码地址是:vue-plugin-hiprint: hiprint for Vue2/Vue3 ⚡打印、打印设计、可视化设计器、报表设计、元素编辑、可视化打印编辑 本地安装包地址:electron-hiprint 发行版 - Gitee.com 1、先安装hipint安装包在本地 2、项目运行npm(socket.…

Docker Container 可观测性最佳实践

Docker Container 介绍 Docker Container( Docker 容器)是一种轻量级、可移植的、自给自足的软件运行环境,它在 Docker 引擎的宿主机上运行。容器在许多方面类似于虚拟机,但它们更轻量,因为它们不需要模拟整个操作系统…

GXUOJ-算法-第二次作业

1.矩阵连&#xff08;链&#xff09;乘 问题描述 GXUOJ | 矩阵连乘 代码解答 #include<bits/stdc.h> using namespace std;const int N50; int m[N][N]; int p[N]; int n;int main(){cin>>n;//m[i][j] 存储的是从第 i 个矩阵到第 j 个矩阵这一段矩阵链相乘的最小…

OpenCV计算机视觉 02 图片修改 图像运算 边缘填充 阈值处理

目录 图片修改&#xff08;打码、组合、缩放&#xff09; 图像运算 边缘填充 ​阈值处理 上一篇文章&#xff1a; OpenCV计算机视觉 01 图像与视频的读取操作&颜色通道 图片修改&#xff08;打码、组合、缩放&#xff09; # 图片打码 import numpy as np a cv2.imre…

不修改内核镜像的情况下,使用内核模块实现“及时”的调度时间片超时事件上报

一、背景 之前的博客 不修改内核镜像的情况下&#xff0c;使用内核模块实现高效监控调度时延-CSDN博客 里&#xff0c;我们讲了不修改内核镜像高效监控每次的调度时延的方法。这篇博客里&#xff0c;我们对于调度时间片也做这么一个不修改内核镜像的改进。关于调度时间片过长的…

Flink定时器

flink的定时器都是基于事件时间&#xff08;event time&#xff09;或事件处理时间&#xff08;processing time&#xff09;的变化来触发响应的。对一部分新手玩家来说&#xff0c;可能不清楚事件时间和事件处理时间的区别。我这里先说一下我的理解&#xff0c;防止下面懵逼。…

使用 OpenCV 绘制线条和矩形

OpenCV 是一个功能强大的计算机视觉库&#xff0c;它不仅提供了丰富的图像处理功能&#xff0c;还支持图像的绘制。绘制简单的几何图形&#xff08;如线条和矩形&#xff09;是 OpenCV 中常见的操作。在本篇文章中&#xff0c;我们将介绍如何使用 OpenCV 在图像上绘制线条和矩形…

【Artificial Intelligence篇】AI 前沿探秘:开启智能学习的超维征程

目录 一、人工智能的蓬勃发展与智能学习的重要性: 二、数据的表示与处理 —— 智能学习的基石: 三、构建一个简单的感知机模型 —— 智能学习的初步探索: 四、神经网络 —— 开启超维征程的关键一步: 五、超维挑战与优化 —— 探索智能学习的深度: 六、可视化与交互 —— …

大数据的尽头是数据中台吗?

大数据的尽头是数据中台吗&#xff1f; 2018年末开始&#xff0c;原市场上各种关于大数据平台的招标突然不见&#xff0c;取而代之的是数据中台项目&#xff0c;建设数据中台俨然成为传统企业数字化转型首选&#xff0c;甚至不少大数据领域的专家都认为&#xff0c;数据中台是…

珞珈一号夜光遥感数据地理配准,栅格数据地理配准

目录 一、夜光数据下载&#xff1a; 二、夜光遥感数据地理配准 三、计算夜光数据值 四、辐射定标 五、以表格显示分区统计 五、结果验证 夜光数据位置和路网位置不匹配&#xff0c;虽然都是WGS84坐标系&#xff0c;不匹配&#xff01;&#xff01;&#xff01;不要看到就直接…

3.若依前端项目拉取、部署、访问

因为默认RuoYi-Vue是使用的Vue2,所以需要另外去下载vue3来部署。 拉取代码 git clone https://gitee.com/ys-gitee/RuoYi-Vue3.git 安装node才能执行npm相关的命令 执行命令npm install 如果npm install比较慢的话&#xff0c;需要添加上国内镜像 npm install --registrhttp…

【Java】线程相关面试题 (基础)

文章目录 线程与进程区别并行与并发区别解析概念含义资源利用执行方式应用场景 创建线程线程状态如何保证新建的三个线程按顺序执行wait方法和sleep方法的不同所属类和使用场景方法签名和参数说明调用wait方法的前提条件被唤醒的方式与notify/notifyAll方法的协作使用示例注意事…

手机租赁平台开发全攻略打造高效便捷的租赁服务系统

内容概要 手机租赁平台开发&#xff0c;简单说就是让用户能轻松租赁各类手机的高效系统。这一平台不仅帮助那些想要临时使用高端手机的人们节省了不少资金&#xff0c;还为商家开辟了新的收入渠道。随着智能手机的普及&#xff0c;很多人并不需要长期拥有一部手机&#xff0c;…

【视觉惯性SLAM:十一、ORB-SLAM2:跟踪线程】

跟踪线程是ORB-SLAM2的核心之一&#xff0c;其主要任务是实时跟踪相机的位姿变化和场景的变化&#xff0c;以维持地图的更新和相机轨迹的估计。ORB-SLAM2的跟踪线程通过多种方式&#xff08;参考关键帧跟踪、恒速模型跟踪、重定位跟踪、局部地图跟踪&#xff09;处理跟踪丢失、…

浙江肿瘤医院病理库存储及NAS共享存储(磁盘阵列)方案-Infortrend普安科技

Infortrend金牌代理-燊通智联信息科技发展&#xff08;上海&#xff09;有限公司与院方多轮沟通&#xff0c;详细讨论性能与容量要求&#xff0c;最终决定采用GSe统一存储设备&#xff0c;与现有病理系统服务器无缝对接&#xff0c;每台设备配1.92T SSD作缓存加速原数据读写&am…

解决GPT公式复制到Word之后乱码问题

chat辅助确实很有用。不论是出文稿还是代码。如何把chatgpt中的公式直接复制到word中且保持原样格式呢&#xff1f;下面的方法经过我的验证确实好用&#xff0c;成功解决了最近的论文报告写公式的问题。 一、首先复制chatgpt里面的公式 二、粘贴在下面网站 网站&#xff1a;Mat…

Spring Boot教程之四十:使用 Jasypt 加密 Spring Boot 项目中的密码

如何使用 Jasypt 加密 Spring Boot 项目中的密码 在本文中&#xff0c;我们将学习如何加密 Spring Boot 应用程序配置文件&#xff08;如 application.properties 或 application.yml&#xff09;中的数据。在这些文件中&#xff0c;我们可以加密用户名、密码等。 您经常会遇到…

Quartz任务调度框架实现任务动态执行

说明&#xff1a;之前使用Quartz&#xff0c;都是写好Job&#xff0c;指定一个时间点&#xff0c;到点执行。最近有个需求&#xff0c;需要根据前端用户设置的时间点去执行&#xff0c;也就是说任务执行的时间点是动态变化的。本文介绍如何用Quartz任务调度框架实现任务动态执行…

Scala_【1】概述

第一章 语言特点环境搭建(Windows)idea编写scalaHelloWorld注意事项 Scala是一门以Java虚拟机&#xff08;JVM&#xff09;为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言 语言特点 Scala是一门多范式的编程语言&#xff0c;Scala支持面向对象和函…

StableAnimator模型的部署:复旦微软提出可实现高质量和高保真的ID一致性人类视频生成

文章目录 一、项目介绍二、项目部署模型的权重下载提取目标图像的关节点图像&#xff08;这个可以先不看先用官方提供的数据集进行生成&#xff09;提取人脸&#xff08;这个也可以先不看&#xff09;进行图片的生成 三、模型部署报错 一、项目介绍 由复旦、微软、虎牙、CMU的…