【深度学习】Pytorch教程(十):PyTorch数据结构:4、张量操作(1):张量形状操作

2024-07-30 11:13:19 浏览数 (1)

、前言

  本文将介绍PyTorch中张量的数学运算之矩阵运算,包括基础运算、转置、行列式、迹、伴随矩阵、逆、特征值和特征向量等。

二、实验环境

  本系列实验使用如下环境

代码语言: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. 张量形状操作
a. 维度改变
flatten展开

  使用flatten方法将张量展开为一维的向量:

代码语言:javascript复制
import torch
 
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
flattened_x = x.flatten()
print(flattened_x)
  • 输出:
代码语言:javascript复制
tensor([1, 2, 3, 4, 5, 6])
unsqueeze增维

  unsqueeze方法可以在指定的维度上增加一个大小为1的维度,而squeeze方法可以去除大小为1的维度。用于处理需要匹配张量形状的操作时。

代码语言:javascript复制
import torch
 
x = torch.tensor([1, 2, 3])
unsqueeze_x = x.unsqueeze(0)  # 在第0维度上增加一个大小为1的维度
print(unsqueeze_x)
  • 输出:
代码语言:javascript复制
tensor([[1, 2, 3]])
squeeze降维
代码语言:javascript复制
import torch
 
x = torch.tensor([[1, 2, 3]])
squeeze_x = x.squeeze(0)  # 去除第0维度的大小为1的维度
print(squeeze_x)
  • 输出:
代码语言:javascript复制
tensor([1, 2, 3])
b. 张量变形
view
代码语言:javascript复制
import torch

x = torch.tensor([[1, 2, 3],
                  [4, 5, 6]])

# 查看张量的形状
print(x.shape)  

# 将张量变形为3行2列的形状
y = x.view(3, 2)
print(y)  
  • 输出:
代码语言:javascript复制
torch.Size([2, 3])
tensor([[1, 2],
        [3, 4],
        [5, 6]])
  • 将张量变形为1维张量
代码语言:javascript复制
z = x.view(-1)

在进行变形时,需要确保新形状要与原始张量包含的元素数量一致,否则会引发错误。

reshape

  除了使用view方法外,还可以使用reshape函数来改变张量的形状:

代码语言:javascript复制
import torch
 
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
reshaped_x = x.reshape(3, 2)
print(reshaped_x)
  • 输出:
代码语言:javascript复制
tensor([[1, 2],
        [3, 4],
        [5, 6]])

  与view方法不同的是,reshape函数可以创建一个新的张量,而不会共享内存(不在原始张量上进行操作)。

reshape_as

  将张量重塑为与给定张量相同形状的张量。

代码语言:javascript复制
import torch

# 创建两个张量
x1 = torch.randn(3, 4)
x2 = torch.rand(6, 2)

# 将x1重塑为与x2相同形状的张量
y = x1.reshape_as(x2)
print(y.shape)  
  • 输出:
代码语言:javascript复制
torch.Size([6, 2])
c. 维度重排

  permute方法可以按照指定顺序重新排列维度,而transpose方法可以交换张量的两个维度。用于需要进行维度重排或转置操作。

permute
代码语言:javascript复制
import torch

# 创建一个三维张量
x = torch.randn(2, 3, 4)

# 按照指定顺序重新排列维度
y = x.permute(2, 0, 1)
print(y.shape) 
  • 输出:
代码语言:javascript复制
torch.Size([4, 2, 3])
transpose
代码语言:javascript复制
import torch

x = torch.randn(2, 3, 4)

# 交换维度
y = x.transpose(0, 1)
print(y.shape)
  • 输出:
代码语言:javascript复制
torch.Size([3, 2, 4])
张量变形 VS 维度重排

0 人点赞