PyTorch从入门到实操:新手必看的基础教程(附完整代码)
深度学习入门该选哪个框架?毫无疑问,PyTorch必须是首选!它简洁易懂、API友好,既能满足学术研究需求,也能适配工业界落地,尤其适合Python开发者快速上手。
今天这篇文章,就从PyTorch基础概念、核心操作,一步步带大家入门,全程附可直接运行的代码,新手跟着敲就能学会,建议收藏备用!
一、PyTorch核心认知:是什么?为什么选它?
先给新手科普下核心概念,避免一开始就被术语劝退:
PyTorch是一个基于Python语言的深度学习框架,核心是将数据封装成「张量(Tensor)」进行处理——简单理解,张量就是多维数组,和NumPy的ndarray类似,但支持GPU加速,这也是它能高效训练模型的关键。
对比大家常听说的TensorFlow,PyTorch的优势更突出,新手闭眼冲:
|
框架 |
PyTorch |
TensorFlow |
|---|---|---|
|
风格 |
Python式写法,代码直观,贴近原生Python |
静态图+Keras,体系较重,代码相对复杂 |
|
计算模式 |
动态计算图(即时执行),调试方便 |
静态计算图(TF1)+动态(TF2),上手门槛高 |
|
学习成本 |
低,新手易上手 |
较高,需要熟悉其生态和API设计 |
应用场景:计算机视觉(CV)、自然语言处理(NLP)、强化学习等,目前主流大厂、科研机构都在广泛使用。
二、PyTorch环境安装(避坑版)
安装是新手第一个坑,这里直接给出适配CPU和GPU的两种安装命令,复制执行即可,无需复杂配置:
1. CPU版本(适合无独立显卡的电脑)
pip3 install torch -i https://pypi.tuna.tsinghua.edu.cn/simple
2. 英伟达GPU版本(适合有独立显卡,且支持CUDA的电脑)
pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cu126
注意:如果执行CPU版本命令出现「link fetch error」,大概率是清华源临时不稳定,可刷新后重试,或更换其他国内源(如阿里云源)。
验证安装是否成功:打开Python终端,输入以下代码,无报错即安装成功:
import torch
print(torch.__version__) # 打印PyTorch版本
print(torch.cuda.is_available()) # 查看GPU是否可用(返回True即支持GPU)
三、PyTorch核心操作:张量(Tensor)全解析
张量是PyTorch的核心数据结构,所有操作都围绕张量展开,这部分是基础,一定要吃透!
3.1 什么是张量?
张量就是多维数组,对应不同维度有不同叫法,新手无需死记,结合例子理解:
-
0维张量(标量):单个数值,如
torch.tensor(10) -
1维张量(向量):一串数值,如
torch.tensor([10,20,30]) -
2维张量(矩阵):二维数组,如
torch.tensor([[10,20],[30,40]]) -
3维及以上:多用于存储图片(如3通道图片:HWC)、时序数据等
3.2 张量的创建方法(常用3类)
整理了新手最常用的创建方式,附代码和输出结果,直接复制运行:
import torch
import numpy as np
# 1. torch.tensor():根据指定数据创建(最常用)
data1 = torch.tensor(10) # 0维张量
data2 = torch.tensor([[10.,20.,30.],[40.,50.,60.]]) # 2维张量
data3 = torch.tensor(np.random.randn(2,3)) # 从NumPy数组创建
print("data1:", data1)
print("data2:", data2)
# 2. torch.Tensor():根据形状创建(默认float32)
data4 = torch.Tensor(2,3) # 创建2行3列的空张量(随机值)
print("data4:", data4)
# 3. 指定类型创建(IntTensor/FloatTensor等)
data5 = torch.IntTensor(2,3) # int32类型
data6 = torch.FloatTensor([2.5,3.3]) # float32类型(自动转换整数)
print("data5:", data5)
print("data6:", data6)
输出结果:
data1: tensor(10)
data2: tensor([[10., 20., 30.],
[40., 50., 60.]])
data4: tensor([[0.0000e+00, 3.6893e+19, 2.2018e+05],
[4.6577e-10, 2.4158e-12, 1.1625e+33]])
data5: tensor([[ 0, 1610612736, 1213662609],
[ 805308409, 156041223, 1]], dtype=torch.int32)
data6: tensor([2., 3.])
3.3 常用张量操作(必学)
整理了新手高频操作,分为「创建特殊张量」「类型转换」「形状操作」「索引操作」4类,每类附核心代码:
(1)创建特殊张量(全0、全1、线性/随机张量)
# 全0张量
zeros_tensor = torch.zeros(2,3)
# 全1张量
ones_tensor = torch.ones(2,3)
# 全指定值张量(如全为10)
full_tensor = torch.full([2,3], 10)
# 线性张量(0到10,步长2)
arange_tensor = torch.arange(0,10,2)
# 随机张量(2行3列,正态分布)
randn_tensor = torch.randn(2,3)
print("全0张量:", zeros_tensor)
print("线性张量:", arange_tensor)
(2)张量类型转换
data = torch.full([2,3], 10)
print("原始类型:", data.dtype) # 默认为int64
# 方法1:type()转换
data1 = data.type(torch.FloatTensor)
# 方法2:直接调用类型方法(更简洁)
data2 = data.double() # 转换为float64
# 方法3:to()转换
data3 = data.to(torch.float32)
print("转换后类型(float32):", data1.dtype)
(3)张量形状操作(reshape/squeeze/transpose等)
形状操作是实战中高频需求,重点掌握这5个函数:
data = torch.tensor([[10,20,30],[40,50,60]])
print("原始形状:", data.shape) # torch.Size([2,3])
# 1. reshape:修改形状(不改变数据)
reshape_data = data.reshape(1,6)
# 2. unsqueeze:增加维度(如1维→2维)
unsqueeze_data = data.unsqueeze(dim=0) # 形状变为(1,2,3)
# 3. squeeze:删除形状为1的维度
squeeze_data = unsqueeze_data.squeeze() # 恢复原始形状
# 4. transpose:交换两个维度
transpose_data = torch.transpose(data, 0, 1) # 交换0和1维度,形状变为(3,2)
# 5. permute:一次交换多个维度(适合高维张量)
permute_data = data.permute([1,0]) # 效果和transpose一致
print("reshape后形状:", reshape_data.shape)
print("transpose后形状:", transpose_data.shape)
(4)张量索引操作(获取指定元素)
data = torch.randint(0,10, [4,5]) # 4行5列的随机整数张量
print("原始张量:\n", data)
# 1. 简单行列索引(获取第0行、第0列)
print("第0行:", data[0])
print("第0列:", data[:,0])
# 2. 范围索引(前3行,前2列)
print("前3行前2列:\n", data[:3, :2])
# 3. 多维索引(3维张量为例)
data3d = torch.randint(0,10, [3,4,5])
print("3维张量第0个维度的所有数据:\n", data3d[0, :, :])
3.4 张量与NumPy数组的转换
实战中经常需要和NumPy数组互转,重点注意「共享内存」的问题:
import numpy as np
# 1. 张量 → NumPy数组(共享内存,修改一个会影响另一个)
tensor = torch.tensor([2,3,4])
numpy_arr = tensor.numpy()
# 避免共享内存:加.copy()
numpy_arr2 = tensor.numpy().copy()
# 2. NumPy数组 → 张量(两种方式)
numpy_data = np.array([2,3,4])
tensor1 = torch.from_numpy(numpy_data) # 共享内存
tensor2 = torch.tensor(numpy_data) # 不共享内存
print("NumPy转张量:", tensor1)
避坑提示:如果张量开启了自动微分(requires_grad=True),不能直接转NumPy,需用
tensor.detach().numpy()先脱离计算图。
四、张量运算与自动微分(核心难点)
深度学习的核心是「反向传播求梯度」,PyTorch的自动微分模块(torch.autograd)帮我们省去手动求导的麻烦,新手重点掌握以下内容:
4.1 基本张量运算
加减乘除、按元素相乘、矩阵乘法,这3类运算最常用:
data = torch.randint(0,10, [2,3], dtype=torch.float32)
# 1. 基本运算(add/sub/mul/div,带下划线修改原数据)
data_add = data.add(10) # 不修改原数据
data.add_(10) # 修改原数据(等价于data += 10)
# 2. 按元素相乘(Hadamard乘积,相同形状对应元素相乘)
data1 = torch.tensor([[1,2],[3,4]])
data2 = torch.tensor([[5,6],[7,8]])
hadamard = data1 * data2 # 等价于torch.mul(data1, data2)
# 3. 矩阵乘法(要求前一个矩阵的列 = 后一个矩阵的行)
matmul = data1 @ data2 # 等价于torch.matmul(data1, data2)
print("按元素相乘:", hadamard)
print("矩阵乘法:", matmul)
4.2 自动微分基础
关键要点:PyTorch只支持「标量对向量/矩阵求导」,所以求导前需将输出转为标量(如用.sum()):
# 1. 标量对向量求导
x = torch.tensor([10,20], requires_grad=True, dtype=torch.float32)
y = 2 * x ** 2 # 定义函数
y.sum().backward() # 反向传播求梯度(y需转为标量)
print("x的梯度:", x.grad) # 输出:tensor([40., 80.]),对应y对x的导数4x
# 2. 梯度清零(重要!梯度会累加,每次反向传播前需清零)
x.grad.zero_() # 清空梯度
4.3 梯度下降法(实战必备)
梯度下降是模型训练的核心算法,核心公式:w新 = w旧 - 学习率 × 梯度,用一个简单例子理解:
# 求函数 y = x² + 20 的极小值(最小值在x=0处,y=20)
x = torch.tensor(10, requires_grad=True, dtype=torch.float32)
epochs = 1000 # 迭代次数
lr = 0.01 # 学习率
for i in range(epochs):
y = x ** 2 + 20
# 梯度清零
if x.grad is not None:
x.grad.zero_()
# 反向传播求梯度
y.backward()
# 更新参数
x.data = x.data - lr * x.grad
print("最终x值(接近0):", x)
print("最终y值(接近20):", y)
五、总结与福利
到这里,PyTorch的基础操作就全部讲完了,新手掌握这些内容,就能应对大部分入门级任务(如线性回归、简单分类)。总结一下核心要点:
-
环境安装:根据CPU/GPU选择对应命令,避免源地址报错。
-
张量操作:创建、类型转换、形状操作、索引操作是基础,务必多敲代码练习。
-
自动微分:记住「标量求导」和「梯度清零」,这是模型训练的关键。
-
实战流程:数据集准备→模型构建→损失函数+优化器→训练→可视化。
福利:本文所有代码已整理成完整文件,关注我,评论区回复「PyTorch入门」,即可获取!后续会更新PyTorch进阶内容(如神经网络、CV/NLP实战),记得关注不迷路~
如果大家在运行代码时遇到问题,欢迎在评论区留言,我会一一回复解答!觉得有用的话,点赞+收藏,支持一下博主哦❤️
更多推荐


所有评论(0)