文章目录
- 一、前言
- 二、实验环境
- 三、PyTorch数据结构
- 1、Tensor(张量)
- 1. 维度(Dimensions)
- 2. 数据类型(Data Types)
- 3. GPU加速(GPU Acceleration)
- 2、张量的数学运算
- 1. 向量运算
- 2. 矩阵运算
- 3. 向量范数、矩阵范数、与谱半径详解
- 4. 一维卷积运算
- 5. 二维卷积运算
- 6. 高维张量
- 3、张量的统计计算
- 4、张量操作
- 1. 张量形状操作
- a. 维度改变
- flatten展开
- unsqueeze增维
- squeeze降维
- b. 张量变形
- view
- reshape
- reshape_as
- c. 维度重排
- permute
- transpose
- 张量变形 VS 维度重排
一、前言
本文将介绍PyTorch中张量的数学运算之矩阵运算,包括基础运算、转置、行列式、迹、伴随矩阵、逆、特征值和特征向量等。
二、实验环境
本系列实验使用如下环境
conda create -n DL python==3.11
conda activate DL
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. 张量形状操作
a. 维度改变
flatten展开
使用flatten
方法将张量展开为一维的向量:
import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
flattened_x = x.flatten()
print(flattened_x)
- 输出:
tensor([1, 2, 3, 4, 5, 6])
unsqueeze增维
unsqueeze方法可以在指定的维度上增加一个大小为1的维度,而squeeze方法可以去除大小为1的维度。用于处理需要匹配张量形状的操作时。
import torch
x = torch.tensor([1, 2, 3])
unsqueeze_x = x.unsqueeze(0) # 在第0维度上增加一个大小为1的维度
print(unsqueeze_x)
- 输出:
tensor([[1, 2, 3]])
squeeze降维
import torch
x = torch.tensor([[1, 2, 3]])
squeeze_x = x.squeeze(0) # 去除第0维度的大小为1的维度
print(squeeze_x)
- 输出:
tensor([1, 2, 3])
b. 张量变形
view
import torch
x = torch.tensor([[1, 2, 3],
[4, 5, 6]])
# 查看张量的形状
print(x.shape)
# 将张量变形为3行2列的形状
y = x.view(3, 2)
print(y)
- 输出:
torch.Size([2, 3])
tensor([[1, 2],
[3, 4],
[5, 6]])
- 将张量变形为1维张量
z = x.view(-1)
在进行变形时,需要确保新形状要与原始张量包含的元素数量一致,否则会引发错误。
reshape
除了使用view方法外,还可以使用reshape函数来改变张量的形状:
import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
reshaped_x = x.reshape(3, 2)
print(reshaped_x)
- 输出:
tensor([[1, 2],
[3, 4],
[5, 6]])
与view方法不同的是,reshape函数可以创建一个新的张量,而不会共享内存(不在原始张量上进行操作)。
reshape_as
将张量重塑为与给定张量相同形状的张量。
import torch
# 创建两个张量
x1 = torch.randn(3, 4)
x2 = torch.rand(6, 2)
# 将x1重塑为与x2相同形状的张量
y = x1.reshape_as(x2)
print(y.shape)
- 输出:
torch.Size([6, 2])
c. 维度重排
permute方法可以按照指定顺序重新排列维度,而transpose方法可以交换张量的两个维度。用于需要进行维度重排或转置操作。
permute
import torch
# 创建一个三维张量
x = torch.randn(2, 3, 4)
# 按照指定顺序重新排列维度
y = x.permute(2, 0, 1)
print(y.shape)
- 输出:
torch.Size([4, 2, 3])
transpose
import torch
x = torch.randn(2, 3, 4)
# 交换维度
y = x.transpose(0, 1)
print(y.shape)
- 输出:
torch.Size([3, 2, 4])