昇腾AI自学Day1-- 深度学习基础工具与数学
深度学习实践基础篇
PyTorch 基本操作:张量(Tensor)基础与操作
一、前言
在深度学习的世界中,数据的表示方式和操作效率直接影响模型的训练速度和效果。无论是图片、文本,还是表格数据,在进入神经网络之前都需要转化为模型能够理解的格式。张量(Tensor)就是这种核心数据结构。
在 PyTorch 中,张量不仅是存储数据的容器,更是 GPU 加速计算的载体。掌握张量的创建、操作与转换,是进入 PyTorch 深度学习实践的第一步。本篇文章将带你系统了解 PyTorch 中张量的基础概念与常用操作,为后续构建和训练深度学习模型打下坚实基础。
二、主要内容介绍
本文将围绕以下几个核心主题展开:
张量的基本概念 — 理解张量与数组、矩阵的关系。
张量的创建与初始化 — 介绍常用张量创建方法及其参数。
张量的基本操作 — 包括索引、切片、维度变换、拼接与拆分。
张量与 NumPy 的互操作性 — 在 PyTorch 与 NumPy 之间高效转换数据。
张量的计算与 GPU 加速 — 利用 CUDA 提升运算速度。
三、主要内容分节介绍
1. 张量的基本概念
定义
张量(Tensor)是一个多维数组,可以看作是标量(0维)、向量(1维)、矩阵(2维)向高维推广的数学概念。
与 NumPy 的区别
在PyTorch和TensorFlow中为
Tensor
)都与Numpy的ndarray
类似,但最大的不同是张量可以在 GPU 上进行计算,其次,张量类支持自动微分。 这些功能使得张量类更适合深度学习。极大提升了深度学习模型的训练速度。张量的属性
shape(形状)
dtype(数据类型)
device(设备位置:CPU 或 GPU)
2. 张量的创建与初始化
常用创建方法:
import torch# 直接创建 x = torch.tensor([1, 2, 3], dtype=torch.float32)# 全零 / 全一 zeros = torch.zeros((2, 3)) ones = torch.ones((2, 3))# 随机初始化 rand = torch.rand((2, 3)) # 均匀分布 randn = torch.randn((2, 3)) # 正态分布# 指定范围 arange = torch.arange(0, 10, 2) # [0, 2, 4, 6, 8] linspace = torch.linspace(0, 1, steps=5) # 等间隔# 与已有张量形状相同 like = torch.zeros_like(rand)
3. 张量的基本操作
(1) 索引与切片
x = torch.arange(12).reshape(3, 4) print(x[0, 1]) # 单个元素 print(x[:, 1]) # 某列 print(x[1, :]) # 某行 print(x[::2, ::2]) # 步长切片
(2) 维度变换
x = torch.arange(6).reshape(2, 3) print(x.T) # 转置 print(x.view(3, 2)) # 改变形状(不复制数据) print(x.reshape(3, 2)) # 改变形状(可能复制)
(3) 拼接与拆分
a = torch.ones((2, 2)) b = torch.zeros((2, 2)) print(torch.cat([a, b], dim=0)) # 按行拼接 print(torch.cat([a, b], dim=1)) # 按列拼接split = torch.chunk(a, chunks=2, dim=0) # 按行拆分成2份
4、tensor的运算符
我们的兴趣不仅限于读取数据和写入数据。 我们想在这些数据上执行数学运算,其中最简单且最有用的操作是按元素(elementwise)运算。 它们将标准标量运算符应用于数组的每个元素。 对于将两个数组作为输入的函数,按元素运算将二元运算符应用于两个数组中的每对位置对应的元素。 我们可以基于任何从标量到标量的函数来创建按元素函数。
对于任意具有相同形状的张量, 常见的标准算术运算符(+
、-
、*
和/
)都可以被升级为按元素运算。 我们可以在同一形状的任意两个张量上调用按元素操作。 在下面的例子中,我们使用逗号来表示一个具有5个元素的元组,其中每个元素都是按元素操作的结果。
x = torch.tensor([1.0, 2, 4, 8]) y = torch.tensor([2, 2, 2, 2]) x + y, x - y, x * y, x / y, x ** y # **运算符是求幂运算
torch.exp(x)
我们也可以把多个张量连结(concatenate)在一起, 把它们端对端地叠起来形成一个更大的张量。 我们只需要提供张量列表,并给出沿哪个轴连结。 下面的例子分别演示了当我们沿行(轴-0,形状的第一个元素) 和按列(轴-1,形状的第二个元素)连结两个矩阵时,会发生什么情况。 我们可以看到,第一个输出张量的轴-0长度(6)是两个输入张量轴-0长度的总和(3+3); 第二个输出张量的轴-1长度(8)是两个输入张量轴-1长度的总和(4+4)。
X = torch.arange(12, dtype=torch.float32).reshape((3,4)) Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1)
5. 张量与 NumPy 的互操作性
PyTorch → NumPy
x = torch.ones(5) np_array = x.numpy()
NumPy → PyTorch
import numpy as np n = np.ones(5) t = torch.from_numpy(n)
注意:共享内存,修改其中一个会影响另一个。
6. 张量的计算与 GPU 加速
基本运算
a = torch.tensor([1, 2, 3], dtype=torch.float32) b = torch.tensor([4, 5, 6], dtype=torch.float32)print(a + b) # 加法 print(a * b) # 乘法 print(torch.dot(a, b)) # 点积 print(torch.matmul(a.view(1, 3), b.view(3, 1))) # 矩阵乘法
移动到 GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") x = torch.rand((1000, 1000), device=device) y = torch.rand((1000, 1000), device=device) z = torch.matmul(x, y) # GPU 加速计算
四、总结
张量(Tensor)是 PyTorch 中的核心数据结构,掌握张量的创建、操作与转换,是进行深度学习实践的第一步。本篇我们从张量的概念出发,介绍了张量的初始化方法、基本操作、与 NumPy 的互操作性以及 GPU 加速的用法。
下一步,你可以尝试用这些张量操作去构建简单的神经网络结构,例如多层感知机(MLP),逐步将张量操作与深度学习模型训练结合起来,这将为你后续深入 PyTorch 提供坚实基础。