pytorch中 transpose()和permute()和view()的使用

112 篇文章 7 订阅
68 篇文章 6 订阅

permute 介绍:
permute():一次性做任意维度的交换,三个变量的赋值分别问0,1,2
举例:

torch.size([3,4,6]) # 这里对应的permute(0,1,2)

torch.permute(1,0,2)

>>> torch.size([4,3,6])

torch.transpose 介绍:
torch.transpose()和torch.permute()两者作用相似,都是用于交换不同维度的内容。但其中torch.transpose()是只交换指定的两个维度的内容permute()则可以一次性交换多个维度
当矩阵是2维时,我们可以把transpose理解为转置。

>>> x = torch.randn(2, 3) # 随机生成(2,3)的矩阵
>>> x
tensor([[ 1.0028, -0.9893,  0.5809],
        [-0.1669,  0.7299,  0.4942]])
        
>>> torch.transpose(x, 0, 1) # 交换x的第0维和第1维.第0维跑到第1维的位置,第1维跑到第0维的位置

tensor([[ 1.0028, -0.1669],
        [-0.9893,  0.7299],
        [ 0.5809,  0.4942]])

view()
view():view是将数据按照你设定的方式排列

torch.size([2,3,5])

torch.view(2,5,3)

则变成torch.size([2,5,3])

view()还支持自动计算一个维度的数量。只需要在想要自动计算的维度填上-1即可。

import torch

a1 = torch.randn([3,4,2]) 
print(a1.shape) # 输出结果:torch.Size([3, 4, 2])
a2 =a1.view(-1,2,6)
print(a2.shape) # 输出结果:torch.Size([2, 2, 6])
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的PyTorch代码示例,用于实现视觉Transformer的多头注意力机制: ``` python import torch import torch.nn as nn class MultiHeadAttention(nn.Module): def __init__(self, d_model, num_heads): super(MultiHeadAttention, self).__init__() self.num_heads = num_heads self.d_model = d_model assert d_model % self.num_heads == 0 self.depth = d_model // self.num_heads self.Wq = nn.Linear(d_model, d_model) self.Wk = nn.Linear(d_model, d_model) self.Wv = nn.Linear(d_model, d_model) self.fc = nn.Linear(d_model, d_model) def scaled_dot_product_attention(self, Q, K, V, mask=None): d_k = Q.size(-1) scores = torch.matmul(Q, K.transpose(-1, -2)) / torch.sqrt(torch.tensor(d_k, dtype=torch.float32)) if mask is not None: scores = scores.masked_fill(mask == 0, -1e9) attention = torch.softmax(scores, dim=-1) output = torch.matmul(attention, V) return output, attention def split_heads(self, x, batch_size): x = x.view(batch_size, -1, self.num_heads, self.depth) return x.permute(0, 2, 1, 3) def forward(self, Q, K, V, mask=None): batch_size = Q.size(0) Q = self.Wq(Q) K = self.Wk(K) V = self.Wv(V) Q = self.split_heads(Q, batch_size) K = self.split_heads(K, batch_size) V = self.split_heads(V, batch_size) scaled_attention, attention = self.scaled_dot_product_attention(Q, K, V, mask) scaled_attention = scaled_attention.permute(0, 2, 1, 3).contiguous() scaled_attention = scaled_attention.view(batch_size, -1, self.d_model) output = self.fc(scaled_attention) return output, attention ``` 在这个代码,我们定义了一个 `MultiHeadAttention` 类,它包含了多头注意力机制的实现。在 `__init__` 函数,我们定义了注意力机制的一些参数,包括输入向量的维度 `d_model` 和头的数量 `num_heads`。我们还定义了一些线性层,用于将输入向量映射到查询、键和值向量。最后,我们定义了一个全连接层,用于将多头注意力机制的输出向量映射回原始向量的维度。 在 `scaled_dot_product_attention` 函数,我们计算了查询向量 `Q` 和键向量 `K` 之间的点积相似度,并对其进行了缩放。我们还可以选择对注意力矩阵应用一个掩码矩阵,以排除一些不必要的信息。最后,我们将注意力矩阵与值向量 `V` 相乘,得到多头注意力机制的输出向量。 在 `split_heads` 函数,我们将输入向量分成多个头,并将它们重新排列成一个更高维的张量。这样做是为了使每个头可以独立地进行注意力计算,从而提高模型的效率。 在 `forward` 函数,我们首先将输入向量通过线性层映射到查询、键和值向量。然后,我们将它们分成多个头,并将它们传递给 `scaled_dot_product_attention` 函数。最后,我们将多头注意力机制的输出向量通过全连接层映射回原始向量的维度,并返回它们以及注意力矩阵。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值