一、前言
本文将介绍PyTorch中张量的拆分(split、unbind、chunk)、拓展(repeat、cat、stack)、修改操作(使用索引和切片、gather、scatter)
二、实验环境
本系列实验使用如下环境
代码语言:javascript复制conda create -n DL python==3.11
代码语言:javascript复制conda activate DL
代码语言:javascript复制conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
三、PyTorch数据结构
1、Tensor(张量)
Tensor(张量)是PyTorch中用于表示多维数据的主要数据结构,类似于多维数组,可以存储和操作数字数据。
1. 维度(Dimensions)
Tensor(张量)的维度(Dimensions)是指张量的轴数或阶数。在PyTorch中,可以使用size()方法获取张量的维度信息,使用dim()方法获取张量的轴数。
2. 数据类型(Data Types)
PyTorch中的张量可以具有不同的数据类型:
- torch.float32或torch.float:32位浮点数张量。
- torch.float64或torch.double:64位浮点数张量。
- torch.float16或torch.half:16位浮点数张量。
- torch.int8:8位整数张量。
- torch.int16或torch.short:16位整数张量。
- torch.int32或torch.int:32位整数张量。
- torch.int64或torch.long:64位整数张量。
- torch.bool:布尔张量,存储True或False。
【深度学习】Pytorch 系列教程(一):PyTorch数据结构:1、Tensor(张量)及其维度(Dimensions)、数据类型(Data Types)
3. GPU加速(GPU Acceleration)
【深度学习】Pytorch 系列教程(二):PyTorch数据结构:1、Tensor(张量): GPU加速(GPU Acceleration)
2、张量的数学运算
PyTorch提供了丰富的操作函数,用于对Tensor进行各种操作,如数学运算、统计计算、张量变形、索引和切片等。这些操作函数能够高效地利用GPU进行并行计算,加速模型训练过程。
1. 向量运算
【深度学习】Pytorch 系列教程(三):PyTorch数据结构:2、张量的数学运算(1):向量运算(加减乘除、数乘、内积、外积、范数、广播机制)
2. 矩阵运算
【深度学习】Pytorch 系列教程(四):PyTorch数据结构:2、张量的数学运算(2):矩阵运算及其数学原理(基础运算、转置、行列式、迹、伴随矩阵、逆、特征值和特征向量)
3. 向量范数、矩阵范数、与谱半径详解
【深度学习】Pytorch 系列教程(五):PyTorch数据结构:2、张量的数学运算(3):向量范数(0、1、2、p、无穷)、矩阵范数(弗罗贝尼乌斯、列和、行和、谱范数、核范数)与谱半径详解
4. 一维卷积运算
【深度学习】Pytorch 系列教程(六):PyTorch数据结构:2、张量的数学运算(4):一维卷积及其数学原理(步长stride、零填充pad;宽卷积、窄卷积、等宽卷积;卷积运算与互相关运算)
5. 二维卷积运算
【深度学习】Pytorch 系列教程(七):PyTorch数据结构:2、张量的数学运算(5):二维卷积及其数学原理
6. 高维张量
【深度学习】pytorch教程(八):PyTorch数据结构:2、张量的数学运算(6):高维张量:乘法、卷积(conv2d~ 四维张量;conv3d~五维张量)
3、张量的统计计算
【深度学习】Pytorch教程(九):PyTorch数据结构:3、张量的统计计算详解
4、张量操作
1. 张量变形
【深度学习】Pytorch教程(十):PyTorch数据结构:4、张量操作(1):张量变形操作
2. 索引
3. 切片
【深度学习】Pytorch 教程(十一):PyTorch数据结构:4、张量操作(2):索引和切片操作
4. 张量修改
a. 张量拆分
split
沿指定维度将张量拆分为多个张量
代码语言:javascript复制import torch
# 创建一个张量
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
y1, y2 = x.split(2, dim=1)
print(y1)
print(y2)
unbind
沿指定维度对张量进行拆分,返回拆分后的张量列表
代码语言:javascript复制import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
y1, y2 = x.unbind(dim=0)
print(y1)
print(y2)
chunk
沿指定维度将张量均匀分割为多个张量
代码语言:javascript复制import torch
# 创建一个张量
x = torch.tensor([[1, 2, 3, 4, 5, 6]])
# 沿指定维度均匀分割为多个张量
y = x.chunk(3, dim=1)
for chunk in y:
print(chunk)
b. 张量扩展
repeat
复制张量中的元素进行重复操作
代码语言:javascript复制import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
# 重复操作
y = x.repeat(1, 2)
print(y)
z = x.repeat(2, 2)
print(z)
cat
沿指定维度对多个张量进行拼接
代码语言:javascript复制import torch
x1 = torch.tensor([[1, 2, 3], [4, 5, 6]])
x2 = torch.tensor([[7, 8, 9], [10, 11, 12]])
# 在指定维度上进行拼接
y = torch.cat((x1, x2), dim=0)
print(y)
stack
沿新的维度对多个张量进行堆叠
代码语言:javascript复制import torch
# 创建两个张量
x1 = torch.tensor([[1, 2, 3], [4, 5, 6]])
x2 = torch.tensor([[7, 8, 9], [10, 11, 12]])
# 在新维度上进行堆叠
y = torch.stack((x1, x2), dim=0)
print(y)
c. 张量修改
使用索引和切片进行修改
可以使用索引和切片操作来修改张量中的特定元素或子集
代码语言:javascript复制import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
x[0, 1] = 9 # 修改第0行、第1列的元素为9
print(x)
- 输出:
tensor([[1, 9, 3],
[4, 5, 6]])
gather
按指定索引从输入张量中收集指定维度的值
代码语言:javascript复制import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
# 按索引收集值
indices = torch.tensor([[0, 0, 1], [1, 0, 0]])
y = torch.gather(x, 1, indices)
print(y)
代码语言:javascript复制tensor([[1, 1, 2],
[5, 4, 4]])
scatter
将值按指定索引散射到新张量中
代码语言:javascript复制import torch
x = torch.zeros(2, 4)
# 按索引散射值
indices = torch.tensor([[0, 1], [2, 3]])
values = torch.tensor([[1, 2], [3, 4]], dtype=torch.float)
y = x.scatter(1, indices, values)
print(y)
代码语言:javascript复制tensor([[1., 2., 0., 0.],
[0., 0., 3., 4.]])