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

探索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.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vulnhub靶机billu_b0x精讲

靶机下载 https://www.vulnhub.com/entry/billu-b0x,188/ 信息收集 扫描存活主机 nmap -sP 192.168.73.0/24 192.168.73.141为目标主机,对其进行进一步信息收集 端口扫描 nmap --min-rate10000 -p- 192.168.73.141 目标只开放了22和80端口 针对端口进行TCP探…

碰一碰发视频矩阵系统源码搭建,支持OEM

一、引言 随着短视频的火爆发展,碰一碰发视频的矩阵系统逐渐受到关注。这种系统能够实现用户通过碰一碰设备(如 NFC 标签)快速触发视频的发布,在营销推广、互动体验等领域有着广泛的应用前景。本文将详细介绍碰一碰发视频矩阵系统…

使用Kubernetes部署MySQL+WordPress

目录 前提条件 部署MySQL和WordPress 编写yaml文件 应用yaml文件 存在问题及解决方案 创建PV(持久化卷) 创建一个PVC(持久化卷声明) 部署添加PVC 查看PV对应的主机存储 删除资源 查看资源 删除deployment和service 查看主机数据 删除PVC和PV 删除主机数据 前提条…

Python笔记(6)-文件及IO操作

文件的基本操作 python操作文件的步骤: 1、打开文件: 变量名open(filename,mode,encoding) 2、操作文件: 变量名.read() 变量名.writer(s) 3、关闭文件: 变量名.close() def my_write():#1、(创建)…

windows系统下使用cd命令切换到D盘的方法

windows系统下使用cd命令切换到D盘的方法 系统环境配置 win10系统原装C盘后期自己安装的硬盘D盘 python3.8安装在D盘中 问题说明 winR打开终端,使用 cd d:命令,无法将当前目录切换到D盘 解决方法 方法一:使用下面这条命令 cd /d d:运…

iOS 苹果开发者账号: 查看和添加设备UUID 及设备数量

参考链接:苹果开发者账号下添加新设备UUID - 简书 如果要添加新设备到 Profiles 证书里: 1.登录开发者中心 Sign In - Apple 2.找到证书设置: Certificate,Identifiers&Profiles > Profiles > 选择对应证书 edit &g…

香橙派5Plus启动报错bug: spinlock bad magic on cpu#6, systemd-udevd/443

一、问题 如图: 接上调试串口,每次启动都会报错。不过使用过程中没有发现有什么影响。 百度查阅,有一位博主提到,但是没有细说解决方案: spinlock变量没有初始化_spinlock bad magic on-CSDN博客https://blog.csdn.n…

小程序配置文件 —— 13 全局配置 - window配置

全局配置 - window配置 这里讲解根目录 app.json 中的 window 字段,window 字段用于设置小程序的状态栏、导航条、标题、窗口背景色; 状态栏:顶部位置,有网络信号、时间信息、电池信息等;导航条:有一个当…

UI页面布局分析(4)- 贵族 特权分页列表

引言 在现在移动应用中,展示用户特权的UI设计不仅是吸引用户的关键手段,更是提升产品体验的重要部分。特别是在直播场景中,贵族特权作为一种高价值用户身份的象征,通常需要通过精致的页面和流程的交互来突出其重要性和独特性。 …

Spring Boot教程之三十九: 使用 Maven 将 Spring Boot 应用程序 Docker 化

如何使用 Maven 将 Spring Boot 应用程序 Docker 化? Docker是一个开源容器化工具,用于在隔离环境中构建、运行和管理应用程序。它方便开发人员捆绑其软件、库和配置文件。Docker 有助于将一个容器与另一个容器隔离。在本文中,为了将Spring B…

【208】车辆管理系统

--基于SSM车辆管理系统 主要功能: 个人中心 员工管理 用户管理 基础数据管理 车辆管理 保养登记管理 事故登记管理 维修登记管理 违章登记管理 开发技术栈: 开发语言 : Java 开发软件 : Eclipse/MyEclipse/IDEA JDK版本 : JDK8 开发框架 : SSM 服务器 : Tomcat8/…

Linux系统编程——线程

目录 一、前言 二、线程 1、线程的理解 三、线程相关的接口 1、线程的创建 2、线程的等待 3、实验 四、总结 1、线程优点 2、线程缺点 3、线程异常 4、Linux下的进程与线程对比 一、前言 之前的文章中我们已经对进程相关的概念做了认识,从创建进程、子进…

从百度云网盘下载数据到矩池云网盘或者服务器内

本教程教大家如何快速将百度云网盘数据集或者模型代码文件下载到矩池云网盘或者服务器硬盘上。 本教程使用到了一个开源工具 BaiduPCS-Go,官方地址 : https://github.com/qjfoidnh/BaiduPCS-Go 这个工具可以实现“仿 Linux shell 文件处理命令的百度网…

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

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

GitHub 桌面版配置 |可视化界面进行上传到远程仓库 | gitLab 配置【把密码存在本地服务器】

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 桌面版安装包下载clone 仓库操作如下GitLab 配置不再重复输入账户和密码的两个方…

flask后端开发(11):User模型创建+注册页面模板渲染

目录 一、数据库创建和配置信息1.新建数据库2.数据库配置信息3.User表4.ORM迁移 二、注册页面模板渲染1.导入静态文件2.蓝图注册路由 一、数据库创建和配置信息 1.新建数据库 终端中 CREATE DATABASE zhiliaooa DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;2…

OpenAI 12天发布会:AI革命的里程碑@附35页PDF文件下载

在人工智能的浪潮中,OpenAI的12天发布会无疑是2024年科技界的一场盛宴。从12月5日开始,OpenAI连续12天每天发布一个新应用或功能,标志着AI技术的又一次飞跃。本文将梳理这些激动人心的发布,带你一探究竟。 OpenAI发布会概览 Ope…

使 el-input 内部的内容紧贴左边

<el-inputv-model"form.invitor"placeholder"PC端的自动取当前账号的手机号"readonlyclass"no-border-input" />::v-deep(.no-border-input .el-input__inner) { border: none; box-shadow: none; padding-left: 0; /* 确保内容紧贴左边 *…

(南京观海微电子)——GH7009开机黑屏案例分析

一、 现象描述&#xff1a; 不良现象: LVDS模组&#xff0c;开机大概2秒后就黑屏。 二、问题分析 等主机进入Kernel 后做以下测试&#xff1a; 1、手动reset LCM 后 可以显示正常&#xff1b; 总结&#xff1a; 1&#xff09;uboot 部分HS 太窄&#xff0c;仅有4个clk宽度&am…

科技云报到:人工智能时代“三大件”:生成式AI、数据、云服务

科技云报到原创。 就像自行车、手表和缝纫机是工业时代的“三大件”。生成式AI、数据、云服务正在成为智能时代的“新三大件”。加之全球人工智能新基建加速建设&#xff0c;成为了人类社会数字化迁徙的助推剂&#xff0c;让新三大件之间的耦合越来越紧密。从物理世界到数字世…