资讯动态

PyTorch入门第一课:Tensor创建、属性与基本操作完整指南

发布时间:2026/8/29 9:19:58 来源:尧图企业网站定制
2026 最新 PyTorch 教程第 1 课Tensor 创建、属性与基本操作PyTorch 到今天已经不只是深度学习研究者的工具它已经成了工业界训练模型、部署推理、科研实验、毕业设计里绕不开的基础框架。而 PyTorch 里最核心的数据结构就是 Tensor张量。很多人学 PyTorch 卡住不是因为模型结构看不懂而是因为 Tensor 的创建方式、设备迁移、形状变换这些底层操作没吃透。这一课就把 Tensor 彻底讲清楚从创建到属性从索引到 GPU 迁移全部用可运行的代码示例过一遍。Tensor 可以简单理解成“带设备信息的多维数组”它在 CPU 或 GPU 上存储数据PyTorch 内部通过自动求导和计算图机制让深度学习训练成为可能。你后面见到的模型权重、输入样本、中间特征图、梯度全部都是 Tensor。所以这一课的内容不是可学可不学的基础而是后续所有操作的地基。这篇文章先讲 PyTorch 和 Tensor 解决什么问题再给出环境准备方式然后分模块演示 Tensor 的创建方法、属性查看、基本操作、设备迁移和常见错误排查。整个教程面向 Windows 和 Linux 用户也覆盖 CPU 版和 GPU 版的差异。读完后你应该能完成一次完整的 Tensor 操作流程并且知道下一步怎么继续学。1. Tensor 核心能力速览在写代码之前先把 Tensor 和 PyTorch 的关键能力列出来。这一节用于快速判断“我需不需要学”“我的电脑能不能跑”“我要装哪个版本”。能力项说明核心数据结构Tensor支持标量、向量、矩阵、高维张量主要功能深度学习模型训练、推理、自动求导、GPU 加速计算支持设备CPU、NVIDIA GPUCUDA、部分 AMD GPUROCm自动求导通过requires_gradTrue开启训练过程自动计算梯度接口风格接近 NumPy熟悉 NumPy 的读者可以快速上手平台支持Windows、Linux、macOS安装方式pip / conda / 源码编译是否支持 GPU支持但需要匹配 CUDA 版本是否支持批量任务支持batch 维度可直接参与张量运算适用场景深度学习算法开发、论文复现、AI 应用部署、教学实验从能力速览可以看出来Tensor 不是一个新的编程概念而是 PyTorch 一切计算的载体。接下来需要关心的就是两件事怎么装好环境怎么用代码操作 Tensor。2. 适合人群与使用边界PyTorch 第 1 课的内容虽然基础但覆盖的面非常广不同身份的人学到的东西不一样。如果你是刚开始学深度学习的学生这一课能帮你减少后面看代码的阻力。很多开源项目的 README 第一句话就是“导入 torch”但新手往往连torch.tensor([1, 2])和torch.Tensor([1, 2])的区别都不清楚。这一课把这些易混淆的点逐个拆开。如果你是做算法复现的工程师Tensor 的操作熟练度直接决定调试效率。你拿到一个开源模型第一步是看输入张量的形状第二步是看模型输出的形状第三步才去看网络结构。形状对不上报错信息大概率会指向mat1 and mat2 shapes cannot be multiplied这类张量维度错误。快速排查这些错误靠的就是对 Tensor 属性、变形和运算规则的熟练掌握。如果你是做 AI 应用部署的技术人员你需要知道 CPU 和 GPU 的 Tensor 有什么区别如何把模型输入从 numpy 数组转成 Tensor又如何把推理结果从 Tensor 转回 Python 列表或 numpy 数组。这一课涉及的tolist()、numpy()、cpu()操作就是部署环节的常用工具。边界同样要说清楚。Tensor 本身不是完整的深度学习框架它不包含网络层、优化器或数据集加载器——这些是 PyTorch 其他模块负责的。第 1 课只关注 Tensor 本身的创建、属性和基本运算不会展开数据加载DataLoader、模型构建nn.Module和训练循环。另外如果你要做的是快速原型验证完全可以只用 NumPy 或 JAX 完成选择 PyTorch Tensor 的理由主要是为了后续接入自动求导和 GPU 训练。还有一个重要的边界版权与数据合规。Tensor 只是数据类型真正的数据来源于你的输入文件或网络数据集。如果你后续用 PyTorch 处理图像、音频、文本或人脸数据必须确保数据来源合法涉及人脸/声音等敏感信息时要获得本人授权。这一点在训练和商用场景尤其重要。3. 环境准备与 PyTorch 安装开始写 Tensor 代码之前先确认本机的 Python 环境。PyTorch 支持 Python 3.8 以上版本但不同版本对 Python 版本的要求略有差异。安装前建议先查看官方文档确认你的 Python 版本在支持范围内。3.1 检查本机环境打开终端Windows 用 CMD 或 PowerShellLinux/macOS 用 Shell执行以下命令python --version pip --version如果 Python 还没装先去官网下载 Python 3.10 或 3.11 版本安装时注意勾选“Add Python to PATH”。GPU 用户还要检查显卡驱动和 CUDA 支持情况。在终端执行nvidia-smi如果命令可用会显示 NVIDIA 驱动版本和 CUDA 版本号。安装 PyTorch 时选择的 CUDA 版本需要和驱动兼容。注意nvidia-smi显示的是驱动支持的 CUDA 版本不一定要和 PyTorch 的 CUDA 版本完全一致PyTorch 会自带对应的 CUDA runtime。如果是 NVIDIA 显卡但目前没装驱动可以去 NVIDIA 官网下载对应型号的驱动。没有 NVIDIA 显卡的环境直接安装 CPU 版 PyTorch 即可Tensor 基本操作完全可以在 CPU 上完成学习。3.2 安装 PyTorch最稳妥的方式是用官方命令生成器浏览器访问 PyTorch 官网选择你的操作系统、包管理器pip 或 conda、CUDA 版本会自动生成安装命令。这里给出一套典型的 pip 安装命令模板# CPU 版安装 pip install torch torchvision torchaudio # GPU 版安装以 CUDA 12.1 为例实际版本以官方命令为准 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121国内网络环境下载 PyTorch 经常很慢特别是 GPU 版安装包动辄 2GB 以上。如果遇到下载慢、超时的问题可以使用国内镜像站但要注意通过 pip 指定-i镜像安装时部分镜像站可能不包含 CUDA 版 PyTorch 的独立索引。更稳的方案是先访问 PyTorch 官方生成器获得包含--index-url的命令再结合镜像加速或代理加速如有。如果使用 conda可以执行conda install pytorch torchvision torchaudio cudatoolkit11.8 -c pytorch再次强调具体安装命令要按官方页面给出的为准不同版本的 CUDA 对应不同安装命令。安装完成后验证是否成功import torch print(PyTorch 版本:, torch.__version__) print(CUDA 是否可用:, torch.cuda.is_available()) print(当前设备:, torch.cuda.get_device_name(0) if torch.cuda.is_available() else CPU)如果输出正确版本号说明 PyTorch 安装成功。3.3 开发工具选择Tensor 操作适合用 Jupyter Notebook 或 VS Code Python 插件。Jupyter 的优点是可以分段运行方便查看中间变量的形状VS Code 适合工程化开发调试体验更好。推荐新手直接安装 Anaconda创建独立环境conda create -n pytorch python3.10 conda activate pytorch pip install torch torchvision torchaudio用专用环境的好处是不同项目的依赖不会互相冲突。这个习惯从第 1 课就要养成后面装各种模型库时才不会出现依赖打架的问题。4. Tensor 创建方法详解Tensor 创建是 PyTorch 使用频率最高的操作。你可以从 Python 列表创建也可以用内置函数生成全 0、全 1、随机数、等差数列等常见张量。4.1 从 Python 数据创建最直观的创建方式是从列表或元组创建import torch # 从列表创建一维张量 t1 torch.tensor([1, 2, 3, 4]) print(t1:, t1) print(形状:, t1.shape) # 从嵌套列表创建二维张量矩阵 t2 torch.tensor([[1, 2], [3, 4]]) print(t2:, t2) print(形状:, t2.shape) # 指定数据类型 t3 torch.tensor([1, 2, 3], dtypetorch.float32) print(t3:, t3) print(数据类型:, t3.dtype)这里有一个新手最常见的困惑torch.tensor()和torch.Tensor()有什么区别torch.tensor()是函数会根据传入数据自动推断数据类型torch.Tensor()是类构造函数本质上等价于torch.FloatTensor()默认创建 float32 类型。如果传入的数据是整数列表torch.Tensor([1, 2, 3])会创建 float32 张量而torch.tensor([1, 2, 3])会创建 int64 张量。建议平时统一使用torch.tensor()在需要明确指定 dtype 时额外传入dtype参数。4.2 使用内置函数创建PyTorch 提供了大量类似 NumPy 的创建函数import torch # 全 0 张量 zeros torch.zeros(3, 4) print(全 0 张量:, zeros) # 全 1 张量 ones torch.ones(2, 3) print(全 1 张量:, ones) # 对角线为 1 的单位矩阵 eye torch.eye(4) print(单位矩阵:, eye) # 等差数列 arange torch.arange(0, 10, step2) print(等差数列:, arange) # 等间隔张量 linspace torch.linspace(0, 1, steps5) print(等间隔张量:, linspace)这些内置函数在初始化模型权重、生成掩码、制作标签张量时经常用到。例如torch.zeros_like()和torch.ones_like()会根据已有张量的形状生成同形状全 0 或全 1 张量在深度学习代码里很常见。4.3 创建随机张量随机张量在模型初始化中非常关键。PyTorch 提供了多种随机生成方式核心区别在于分布import torch # 均匀分布 [0, 1) rand_uniform torch.rand(2, 3) print(均匀分布随机张量:, rand_uniform) # 标准正态分布 rand_normal torch.randn(2, 3) print(标准正态分布随机张量:, rand_normal) # 整数均匀分布 rand_int torch.randint(0, 10, size(2, 3)) print(整数随机张量:, rand_int)如果你要让随机结果可复现可以设置全局随机种子import torch torch.manual_seed(42) a torch.randn(3, 3) b torch.randn(3, 3) print(a)设置种子之后每次运行生成的结果相同。这在论文复现和调试中很重要。实际操作中数据加载器、模型初始化、随机增强都可能用到随机数统一设置种子可以保证实验可复现。4.4 从 NumPy 数组创建PyTorch 与 NumPy 的互操作非常顺畅。实际项目中数据常常先通过 pandas 或 numpy 加载再转换成 Tensor 送入模型。import numpy as np import torch # NumPy 数组转 Tensor np_array np.array([[1, 2], [3, 4]]) tensor_from_numpy torch.from_numpy(np_array) print(从 NumPy 创建:, tensor_from_numpy) # Tensor 转 NumPy back_to_numpy tensor_from_numpy.numpy() print(转回 NumPy:, back_to_numpy)这里必须注意torch.from_numpy()转换出来的 Tensor 与原始 NumPy 数组共享内存。修改其中一个另一个也会变。这既是优点不需要复制数据效率高也可能带来隐蔽的 bug。如果你不希望共享内存可以使用torch.tensor(np_array)强制复制。5. Tensor 核心属性创建 Tensor 之后最常做的事就是查看它的形状、数据类型、设备位置和是否启用梯度。5.1 形状 shapeshape是 Tensor 最重要的属性它告诉你有多少个维度、每个维度有多大import torch t torch.randn(2, 3, 4) print(形状:, t.shape) print(维度数:, t.dim()) print(元素总数:, t.numel())对于torch.randn(2, 3, 4)它代表一个三维张量第一维有 2 个“矩阵”每个矩阵是 3 行 4 列。元素总数是 2×3×424。5.2 数据类型 dtype数据类型决定张量在内存中占多大空间、数值精度如何import torch t_int torch.tensor([1, 2, 3]) t_float torch.tensor([1.0, 2.0, 3.0]) print(整数张量的 dtype:, t_int.dtype) print(浮点张量的 dtype:, t_float.dtype) # 类型转换 t_float_from_int t_int.float() print(转换后:, t_float_from_int.dtype)深度学习模型权重默认是 float32但混精度训练中会用到 float16 和 bfloat16。GPU 推理优化时经常把模型参数从 float32 转成 float16 以降低显存占用、提升推理速度。这个转换本质上就是对 Tensor 做tensor.half()操作。5.3 设备 deviceTensor 所在的设备决定了它在哪里计算。CPU 张量和 GPU 张量不能直接混合运算import torch print(CUDA 是否可用:, torch.cuda.is_available()) # 查看张量当前设备 cpu_tensor torch.tensor([1, 2, 3]) print(CPU 张量的设备:, cpu_tensor.device) if torch.cuda.is_available(): gpu_tensor cpu_tensor.cuda() print(GPU 张量的设备:, gpu_tensor.device)device 属性是torch.device类型常见的包括cpu、cuda:0、cuda:1。在没有 GPU 的机器上所有张量默认就是 CPU 设备也能正常学习。5.4 是否需要梯度 requires_grad这是 PyTorch 相比 NumPy 最重要的扩展属性。当requires_gradTrue时PyTorch 会自动追踪该张量的所有操作用于后续反向传播import torch x torch.tensor([2.0, 3.0], requires_gradTrue) print(需要梯度:, x.requires_grad)设置为False的张量在自动求导时不会被追踪。模型推理阶段通常用torch.no_grad()或model.eval()并关闭梯度以减少内存占用、提升推理速度。import torch x torch.tensor([2.0, 3.0], requires_gradTrue) # 自动求导示例 y (x ** 2).sum() y.backward() print(梯度:, x.grad)这里y (x ** 2).sum()对 x 求导的结果是2*x所以x.grad应该是tensor([4., 6.])。这个机制就是 PyTorch 训练过程的基础模型参数设置requires_gradTrue损失函数向前传播再调用backward()自动计算梯度。6. Tensor 基本操作Tensor 的基本操作可以分为形状变换、数学运算、索引切片和拼接拆分几大类。这些操作在后续写模型代码时几乎每天都要用到。6.1 形状变换深度学习中不同层之间的数据形状往往不匹配需要频繁调整张量形状。最常用的方法是view和reshapeimport torch x torch.randn(2, 3, 4) print(原始形状:, x.shape) # view 改变形状 y x.view(2, 12) print(view 后形状:, y.shape) # reshape 改变形状 z x.reshape(6, 4) print(reshape 后形状:, z.shape) # 展平操作 flat x.view(-1) print(展平后形状:, flat.shape)view(-1)让 PyTorch 自动推断该维度大小常用于把特征图展平成向量。view和reshape的区别在于view要求张量在内存中是连续的contiguous如果执行了转置等操作内存可能不连续这时需要用reshape或者先调用.contiguous()再view。维度调整的另一个常用操作是permute用于交换维度顺序import torch x torch.randn(2, 3, 4) print(原始形状:, x.shape) # 交换维度顺序 y x.permute(2, 0, 1) print(permute 后形状:, y.shape) # 增加维度 z x.unsqueeze(0) print(unsqueeze 后形状:, z.shape) # 减少维度 w x.squeeze() print(squeeze 后形状:, w.shape)unsqueeze(0)会在最前面加一个维度常用于给单条数据添加 batch 维度。squeeze()会移除所有大小为 1 的维度常用于去除多余的通道维度。6.2 数学运算Tensor 的数学运算包括算术运算、矩阵乘法、求和、均值等。import torch a torch.tensor([[1.0, 2.0], [3.0, 4.0]]) b torch.tensor([[5.0, 6.0], [7.0, 8.0]]) # 元素级加法 print(加法:, a b) # 元素级乘法 print(乘法:, a * b) # 矩阵乘法 print(矩阵乘法:, torch.matmul(a, b)) # 矩阵乘法符号写法 print(矩阵乘法 :, a b) # 求和 print(所有元素求和:, a.sum()) # 沿指定维度求和 print(按行求和:, a.sum(dim1)) # 均值 print(均值:, a.mean()) # 最大值和最小值 print(最大值:, a.max()) print(最小值:, a.min())元素级乘法和矩阵乘法是最容易混淆的操作。a * b是对应位置相乘要求形状相同a b是真正的矩阵乘法要求第一个矩阵的列数等于第二个矩阵的行数。6.3 索引与切片Tensor 的索引方式和 Python 列表、NumPy 数组非常相似import torch x torch.arange(12).reshape(3, 4) print(x:, x) # 取第 0 行 print(第 0 行:, x[0]) # 取第 1 列 print(第 1 列:, x[:, 1]) # 取子矩阵 print(前两行前三列:, x[:2, :3]) # 按步长索引 print(隔行取:, x[::2, :]) # 布尔索引 mask x 5 print(大于 5 的元素:, x[mask])索引操作返回的是原张量的视图view修改索引结果会影响原张量。如果不想修改原张量需要使用copy()方法复制一份。6.4 拼接与拆分模型代码中常见的是把多个特征图在通道维度上拼接或者把批量数据拆成小块import torch a torch.randn(2, 3) b torch.randn(2, 3) # 沿第 0 维拼接 c torch.cat([a, b], dim0) print(沿 dim0 拼接后形状:, c.shape) # 沿第 1 维拼接 d torch.cat([a, b], dim1) print(沿 dim1 拼接后形状:, d.shape) # 堆叠创建新维度 e torch.stack([a, b], dim0) print(stack 后形状:, e.shape) # 拆分 split torch.split(torch.arange(6), 2) print(split 结果:, split)cat不会增加新的维度只在已有维度上进行拼接stack会增加新的维度。加通道维这种情况通常用cat制造 batch 维度用stack或unsqueeze加cat。7. 设备迁移与 GPU 张量在第 1 课阶段你已经可以接触 GPU 计算。PyTorch 最方便的一点是可以用一行代码把张量从 CPU 搬到 GPUimport torch print(CUDA 是否可用:, torch.cuda.is_available()) # 定义一个 CPU 张量 cpu_tensor torch.randn(3, 3) print(CPU 设备:, cpu_tensor.device) if torch.cuda.is_available(): # 搬到 GPU gpu_tensor cpu_tensor.cuda() print(GPU 设备:, gpu_tensor.device) # 再搬回 CPU back_to_cpu gpu_tensor.cpu() print(回到 CPU:, back_to_cpu.device)在实际项目中更推荐使用.to(device)写法因为设备信息可以用变量统一管理import torch device torch.device(cuda if torch.cuda.is_available() else cpu) print(当前使用设备:, device) data torch.randn(3, 3).to(device) print(data 位于:, data.device)这里有一个常见错误CPU 张量和 GPU 张量直接运算会报错。你应当先统一设备再执行操作import torch device torch.device(cuda if torch.cuda.is_available() else cpu) a torch.randn(2, 2).to(device) b torch.randn(2, 2) # CPU 张量 # 下面这行在不同设备时会报错 # c a b # 正确做法 b b.to(device) c a b print(运算结果设备:, c.device)如果你只有 CPU 机器也可以学习张量的设备概念但无法实际执行.cuda()。在学习阶段CPU 版 PyTorch 足够完成全部 Tensor 操作练习。8. 常见错误与排查方法初学者使用 Tensor 时最容易遇到下面几类错误。这里整理成排查表后面遇到类似问题可以直接对照。问题现象可能原因排查方式解决方案ModuleNotFoundError: No module named torchPyTorch 未安装或虚拟环境没激活执行pip list查看 torch 是否存在按官方命令安装对应版本CUDA 不可用但已安装 GPU 版显卡驱动过旧或 PyTorch CUDA 版本不匹配执行nvidia-smi查看驱动版本更新驱动重装匹配 CUDA 的 PyTorchshape mismatch报错张量形状不匹配矩阵乘法维度不对打印两个张量的shape使用view/reshape/permute调整形状Expected all tensors to be on the same deviceCPU 张量和 GPU 张量混合运算打印各张量的device使用.to(device)统一设备修改索引结果影响了原张量索引返回视图共用内存检查是否使用切片需要独立数据时使用.copy()0D tensor无法调用某些方法张量是 0 维标量打印shape查看使用reshape(1)增加维度梯度为 None未设置requires_gradTrue或未调用backward()打印张量的requires_grad在创建或计算后启用梯度下载速度极慢国内访问官方源不稳定检查网络连接使用镜像源或合适时间下载AMD 显卡无法使用 CUDAPyTorch CUDA 只支持 NVIDIA查看本机显卡型号安装 ROCm 版 PyTorch 或换用 CPU 推理下载速度慢是在国内学习 PyTorch 时最常见的痛点。GPU 版安装包比较大建议在安装时优先使用官方 PyTorch 的--index-url参数也可以尝试更换网络环境或错峰下载。注意安装成功后不要再频繁重装一个稳定的虚拟环境比反复折腾安装方式更省时间。9. 最佳实践与学习建议学完 Tensor 创建、属性和基本操作之后后续的学习路径很重要。这里给出几条务实建议能直接影响后续学习效率。第一把设备和数据转换固定成项目模板。每次新建 PyTorch 项目都先写这一段import torch device torch.device(cuda if torch.cuda.is_available() else cpu) def to_device(data, devicedevice): if isinstance(data, (list, tuple)): return [to_device(x, device) for x in data] return data.to(device)这样后面处理输入、模型、标签时都能统一放到设备上减少设备不一致的错误。第二写代码时多打印 shape。调试深度学习模型第一件事不是看数值而是确认每个关键节点的张量形状。在模型前向传播的关键位置加print(tensor.shape)能快速定位到底是哪一步形状变了。第三刻意练习 NumPy 与 Tensor 的转换。包括从 pandas DataFrame 转 numpy 再转 tensor以及推理结果从 tensor 转回 numpy。这个能力在真实项目里几乎每天都会用到。第四规范管理环境。建议用 Anaconda 创建独立环境记录依赖版本conda create -n pytorch python3.10 conda activate pytorch pip install torch torchvision torchaudio pip freeze requirements.txt不要在一个全局环境里装各种不同版本的深度学习库否则过一段时间一定会遇到依赖冲突。第五保持安全意识。如果你用 PyTorch 处理真实数据集不要上传未获得授权的图像、音频或文本数据。涉及人脸、声音、版权素材时务必确认授权范围。训练出的模型如果用于商用或对外发布也要做严格的内容审核。第六建立正则化表达。深度学习代码中频繁出现.unsqueeze(0)、.permute(2, 0, 1)、.reshape(-1, 28*28)等操作建议每位学习者建立自己的“常见形状变换速查表”。遇到新的变换方法就记录下来积累到一定程度就能一眼看懂开源项目里的张量流转。第七从第 2 课开始接触自动求导与线性回归。Tensor 只是第一步下一步建议实现一个最简单的线性回归模型体会requires_grad、loss.backward()、optimizer.step()的完整流程。这一步走通了你对 PyTorch 训练机制的认知会立刻上一个台阶。10. 总结与下一步PyTorch Tensor 是整个框架的地基。你不需要一次性记住所有创建函数但要形成几个核心能力能从数据创建 Tensor能查看形状/维度/设备能执行形状变换和矩阵运算能进行设备迁移。这四个能力覆盖了后续写模型代码时 80% 以上的 Tensor 操作。这一课最值得动手验证的是三个点用torch.tensor()从列表创建各类 Tensor并查看 shape、dtype、device用view和permute做形状变换确保输出形状符合预期如果有 NVIDIA 显卡把 CPU 张量迁移到 GPU再执行一次矩阵运算体验硬件加速。最容易踩的坑是设备不一致CPU 张量和 GPU 张量混用报错其次是torch.Tensor()默认 float32 导致的数据类型意外变化。建议在学习阶段多写小代码块每次只验证一个操作出现错误时优先打印.shape和.device。Tensor 操作熟练后下一步建议进入自动求导机制然后尝试构建第一个神经网络模型。PyTorch 官网的官方教程、开源项目的 README 和 GitHub 上的示例代码都是很好的学习材料但真正关键的是自己动手敲一遍把所有示例代码重新实现。这一课的内容就到这儿。建议收藏备用等你进入训练流程后再回头看很多当时觉得抽象的操作会变得越来越自然。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价