深度学习入门该选哪个框架?毫无疑问,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的基础操作就全部讲完了,新手掌握这些内容,就能应对大部分入门级任务(如线性回归、简单分类)。总结一下核心要点:

  1. 环境安装:根据CPU/GPU选择对应命令,避免源地址报错。

  2. 张量操作:创建、类型转换、形状操作、索引操作是基础,务必多敲代码练习。

  3. 自动微分:记住「标量求导」和「梯度清零」,这是模型训练的关键。

  4. 实战流程:数据集准备→模型构建→损失函数+优化器→训练→可视化。

福利:本文所有代码已整理成完整文件,关注我,评论区回复「PyTorch入门」,即可获取!后续会更新PyTorch进阶内容(如神经网络、CV/NLP实战),记得关注不迷路~

如果大家在运行代码时遇到问题,欢迎在评论区留言,我会一一回复解答!觉得有用的话,点赞+收藏,支持一下博主哦❤️

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐