Pytorch函数expand()详解

Pytorch函数 .expand( )

其将单个维度扩大成更大维度,返回一个新的tensor,具体看下例:

import torch

a = torch.Tensor([[1], [2], [3],[4]])
# 未使用expand()函数前的a
print('a.size: ', a.size())
print('a: ', a)

b = a.expand(4, 2)
# 使用expand()函数后的输出
print('a.size: ', a.size())
print('a: ', a)
print('b.size: ', b.size())
print('b: ', b)

expand()函数使用前后a没有发生变化,输出都是:

a.size: torch.Size([4, 1])
a:
1
2
3
4
[torch.FloatTensor of size 4x1]

b 的输出为:

b.size: torch.Size([4, 2])
b:
1 1
2 2
3 3
4 4
[torch.FloatTensor of size 4x2]
由此得出结论,a通过expand()函数扩展某一维度后自身不会发生变化

a = torch.Tensor([[[[1,2], [2,3], [3,4],[4,5]]]])
b = a.expand(2, 1, 4, 2)
c = a.expand(1, 2, 4, 2)
# 使用expand()函数后的输出
print('a.size: ', a.size())

print('b.size: ', b.size())
print('b: ', b)

print('c.size: ', c.size())
print('c: ', c)

 b2 = b.expand(3, 1, 4, 2)  # b: torch.Size([2, 1, 4, 2])
 print('b2.size: ', b2.size())

输出:

a.size: torch.Size([1, 1, 4, 2])

b.size: torch.Size([2, 1, 4, 2])
b:
(0 ,0 ,.,.) =
1 2
2 3
3 4
4 5
(1 ,0 ,.,.) =
1 2
2 3
3 4
4 5
[torch.FloatTensor of size 2x1x4x2]

c.size: torch.Size([1, 2, 4, 2])
c:
(0 ,0 ,.,.) =
1 2
2 3
3 4
4 5
(0 ,1 ,.,.) =
1 2
2 3
3 4
4 5
[torch.FloatTensor of size 1x2x4x2]

b2输出:

Traceback (most recent call last):
File “”, line 1, in
RuntimeError: The expanded size of the tensor (3) must match the existing size (2) at non-singleton dimension 0. at /opt/conda/conda-bld/pytorch_1525796793591/work/torch/lib/TH/generic/THTensor.c:309

由此可见,只要是单维度均可进行扩展,但是若非单维度会报错

PyTorch中实现带有Softmax函数的注意力机制,关键在于正确地应用掩码处理以处理不同长度的序列数据。这涉及到对输入数据进行适当的预处理,以确保在应用Softmax函数时能够屏蔽掉不需要考虑的序列部分。 参考资源链接:[PyTorch实现注意力机制详解](https://wenku.csdn.net/doc/645321c2ea0840391e76eb1b?spm=1055.2569.3001.10343) 首先,你需要导入必要的PyTorch模块,包括`torch`和`torch.nn`。接下来,定义一个序列掩码函数`sequence_mask`,该函数生成一个与输入序列长度匹配的掩码张量,用于在后续的Softmax操作中屏蔽掉超出序列长度的部分。 以下是`sequence_mask`函数的实现代码: ```python import torch import torch.nn.functional as F def sequence_mask(lengths, max_len=None): if max_len is None: max_len = lengths.max() batch_size = lengths.size(0) # 生成一个形状为(batch_size, max_len)的二维张量,其元素值为从0到max_len-1的序列 range_tensor = torch.arange(max_len, device=lengths.device).unsqueeze(0).expand(batch_size, -1) # 通过比较生成一个布尔型掩码张量,对于超出序列长度的位置为False return range_tensor < lengths.unsqueeze(1) ``` 然后,你可以使用`sequence_mask`函数来创建掩码,并将其用于`masked_softmax`函数中。`masked_softmax`函数确保在计算Softmax时,只对有效长度内的序列元素进行操作。 实现`masked_softmax`函数的代码如下: ```python def masked_softmax(X, valid_length): # 如果valid_length为None,则不对X进行任何掩码操作 if valid_length is None: return F.softmax(X, dim=-1) else: # 否则,首先根据valid_length扩展维度以匹配X valid_length = valid_length.unsqueeze(-1) # 使用sequence_mask生成掩码张量,扩展维度以匹配X mask = sequence_mask(valid_length, X.size(-1)) # 将掩码张量转换为与X相同的数据类型,并应用掩码 mask = mask.type_as(X) result = X.masked_fill(~mask, float('-inf')) return F.softmax(result, dim=-1) ``` 通过上述两个函数,你可以在PyTorch中实现一个能够处理不同长度序列数据的注意力机制。这个方法可以方便地集成到你的神经网络模型中,特别是在实现诸如Transformer这类需要有效处理序列数据的模型时非常有用。 为了深入理解和掌握注意力机制在PyTorch中的应用,建议参考《PyTorch实现注意力机制详解》这份资料。该资料详细解释了注意力机制的理论基础,并通过实际代码示例展示了如何在PyTorch中实现这一机制,包括Softmax函数的正确应用以及如何处理不同长度的序列数据。通过学习这份资料,你将能够更全面地掌握PyTorch在自然语言处理中的高级应用。 参考资源链接:[PyTorch实现注意力机制详解](https://wenku.csdn.net/doc/645321c2ea0840391e76eb1b?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值