尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

PyTorch入门必学:Tensor张量创建、属性与操作全解析

PyTorch入门必学:Tensor张量创建、属性与操作全解析 第一次接触 PyTorch 的时候很多人的第一个疑问往往不是“模型怎么搭”而是“Tensor 到底是什么”。安装好环境之后打开 Jupyter输入import torch看着官网文档里满屏的torch.tensor、torch.randn、tensor.shape很容易一头雾水。不管你是准备做图像识别、自然语言处理还是科研实验Tensor 都是绕不开的地基。你可以暂时不背 API但必须理解 Tensor 在 PyTorch 中扮演的角色它是所有神经网络计算的数据载体。本文作为 PyTorch 系列教程的第 1 课会从零开始讲清楚 Tensor 的创建、常用属性与基本操作同时把环境搭建和第一个练手小项目一起跑通适合刚接触深度学习、或者想从 NumPy 过渡到 PyTorch 的同学阅读。1. 为什么先学 TensorPyTorch 的数据地基1.1 Tensor 是什么Tensor 的直译是“张量”。在数学中张量是标量、向量、矩阵的推广在 PyTorch 中Tensor 就是用来存储和计算多维数据的核心数据结构。你可以把它理解成一个“有维度的数组容器”0 维 Tensor一个数类似 Python 中的标量1 维 Tensor一个序列类似一维数组2 维 Tensor一个矩阵类似表格3 维以上 Tensor可以理解为多个矩阵堆叠比如一张彩色图片的形状是[通道数, 高度, 宽度]一批图片的形状是[批量大小, 通道数, 高度, 宽度]。之所以把它叫“张量”而不是“数组”是因为 PyTorch 为 Tensor 设计了 GPU 加速、自动求导、分布式计算等能力这些是普通 Python 列表无法替代的。1.2 Tensor 与 NumPy 的关系如果你学过 NumPy会觉得 Tensor 非常亲切。Tensor 的很多 API 设计思路都参考了 NumPy比如shape、dtype、索引、切片、矩阵运算等。区别在于NumPy 的 ndarray 主要运行在 CPU 上适合传统科学计算PyTorch 的 Tensor 可以无缝切换到 GPU 上运算并且自动记录计算图为深度学习反向传播做准备。两者还可以互相转换。后面会看到numpy()和from_numpy()这两个常用方法。但要注意CPU 上的 Tensor 与 NumPy 数组经常共享底层内存修改一方会影响另一方这一点在工程环境中非常容易踩坑。1.3 本文的学习目标学完这一课你应该能够在本地电脑上完成 PyTorch 的安装与验证使用多种方式创建 Tensor包括从列表创建、从 NumPy 创建、使用内置函数创建看懂 Tensor 的shape、dtype、device、requires_grad这几个核心属性掌握索引切片、形状变换、算术运算、拼接拆分等常用操作写一个不使用nn.Module的最简线性回归理解张量计算与自动求导的基本流程。2. 环境准备与 PyTorch 安装2.1 Python 虚拟环境conda 与 miniforge很多新手一上来就用全局 Python 环境安装 PyTorch结果不同项目之间依赖互相污染时间一长就会出现“这个项目需要 torch 2.x那个项目需要 torch 1.x”的版本冲突。推荐的做法是创建独立虚拟环境。虚拟环境工具很多最常用的是 Anaconda 或 Miniforge。如果你的机器不想装完整的 AnacondaMiniforge 是一个更轻量的选择它对 Python 版本的管理和 conda 命令完全一致。不管用哪种工具核心流程都是一样的创建一个干净的 Python 环境激活这个环境在环境中安装 PyTorch后续所有实验都在这个环境里进行。2.2 创建 PyTorch 专属环境先打开终端Windows 上推荐使用 Anaconda PromptmacOS/Linux 使用普通终端执行下面的命令conda create -n pytorch_env python3.10 -y这条命令会创建一个名为pytorch_env的虚拟环境并指定 Python 3.10。Python 版本可以根据你的需要调整但建议选择当前 PyTorch 官方稳定支持的版本。创建完成后激活环境conda activate pytorch_env激活成功后终端命令行前面会显示(pytorch_env)说明已经在虚拟环境中了。2.3 安装 PyTorch 与版本确认PyTorch 的安装命令因为操作系统、是否有 NVIDIA GPU、CUDA 版本不同而有差异。如果你只是学习 Tensor 基础可以先安装 CPU 版本跑本文所有示例没有任何压力pip install torch如果你有 NVIDIA 显卡希望用 GPU 加速不建议直接照抄网上的旧命令。最稳妥的方式是打开 PyTorch 官网的 Get Started 页面选择你的操作系统、包管理器、CUDA 版本复制官方生成的安装命令。为什么强调这一点因为 PyTorch 版本迭代很快不同版本对应不同的 CUDA 版本直接安装不匹配的二进制包可能装完以后torch.cuda.is_available()仍然返回 False。安装完成后建议先用下面的命令检查版本与 GPU 可用性import torch print(PyTorch 版本, torch.__version__) print(CUDA 是否可用, torch.cuda.is_available()) if torch.cuda.is_available(): print(GPU 名称, torch.cuda.get_device_name(0))如果输出中 CUDA 可用说明 GPU 环境正常如果不可用但你的机器有 NVIDIA 显卡大概率是 CUDA 工具包与 PyTorch 版本不匹配或者显卡驱动版本过旧。2.4 验证安装是否成功验证安装最简单的办法是创建一个小 Tensor 并执行一次简单运算import torch x torch.tensor([[1.0, 2.0], [3.0, 4.0]]) y x.sum() print(x) print(求和结果, y)如果能看到 Tensor 输出并且求和结果为tensor(10.)说明环境已经可以正常使用。部分读者在安装时会遇到网络下载慢的问题解决办法是使用国内 PyPI 镜像或 conda 镜像并按照官方文档调整下载源而不是反复中断安装。3. Tensor 的核心概念维度、形状、数据类型与设备3.1 标量、向量、矩阵与张量在 PyTorch 中判断一个 Tensor 是几维的最直观的方法是数它左边有几个左括号。每多一层括号就多一个维度。import torch # 0 维标量一个数 scalar torch.tensor(5) print(标量, scalar, 维度, scalar.dim()) # 1 维向量一个序列 vector torch.tensor([1, 2, 3]) print(向量, vector, 维度, vector.dim()) # 2 维矩阵二维表格 matrix torch.tensor([[1, 2], [3, 4]]) print(矩阵形状, matrix.shape, 维度, matrix.dim())运行结果可以看到torch.tensor(5)的维度是 0torch.tensor([1, 2, 3])的维度是 1torch.tensor([[1, 2], [3, 4]])的维度是 2。3.2 形状 shape 与维度 dimshape是 Tensor 最核心的属性它描述每个维度上有多少个元素。比如torch.randn(2, 3, 4)表示这是一个三维张量第一维有 2 个元素第二维有 3 个元素第三维有 4 个元素。后续操作中很多报错都来自 shape 不匹配。比如矩阵乘法要求前一个矩阵的列数等于后一个矩阵的行数拼接操作要求除拼接维度外其他维度一致。养成写完代码就打印shape的习惯能省去大量调试时间。3.3 dtype、device 与 requires_graddtype表示 Tensor 的数据类型常见的有torch.float32、torch.float64、torch.int64、torch.bool等。默认情况下torch.tensor([1, 2, 3])会得到整数类型而torch.tensor([1.0, 2.0])会得到浮点类型。神经网络计算通常要求输入为浮点类型如果传入整数张量模型的前向传播经常会直接报错。device表示 Tensor 存储在 CPU 还是 GPU 上。CPU 张量之间的运算只能与 CPU 张量进行GPU 张量同理。如果混用会看到类似 “Expected all tensors to be on the same device” 的报错。requires_grad是 PyTorch 自动求导机制的开关。当你把某个 Tensor 的requires_grad设置为 True 后PyTorch 会记录针对这个 Tensor 的所有计算过程为后续反向传播做准备。这是 PyTorch 和 NumPy 最大的区别之一。4. Tensor 的创建方法详解4.1 从 Python 数据或 NumPy 数组创建最直观的创建方式就是直接从 Python 列表或 NumPy 数组转换import torch import numpy as np # 从 Python 列表创建 a torch.tensor([1, 2, 3]) print(从列表创建, a) # 从嵌套列表创建二维张量 b torch.tensor([[1, 2], [3, 4]]) print(从嵌套列表创建, b) # 从 NumPy 数组创建 array np.array([[5, 6], [7, 8]]) c torch.tensor(array) print(从 NumPy 创建, c) # 也可以使用 from_numpy注意这种转换与原始数组共享内存 d torch.from_numpy(array) print(from_numpy 创建, d)这里需要注意的是torch.tensor(array)会复制数据修改原始 NumPy 数组不会影响 Tensor而torch.from_numpy(array)在 CPU 环境下一般会共享内存修改任意一方另一方也会变化。4.2 常量张量zeros、ones、full、eye在处理数据时经常需要初始化全 0、全 1 或指定值的张量import torch # 全 0 张量 zeros torch.zeros(2, 3) print(全 0 张量\n, zeros) # 全 1 张量 ones torch.ones(2, 3) print(全 1 张量\n, ones) # 填充指定值的张量 full torch.full((2, 3), 7) print(指定值张量\n, full) # 单位矩阵 eye torch.eye(3) print(单位矩阵\n, eye)torch.zeros(2, 3)的参数是希望创建的形状可以传入多个整数。torch.full((2, 3), 7)第一个参数是形状元组第二个参数是填充值。4.3 序列张量arange、linspace当你要生成一段连续的数值序列时arange和linspace是非常常用的工具import torch # arange类似 range从 0 到 9步长为 2 seq1 torch.arange(0, 10, 2) print(arange(0, 10, 2), seq1) # linspace在 [0, 1] 区间均匀取 5 个数 seq2 torch.linspace(0, 1, 5) print(linspace(0, 1, 5), seq2)arange与 Python 内置的range一样左闭右开。linspace三个参数分别是起点、终点、个数它包含终点这一点不要记反。4.4 随机张量rand、randn、randint深度学习中大量使用随机初始化。PyTorch 提供了多种随机张量生成函数import torch # 在 [0, 1) 区间均匀分布 r1 torch.rand(2, 3) print(rand(2, 3)\n, r1) # 标准正态分布均值为 0方差为 1 r2 torch.randn(2, 3) print(randn(2, 3)\n, r2) # 整数均匀分布在 [1, 10) 之间 r3 torch.randint(1, 10, (2, 3)) print(randint(1, 10, (2, 3))\n, r3)这里要区分rand和randn。rand生成 0 到 1 之间的均匀分布随机数randn生成均值为 0、标准差为 1 的标准正态分布随机数。两者在初始化模型参数时的用途不同。5. Tensor 的常用属性5.1 形状相关shape、size()、ndim获取 Tensor 形状有几种等价写法import torch t torch.randn(2, 3, 4) print(shape 属性, t.shape) print(size() 方法, t.size()) print(维度数量, t.dim()) print(元素总数, t.numel())在绝大多数场景中t.shape和t.size()效果一样选择一种你习惯的即可。numel()返回张量中元素的总数比如2 * 3 * 4 24。5.2 数据类型dtype不同创建方式会得到不同默认类型。理解这一点可以避免很多类型不匹配的错误import torch print(torch.tensor([1, 2, 3]).dtype) # 整数torch.int64 print(torch.tensor([1.0, 2.0]).dtype) # 浮点数torch.float32 print(torch.zeros(2, 3).dtype) # 默认浮点torch.float32神经网络中的权重和输入通常要求使用浮点类型。如果从外部读入了整数数据需要显式转换成torch.float32如果从文件加载了双精度数据可能要先转换成float32再参与训练否则会占用更多显存影响计算速度。5.3 设备信息devicedevice返回 Tensor 存放的位置import torch cpu_tensor torch.tensor([1.0, 2.0]) print(CPU 张量, cpu_tensor.device) if torch.cuda.is_available(): gpu_tensor cpu_tensor.cuda() print(GPU 张量, gpu_tensor.device)如果你的电脑有可用的 NVIDIA GPU运行cuda()方法后Tensor 会从 CPU 迁移到 GPU。后续操作需要保证参与运算的所有 Tensor 都在同一设备上。5.4 梯度属性requires_gradrequires_grad默认是 False。创建一个需要梯度的张量有两种方式import torch # 创建时指定 a torch.tensor([1.0, 2.0], requires_gradTrue) # 创建后修改 b torch.tensor([3.0, 4.0]) b.requires_grad_(True) print(a.requires_grad, a.requires_grad) print(b.requires_grad, b.requires_grad)这里要注意只有浮点类型 Tensor 才能开启requires_grad。如果你对一个整数张量执行requires_grad_()PyTorch 会直接报错。6. Tensor 的基本操作6.1 索引与切片Tensor 的索引切片与 Python 列表、NumPy 数组非常相似import torch t torch.arange(12).reshape(3, 4) print(原始张量\n, t) # 取第 1 行 print(第 1 行, t[0]) # 取第 2 行第 3 列 print(第 2 行第 3 列, t[1, 2]) # 前两行、后两列 print(前两行后两列\n, t[:2, 2:]) # 步长切片每隔一列取 print(每隔一列\n, t[:, ::2])运行后可以对照输出理解每个索引的含义。切片操作返回的通常是一个“视图”这意味着修改切片结果可能会影响原 Tensor。这一点与 NumPy 的行为一致。6.2 形状变换view、reshape、transpose在真实项目中数据形状经常需要对不上模型输入所以形状变换是最高频操作之一。import torch t torch.arange(12) print(原始, t.shape) # view 调整形状 v1 t.view(3, 4) print(view(3, 4), v1.shape) # reshape 调整形状 v2 t.reshape(2, 6) print(reshape(2, 6), v2.shape) # 转置矩阵 m torch.randn(2, 3) print(m 的形状, m.shape, 转置后, m.t().shape)view和reshape在大多数情况下可以互换使用。区别在于view要求 Tensor 在内存中是连续存储的而reshape会在需要时自动复制数据。如果你在view时报出 “view size is not compatible” 或连续性错误可以直接改用reshape或者先调用contiguous()。6.3 算术运算与广播机制Tensor 支持加减乘除、矩阵乘法、幂运算、指数运算等import torch a torch.tensor([1.0, 2.0, 3.0]) b torch.tensor([4.0, 5.0, 6.0]) print(加法, a b) print(减法, b - a) print(逐元素乘法, a * b) print(逐元素除法, b / a) # 矩阵乘法 m1 torch.randn(2, 3) m2 torch.randn(3, 4) print(矩阵乘法, (m1 m2).shape)广播机制是 PyTorch 计算中很重要的一点。当两个张量形状不完全一致时PyTorch 会尝试自动扩展较小的张量import torch x torch.randn(3, 4) y torch.randn(4) # y 被广播为 (3, 4)相当于每一行加上相同的 y z x y print(广播相加结果形状, z.shape)这里x是(3, 4)y是(4,)从右往左对齐后y的形状与x的最后一维一致因此可以广播。理解广播有助于写出更简洁的代码也能减少形状不匹配的报错。6.4 拼接、拆分与压缩把多个张量拼在一起或者把一个张量拆成几部分是数据预处理中常做的事。import torch a torch.randn(2, 3) b torch.randn(2, 3) # 按行拼接 cat_dim0 torch.cat([a, b], dim0) print(dim0 拼接形状, cat_dim0.shape) # (4, 3) # 按列拼接 cat_dim1 torch.cat([a, b], dim1) print(dim1 拼接形状, cat_dim1.shape) # (2, 6) # 均等拆分 chunks torch.chunk(cat_dim1, 2, dim1) print(拆分后的数量, len(chunks)) # 压缩维度去掉长度为 1 的维度 t torch.randn(1, 3, 1) print(原始形状, t.shape, 压缩后, t.squeeze().shape) # 增加维度 print(增加维度后, t.unsqueeze(0).shape)dim参数是最容易搞混的地方。dim0表示在第 0 维上拼接结果是行数增加dim1表示在第 1 维上拼接结果是列数增加。6.5 归约计算sum、mean、max统计类操作也是必备技能。sum求和、mean求均值、max求最大值都可以指定沿着哪个维度计算import torch t torch.arange(6, dtypetorch.float32).reshape(2, 3) print(张量\n, t) print(全局求和, t.sum()) print(全局均值, t.mean()) print(沿 dim0 求和每一列, t.sum(dim0)) print(沿 dim1 求和每一行, t.sum(dim1)) # 返回最大值和最大值所在索引 max_value, max_index t.max(dim1) print(每行最大值, max_value) print(每行最大值索引, max_index)注意当指定dim参数后原维度会被删除所以结果形状会发生变化。如果你希望保留维度可以使用keepdimTrue参数这在后续拼接和模型构建中经常会用到。7. 综合实战用 Tensor 手动实现线性回归这一节我们暂时不用nn.Module不搭完整神经网络只用 Tensor 和自动求导完成一个最简单的线性回归。通过这个小项目你能直观地看到张量计算与 PyTorch 自动求导是如何配合的。7.1 实战目标与流程假设有一批数据符合近似线性关系y 2 * x 1但数据中混入了一些噪声。我们需要通过训练找到一个权重w和偏置b使得模型输出y_pred w * x b能尽可能接近真实数据。流程分为四步生成模拟数据初始化参数定义损失函数通过梯度下降更新参数迭代多个轮次。7.2 生成模拟数据先构造 100 个在[0, 10]区间内均匀分布的训练样本import torch import matplotlib.pyplot as plt # 固定随机种子保证结果可复现 torch.manual_seed(42) # 生成 x 数据 x torch.linspace(0, 10, 100).reshape(-1, 1) # 真实关系y 2 * x 1加入少量噪声 true_w 2.0 true_b 1.0 y true_w * x true_b torch.randn_like(x) * 0.5这里randn_like(x)生成与x形状相同的标准正态随机数* 0.5是让噪声幅度小一些。如果你希望可视化可以继续执行plt.scatter(x.numpy(), y.numpy(), alpha0.6) plt.xlabel(x) plt.ylabel(y) plt.title(模拟数据分布) plt.show()注意matplotlib无法直接处理 Tensor所以这里调用.numpy()转回 NumPy 数组。7.3 定义参数与前向计算我们需要随机初始化w和b并打开requires_grad# 初始化为 1.0 w torch.tensor([[1.0]], requires_gradTrue) b torch.tensor([[0.0]], requires_gradTrue) # 前向计算 def predict(x): return x w b这里表示矩阵乘法。输入x的形状是(100, 1)w的形状是(1, 1)得到的y_pred形状也是(100, 1)。b是一个标量形状的(1, 1)在广播机制下会加到每一行上。7.4 定义损失与反向传播线性回归的常用损失函数是均方误差。我们不调用现成的nn.MSELoss而是手动计算def mse_loss(y_pred, y_true): return ((y_pred - y_true) ** 2).mean()训练过程如下learning_rate 0.01 epochs 200 for epoch in range(epochs): # 前向传播 y_pred predict(x) # 计算损失 loss mse_loss(y_pred, y) # 反向传播计算 w 和 b 的梯度 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) % 50 0: print(fEpoch {epoch 1}, Loss: {loss.item():.4f})运行结束后打印训练得到的w和bprint(f训练得到的 w {w.item():.4f}, b {b.item():.4f}) print(f真实 w {true_w}, b {true_b})在随机种子固定为 42 的情况下训练 200 轮后损失通常会降到 0.2 左右w会非常接近 2.0b会接近 1.0。到这里你已经完成了一个最简单的张量计算与自动求导闭环。7.5 结果说明与扩展这个案例虽然简单但它演示了深度学习训练的最小闭环数据、参数、前向传播、损失计算、反向传播、参数更新。你在后续课程中见到的所有复杂模型本质上都是在这个闭环上扩展的。如果觉得 200 轮迭代后结果还不够好可以尝试增大learning_rate或增加训练轮次。你也可以手动把learning_rate调到 0.1观察损失曲线是否会震荡这是理解学习率影响的好方法。8. 常见问题与排查思路8.1 常见报错速查表问题现象常见原因解决思路Expected all tensors to be on the same device部分 Tensor 在 CPU部分在 GPU检查每个 Tensor 的device用.to(device)统一设备RuntimeError: size mismatch矩阵乘法或拼接时形状不匹配打印参与运算张量的shape确认对齐方式cant convert np.ndarray of type numpy.object_NumPy 数组中包含混合类型或对象检查原始数据是否包含字符串或Noneview size is not compatibleview的时候元素数量对不上核对元素总数必要时改用reshapegrad can be implicitly created only for scalar outputs对一个非标量张量直接调用backward()先计算总和或均值再反向传播安装后torch.cuda.is_available()返回 FalseCUDA 版本不匹配或驱动缺失到 PyTorch 官网重新生成安装命令更新驱动TypeError: cannot assign ... as parameter把普通 Tensor 当成模型参数使用使用nn.Parameter包装或检查操作对象8.2 环境安装类问题很多初学者遇到的第一个问题是安装速度慢或安装后无法导入。先说下载慢这属于国内网络环境的现实问题解决办法是使用国内镜像源例如在 pip 命令中追加-i https://pypi.tuna.tsinghua.edu.cn/simple。如果你用 conda也可以切换清华 conda 镜像。这里不展开“代理”等操作只建议使用官方镜像和镜像站并且不要在下载中途反复重启安装命令。再说导入失败。如果你之前装过多个 Python 或 Anaconda执行import torch时报ModuleNotFoundError通常是因为当前环境不是当初安装 PyTorch 的那个环境。先执行which python或python -m pip list确认当前 Python 来自哪个环境。8.3 维度与数据类型问题Tensor 项目的报错里维度不匹配和 dtype 不匹配占了大头。解决这类问题的思路是在报错附近把每个张量的shape和dtype打印出来。例如a torch.randn(2, 3) b torch.randn(2, 3) print(a.shape, b.shape, a.dtype, b.dtype)如果在数据读取阶段使用了 Pandas 或 NumPy先检查数据中是否存在缺失值因为缺失值会让 NumPy 数组变成object类型导致后续转换失败。处理方式是在读取阶段填充缺失值再统一转为float32。8.4 设备与显存问题显存不足Out of Memory在训练较大模型时非常常见。解决思路是降低batch_size、使用较浅的网络、或把输入数据转换为float16。在调试阶段可以先在 CPU 上跑通小规模数据再切到 GPU 完整训练。另外需要提醒的是如果你使用 AMD 显卡PyTorch 官方对 ROCm 的支持主要集中在 Linux 平台上Windows 环境下情况更复杂。建议先查阅 PyTorch 官方文档对 ROCm 的支持列表不要盲目使用网络命令安装 GPU 版本。如果只是学习 Tensor 基础CPU 版本完全够用。9. 最佳实践与工程建议9.1 统一 dtype 与 device在项目一开始建议定义好全局的设备变量和默认数据类型import torch device torch.device(cuda if torch.cuda.is_available() else cpu) dtype torch.float32然后在每次创建 Tensor 时尽量显式传入x torch.tensor([1, 2, 3], dtypedtype, devicedevice)统一dtype与device看似多花了几行代码但在模型变大之后能避免大量诡异的隐式错误。9.2 注意 Tensor 的视图与拷贝view、切片、from_numpy都可能共享内存。当你需要独立修改数据时使用.clone()或者.copy()。例如original torch.arange(6).reshape(2, 3) clip original[:2].clone() clip[0, 0] 99 print(原始数据不受影响\n, original)共享内存机制在内存优化上有价值但在数据处理阶段很容易造成“改了一个值别的地方悄悄变了”的困惑。记住一个原则不确定是否共享内存时就显式.clone()。9.3 控制 requires_grad 的范围requires_grad不是越多越好。只有需要更新的参数才设置requires_gradTrue输入数据和标签一般保持默认 False。如果一个大型预训练模型被全局打开了梯度记录反向传播会消耗大量显存和计算资源。如果你想冻结部分层记得关闭对应参数的梯度for param in model.parameters(): param.requires_grad False9.4 保证实验可复现深度学习实验中随机性来源非常多。为了让实验可复现在脚本开头设置随机种子import torch import numpy as np import random def set_seed(seed42): random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) if torch.cuda.is_available(): torch.cuda.manual_seed_all(seed) set_seed(42)这里要说明torch.manual_seed设置的是 CPU 上生成随机数的种子GPU 上还需要额外调用torch.cuda.manual_seed_all。即使设置了随机种子某些 GPU 算子仍然可能带来微小差异这是正常现象。9.5 建立自己的 Tensor 速查笔记Tensor 的 API 非常多靠背是背不完的。更建议的做法是在学习过程中把你用到的每个 API 整理成一个小节记录三要素这个 API 解决什么问题最简单的调用示例最容易踩的坑是什么。以后写项目时优先翻自己的笔记效率远高于重新搜索。每一课都积累一点一个月之后你就有了一份完全属于自己、带着真实踩坑经验的技术手册。10. 下一步学习路线这篇文章的核心是 Tensor 的创建、属性与基本操作它们是 PyTorch 一切上层能力的基础。如果你刚刚读完这一课建议先把第 4 章到第 6 章的代码在本地逐行执行一遍然后不看答案把第 7 章的线性回归再独立实现一次。下一步可以继续学习以下内容autograd自动求导机制的底层原理理解backward()如何沿着计算图传播梯度torch.nn.Module与torch.nn.Linear将手动训练代码封装成更标准的模型torch.utils.data.Dataset与DataLoader解决批量数据读取问题一个完整的小型实战项目比如 MNIST 手写数字识别。PyTorch 官方也提供了非常优秀的 60 分钟入门教程适合在看完本课后作为补充阅读。如果你在练习过程中遇到问题欢迎在评论区留言交流。觉得本文对你有帮助的话可以收藏备用后续我会继续更新 PyTorch 系列教程逐步从张量基础走向真实项目实战。
返回列表