本文主要是介绍Meta Llama 3 .transpose().contiguous().view,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Meta Llama 3 .transpose().contiguous().view()
flyfish
参考地址
https://pytorch.org/docs/stable/generated/torch.transpose.html
transpose美[træn'spoʊz]
英[træns'pəʊz;trɑːns-;-nz-]
v. 使换位 / 转移 / 转换 / 调换n. <数>转置(矩)阵
矩阵转置(Matrix Transposition)是指将矩阵的行和列互换的位置。具体来说,如果你有一个矩阵 A A A,它的转置矩阵 A T A^T AT 是将矩阵 A A A 的第 i i i 行变为第 i i i 列,第 j j j 列变为第 j j j 行。
例子
假设有一个矩阵 A A A:
A = [ 1 2 3 4 5 6 ] A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} A=[142536]
矩阵 A A A 的转置 A T A^T AT 将如下:
A T = [ 1 4 2 5 3 6 ] A^T = \begin{bmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{bmatrix} AT= 123456
用 PyTorch 实现矩阵转置
我们可以使用 PyTorch 的 torch.transpose 函数来实现上述的矩阵转置操作。
import torch# 创建一个二维张量(矩阵)
A = torch.tensor([[1, 2, 3], [4, 5, 6]])# 进行转置操作
A_T = torch.transpose(A, 0, 1)print("Original Matrix (A):")
print(A)print("\nTransposed Matrix (A^T):")
print(A_T)
运行这段代码的输出如下:
Original Matrix (A):
tensor([[1, 2, 3],[4, 5, 6]])Transposed Matrix (A^T):
tensor([[1, 4],[2, 5],[3, 6]])
在 PyTorch 中,torch.transpose 函数用于交换张量的两个维度(轴)。参数 dim0 和 dim1 指定了需要交换的这两个维度。理解这两个参数需要先了解张量的维度(轴)的概念。
张量维度(轴)
-
0维张量:一个标量(例如:5)
-
1维张量:一个向量(例如:[1, 2, 3])
-
2维张量:一个矩阵(例如:[[1, 2, 3], [4, 5, 6]])
-
3维张量:一个三维数组(例如:一个形状为(2, 2, 3)的张量)
在一个张量中,维度(轴)从外到内依次编号: -
对于一个形状为 (3, 4) 的二维张量,dim0 是第一个维度(3的那个维度),dim1 是第二个维度(4的那个维度)。
-
对于一个形状为 (2, 3, 4) 的三维张量,dim0 是第一个维度(2的那个维度),dim1 是第二个维度(3的那个维度),dim2 是第三个维度(4的那个维度)。
示例说明
二维张量
考虑一个二维张量(矩阵):
import torchA = torch.tensor([[1, 2, 3], [4, 5, 6]])
它的形状是 (2, 3),即有 2 行和 3 列。
- dim0 是 0 轴,对应行数 2。
- dim1 是 1 轴,对应列数 3。
调用 torch.transpose(A, 0, 1) 将交换行和列:
A_T = torch.transpose(A, 0, 1)
print(A_T)
输出:
tensor([[1, 4],[2, 5],[3, 6]])
三维张量
考虑一个三维张量:
B = torch.tensor([[[1, 2, 3], [4, 5, 6]],[[7, 8, 9], [10, 11, 12]]])
它的形状是 (2, 2, 3),即有 2 个深度,每个深度包含一个 (2, 3) 的矩阵。
- dim0 是 0 轴,对应第一个维度 2。
- dim1 是 1 轴,对应第二个维度 2。
- dim2 是 2 轴,对应第三个维度 3。
调用 torch.transpose(B, 1, 2) 将交换第二个和第三个维度:
B_T = torch.transpose(B, 1, 2)
print(B_T)
输出:
tensor([[[ 1, 4],[ 2, 5],[ 3, 6]],[[ 7, 10],[ 8, 11],[ 9, 12]]])
分析三维张量转置
原始三维张量
原始张量 B 是:
tensor([[[ 1, 2, 3],[ 4, 5, 6]],[[ 7, 8, 9],[10, 11, 12]]])
它的形状是 (2, 2, 3),这意味着:
- 第一个维度有 2 个元素,每个元素是一个二维矩阵。
- 每个二维矩阵的第二个维度有 2 行。
- 每行有 3 列(第三个维度)。
转置操作 torch.transpose(B, 1, 2)
torch.transpose(B, 1, 2) 交换了第二个和第三个维度,这意味着我们将行和列互换。具体步骤如下:
- 原始张量的形状:(2, 2, 3)
- 交换第二和第三个维度:(2, 3, 2)
操作后,我们的新张量 B_T 是:
tensor([[[ 1, 4],[ 2, 5],[ 3, 6]],[[ 7, 10],[ 8, 11],[ 9, 12]]])
新张量 B_T 解释
- 第一个维度(深度)仍然是 2,表示有 2 个二维矩阵。
- 第二个维度现在有 3 行(原来的列数)。
- 第三个维度现在有 2 列(原来的行数)。
在 PyTorch 中,transpose、contiguous 和 view 这几个操作经常结合使用,是因为 transpose 只是改变了张量的视图,而不是实际内存布局。为了能够顺利进行后续的操作(例如 view),通常需要先调用 contiguous 来保证张量在内存中的布局是连续的。
1. transpose 改变视图但不改变内存布局
当我们使用 transpose 时,PyTorch 只是改变了张量的视图,并没有改变张量在内存中的实际存储方式。这样,转置后的张量在内存中不一定是连续的。如果直接对不连续的张量使用 view 会导致错误,因为 view 要求张量在内存中是连续的。
2. contiguous 使张量在内存中连续
使用 contiguous 可以创建一个新的张量,使得数据在内存中按当前视图的顺序连续存储。这样就可以确保在使用 view 时不会出现错误。
3. view 改变形状
view 可以改变张量的形状,但前提是张量在内存中是连续的。如果我们在一个不连续的张量上直接使用 view,会引发错误。因此,在调用 view 之前,通常会先调用 contiguous。
import torch# 假设有一个形状为 (batch_size, seq_len, features) 的张量
batch_size, seq_len, features = 2, 3, 4
x = torch.randn(batch_size, seq_len, features)# 进行转置操作
x_transposed = x.transpose(1, 2)# 打印张量信息
print("Transposed shape:", x_transposed.shape)
print("Is contiguous:", x_transposed.is_contiguous())# 确保内存布局连续
x_contiguous = x_transposed.contiguous()# 打印张量信息
print("Contiguous shape:", x_contiguous.shape)
print("Is contiguous:", x_contiguous.is_contiguous())# 使用 view 改变形状
new_shape = (batch_size, seq_len, -1)
x_viewed = x_contiguous.view(*new_shape)# 打印最终形状
print("Final shape:", x_viewed.shape)# Transposed shape: torch.Size([2, 4, 3])
# Is contiguous: False
# Contiguous shape: torch.Size([2, 4, 3])
# Is contiguous: True
# Final shape: torch.Size([2, 3, 4])
这篇关于Meta Llama 3 .transpose().contiguous().view的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!