人工智能、AI基础:Pytorch的基本操作
本文介绍了PyTorch的基本操作,重点讲解了张量的创建、形状调整、索引切片和数学运算。PyTorch凭借动态计算图的灵活性、与Python生态的无缝衔接以及在NLP领域的优势,成为深度学习的重要工具。文章通过代码示例展示了如何创建张量、调整形状、进行数学运算等核心操作,帮助读者快速掌握PyTorch的基础知识。
各位观众老爷,大家好,我是诗人啊_,今天和各位分Pytorch的基本操作,一文速通~
(屏幕前的你,帅气低调有内涵,美丽大方很优雅…所以,求个点赞、收藏、关注呗~)
正经标题 :循环神经网络LSTM、GRU理论入门及API使用
### 前言
本文目录在浏览器右侧, 大家可以根据需要调整观看节奏~(前言不爱看, 就直接跳到3.1)

1. 为什么要学PyTorch?—— 为深度学习与NLP铺路
在决定投入时间学习一个框架前,我们首先需要明确:为什么是PyTorch?对于深度学习和NLP学习者而言,它的价值主要体现在以下几个方面:
-
动态计算图的灵活性:PyTorch采用动态计算图机制,代码运行时可以实时调整计算流程,这对NLP任务中常见的可变长度输入(如句子、段落)处理尤为友好。相比静态图框架(如早期TensorFlow),动态图更符合人类的思维习惯,调试过程也更直观——你可以像调试普通Python代码一样逐步排查错误。
-
与Python生态的无缝衔接:PyTorch的语法设计贴近原生Python,对于熟悉Python的开发者来说几乎零门槛。同时,它可以直接调用NumPy、Pandas等数据处理库,这在NLP数据预处理(如文本清洗、特征提取)阶段能极大提升效率。
-
NLP领域的天然优势:目前主流的NLP模型(如BERT、GPT、Transformer)大多基于PyTorch实现,许多开源项目(如Hugging Face的Transformers库)也以PyTorch为核心。掌握PyTorch能让你轻松复现论文中的模型,甚至在此基础上进行创新。
-
科研与工程的平衡:PyTorch既适合学术界快速验证新想法(代码迭代速度快),也能通过TorchScript等工具部署到生产环境,满足工程化需求。这种“一条龙”特性使其成为深度学习学习者的理想选择。
简言之,学好PyTorch,就如同掌握了一把打开深度学习与NLP大门的钥匙。
2. 导包——PyTorch的“启动仪式”
使用PyTorch前,首先需要导入相关库。最核心的是torch库,此外,torch.nn(神经网络模块)、torch.optim(优化器)等子模块也会频繁用到。导入方式如下:
import torch # 核心库,包含张量操作、自动求导等功能
import torch.nn as nn # 神经网络层(如线性层、卷积层)和损失函数
import torch.optim as optim # 优化算法(如SGD、Adam)
import torch.nn.functional as F # 常用函数(如激活函数、池化操作)
导入后,可通过以下代码验证PyTorch是否正常安装,并查看版本:
print("PyTorch版本:", torch.__version__)
# 检查是否支持GPU加速(NLP任务中大规模模型训练依赖GPU)
print("是否支持CUDA:", torch.cuda.is_available())
若输出True,说明当前环境支持CUDA加速,后续可通过.cuda()方法将数据或模型迁移到GPU上运行,大幅提升计算效率。(目前学习用不到这项,以后用到再说吧~)
3. PyTorch基本操作(核心详解)
PyTorch的核心数据结构是张量(Tensor),它可以理解为多维数组,与NumPy的ndarray类似,但支持GPU加速和自动求导。以下从张量的创建、操作、索引、数学运算等方面展开讲解。
3.1 张量的创建
3.1.1 基础创建方法
最常用的创建方式是通过torch.tensor()函数,直接将Python列表或NumPy数组转换为张量:
import numpy as np
# 从列表创建
t1 = torch.tensor([1, 2, 3, 4])
print("1维张量:", t1, "形状:", t1.shape) # 形状为(4,)
# 从NumPy数组创建
np_arr = np.array([[1, 2], [3, 4]])
t2 = torch.tensor(np_arr)
print("2维张量:\n", t2, "\n形状:", t2.shape) # 形状为(2, 2)
3.1.2 特殊张量创建
实际应用中,常需要创建全零、全一或随机值张量,PyTorch提供了便捷的函数:
# 全零张量(指定形状为3行2列)
t_zero = torch.zeros((3, 2))
# 全一张量(与t_zero形状相同)
t_one = torch.ones_like(t_zero)
# 随机张量(值在[0,1)之间)
t_rand = torch.rand((2, 3))
# 单位矩阵(2x2)
t_eye = torch.eye(2)
print("全零张量:\n", t_zero)
print("随机张量:\n", t_rand)
3.1.3 张量的数据类型与设备
张量的数据类型(如float32、int64)和存储设备(CPU/GPU)是两个关键属性,可通过dtype和device查看:
# 创建指定数据类型的张量(float32)
t_float = torch.tensor([1.0, 2.0], dtype=torch.float32)
# 创建整数类型张量
t_int = torch.tensor([1, 2], dtype=torch.int64)
print("数据类型:", t_float.dtype, t_int.dtype)
# 若支持GPU,将张量迁移到GPU
if torch.cuda.is_available():
t_gpu = t_float.to("cuda")
print("设备:", t_gpu.device) # 输出:cuda:0
3.2 张量的形状操作
在NLP任务中,输入数据的形状(如句子长度、 batch大小、词向量维度)经常需要调整,常用操作包括:
3.2.1 查看与修改形状
shape/size():查看形状(效果相同)reshape():重塑形状(不改变数据)view():与reshape()类似,但要求张量在内存中连续存储
t = torch.randn(2, 3) # 形状为(2, 3)
print("原始形状:", t.shape)
# 重塑为3行2列
t_reshaped = t.reshape(3, 2)
print("重塑后形状:", t_reshaped.shape)
# 展平为1维张量(常用于全连接层输入)
t_flat = t.view(-1) # -1表示自动计算维度,结果为(6,)
print("展平后形状:", t_flat.shape)
3.2.2 维度增减
unsqueeze(dim):在指定维度增加一个维度(常用于扩展batch维度)squeeze(dim):删除维度为1的维度(可选指定维度)
t = torch.tensor([1, 2, 3]) # 形状为(3,)
# 增加维度0,变为(1, 3)(模拟batch_size=1)
t_unsq = t.unsqueeze(0)
print("增加维度后:", t_unsq.shape)
# 删除维度0(若维度不为1则不生效)
t_sq = t_unsq.squeeze(0)
print("删除维度后:", t_sq.shape) # 回到(3,)
3.2.3 维度拼接与拆分
cat(tensors, dim):沿指定维度拼接多个张量(要求其他维度形状相同)stack(tensors, dim):沿新维度堆叠张量(会增加一个维度)
t1 = torch.randn(2, 3)
t2 = torch.randn(2, 3)
# 沿维度1拼接,形状变为(2, 6)
t_cat = torch.cat([t1, t2], dim=1)
print("拼接后形状:", t_cat.shape)
# 沿维度0堆叠,形状变为(2, 2, 3)
t_stack = torch.stack([t1, t2], dim=0)
print("堆叠后形状:", t_stack.shape)
3.3 张量的索引与切片
与Python列表类似,张量支持索引和切片操作,用于提取部分数据:
t = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 索引(取第0行第1列元素)
print("单个元素:", t[0, 1]) # 输出:2
# 切片(取第0-1行,第1-2列)
t_slice = t[0:2, 1:3]
print("切片结果:\n", t_slice) # 输出:[[2,3],[5,6]]
# 按条件索引(取大于3的元素)
t_mask = t[t > 3]
print("条件索引结果:", t_mask) # 输出:[4,5,6,7,8,9]
在NLP中,常通过切片提取batch中的部分样本,或句子中的部分单词。
3.4 张量的数学运算
PyTorch支持丰富的数学运算,涵盖元素级操作、矩阵运算等,与NumPy接口类似:
3.4.1 元素级运算
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
# 加法(等价于a + b)
print("加法:", torch.add(a, b)) # [5,7,9]
# 乘法(元素级,等价于a * b)
print("元素乘法:", torch.mul(a, b)) # [4,10,18]
# 幂运算(等价于a **2)
print("平方:", torch.pow(a, 2)) # [1,4,9]
3.4.2 矩阵运算
矩阵乘法是深度学习的核心运算(如词向量与权重矩阵的乘积),通过torch.matmul()实现:
# 矩阵A:2行3列,矩阵B:3行2列
A = torch.randn(2, 3)
B = torch.randn(3, 2)
# 矩阵乘法(结果为2行2列)
C = torch.matmul(A, B)
print("矩阵乘法结果形状:", C.shape) # (2, 2)
# 对于二维张量,也可使用@运算符
C = A @ B
3.4.3 聚合运算
sum(dim):沿指定维度求和mean(dim):沿指定维度求均值max(dim)/min(dim):沿指定维度求最大/最小值(返回值和索引)
t = torch.tensor([[1, 2], [3, 4]])
# 全局求和
print("总和:", t.sum()) # 10
# 沿维度0求和(按列求和)
print("按列求和:", t.sum(dim=0)) # [4,6]
# 沿维度1求最大值(按行求最大)
max_val, max_idx = t.max(dim=1)
print("每行最大值:", max_val) # [2,4]
print("最大值索引:", max_idx) # [1,1]
3.5 自动求导(Autograd)基础
自动求导是深度学习框架的核心功能,PyTorch通过requires_grad参数追踪张量的运算过程,实现梯度自动计算:
# 创建需要求导的张量(requires_grad=True)
x = torch.tensor([2.0], requires_grad=True)
y = x** 2 + 3 * x + 1 # y = x² + 3x + 1
# 反向传播:计算y对x的导数
y.backward()
# 查看梯度(dy/dx = 2x + 3,当x=2时,结果为7)
print("x的梯度:", x.grad) # 输出:tensor([7.])
在神经网络中,我们通常不需要手动调用backward(),优化器会自动处理,但理解这一机制对调试模型至关重要。
4. 练习题
为巩固所学知识,以下练习题涵盖PyTorch的核心操作,建议动手实践:
- 创建一个形状为
(3, 4)的随机张量,将其数据类型改为torch.float16,并迁移到GPU(若支持)。 - 现有张量
t = torch.tensor([[1, 2, 3], [4, 5, 6]]),请完成:
- 提取第1行(索引0)的第2个元素(索引1);
- 将其重塑为(3, 2)的形状;
- 在维度0增加一个维度,使形状变为(1, 3, 2)。 - 计算两个矩阵
A = torch.randn(2, 3)和B = torch.randn(3, 4)的乘积,并求结果中所有元素的平均值。 - 已知张量
x = torch.tensor([3.0], requires_grad=True),计算y = sin(x) + x^3在x=3处的导数。
5. 练习题的答案
第1题答案
# 创建3x4随机张量
t = torch.rand(3, 4)
# 转换数据类型为float16
t = t.to(dtype=torch.float16)
# 迁移到GPU(若支持)
if torch.cuda.is_available():
t = t.to("cuda")
print("张量形状:", t.shape, "数据类型:", t.dtype, "设备:", t.device)
第2题答案
t = torch.tensor([[1, 2, 3], [4, 5, 6]])
# 1. 提取第1行第2个元素
elem = t[0, 1]
print("提取的元素:", elem) # 输出:2
# 2. 重塑为3x2
t_reshaped = t.reshape(3, 2)
print("重塑后形状:", t_reshaped.shape) # (3, 2)
# 3. 增加维度0
t_unsq = t_reshaped.unsqueeze(0)
print("增加维度后形状:", t_unsq.shape) # (1, 3, 2)
第3题答案
A = torch.randn(2, 3)
B = torch.randn(3, 4)
# 矩阵乘法
C = torch.matmul(A, B)
# 求平均值
mean_val = C.mean()
print("乘积的平均值:", mean_val)
第4题答案
x = torch.tensor([3.0], requires_grad=True)
y = torch.sin(x) + x ** 3 # y = sin(x) + x³
y.backward() # 求导
print("导数 dy/dx 在x=3处的值:", x.grad)
# 解析解:cos(x) + 3x²,代入x=3得 cos(3) + 27 ≈ -0.98999 + 27 ≈ 26.01001
6. 总结
本文从PyTorch的学习意义出发,系统讲解了导包方法、张量创建、形状操作、数学运算和自动求导等核心内容,并通过练习题帮助巩固知识点。PyTorch的灵活性使其在深度学习和NLP任务中应用广泛——从简单的线性回归到复杂的Transformer模型,都能通过这些基础操作搭建实现。
后续学习中,建议结合具体任务(如文本分类、词向量训练)进一步实践,逐步掌握神经网络层(torch.nn)、优化器(torch.optim)等高级功能。记住,熟练使用PyTorch的关键在于多写代码、多调试,遇到问题时善用官方文档(PyTorch Docs)和社区资源。
希望本文能成为你深度学习之旅的良好开端,祝学习顺利!
更多推荐


所有评论(0)