pytorch中数据格式变换及创建掩码mask示例

pytorch中数据格式变换及创建掩码mask示例

常用维度转换方法

import torch
case = torch.arange(0, 6).view(2, 3)
print(case, case.size())
# tensor([[0, 1, 2],
#         [3, 4, 5]]) torch.Size([2, 3])
  • permute()

    '''
    交换维度
    '''
    case_permute =  case.permute(1, 0)
    print(case_permute, case_permute.size())
    # tensor([[0, 3],
    #         [1, 4],
    #         [2, 5]]) torch.Size([3, 2])
    
  • view()

    '''
    view()函数作用是将一个多行的Tensor,拼接成指定维度。
    '''
    case_view = case.view(3, 2)
    print(case_view, case_view.size())
    # tensor([[0, 1],
    #         [2, 3],
    #         [4, 5]]) torch.Size([3, 2])
    # 注意不是[[0, 3], ...],与permute()做区分!
    
    case_view = case.view(1, -1)
    print(case_view, case_view.size())
    # tensor([[0, 1, 2, 3, 4, 5]]) torch.Size([1, 6])
    
  • squeeze()与unsqueeze()

    '''
    squeeze中的参数0、1分别代表第一、第二维度,squeeze(0)表示如果第一维度值为1,则去掉,否则不变。
    故case的维度(1,3),可去掉1成(3),但不可去掉3。
    '''
    case = torch.arange(0, 3).view(1, 3)
    print(case, case.size())
    # tensor([[0, 1, 2]]) torch.Size([1, 3])
    
    case_squeeze = case.squeeze(0)
    print(case_squeeze, case_squeeze.size())
    # tensor([0, 1, 2]) torch.Size([3])
    
    case_squeeze = case.squeeze(1)
    print(case_squeeze, case_squeeze.size())
    # tensor([[0, 1, 2]]) torch.Size([1, 3])
    
    '''
    unsqueeze()与squeeze()作用相反。参数代表的意思相同。
    '''
    case = torch.arange(0, 3).view(3)
    print(case, case.size())
    # tensor([0, 1, 2]) torch.Size([3])
    
    case_unsqueeze = case.unsqueeze(0)
    print(case_unsqueeze, case_unsqueeze.size())
    # tensor([[0, 1, 2]]) torch.Size([1, 3])
    
    case_unsqueeze = case.unsqueeze(1)
    print(case_unsqueeze, case_unsqueeze.size())
    # tensor([[0],
    #         [1],
    #         [2]]) torch.Size([3, 1])
    
  • expand()

    '''
    返回tensor的一个新视图,单个维度扩大为更大的尺寸。 tensor也可以扩大为更高维,新增加的维度将附在前面。 扩大tensor不需要分配新内存,只是仅仅新建一个tensor的视图,其中通过将stride设为0,一维将会扩展位更高维。任何一个一维的在不分配新内存情况下可扩展为任意的数值。
    需要注意的是:使用expand()函数的时候,x自身不会改变,因此需要将结果重新赋值。
    '''
    x = torch.Tensor([[1], 
                      [2], 
                      [3]])
    print("x.size():",x.size())
    
    y=x.expand( 3,4 )
    print("x.size():",x.size())
    print("y.size():",y.size())
    print(x)
    print(y)
    # x.size(): torch.Size([3, 1])
    # x.size(): torch.Size([3, 1])
    # y.size(): torch.Size([3, 4])
    # tensor([[1.],
    #         [2.],
    #         [3.]])
    # tensor([[1., 1., 1., 1.],
    #         [2., 2., 2., 2.],
    #         [3., 3., 3., 3.]])
    

示例:根据batch中句子长度lengths构建掩码mask

# sequence_length = torch.LongTensor([10,8,6,3,7]).cuda()  # 假设batch_size为5的输入.转换至gpu上
sequence_length = torch.LongTensor([10,8,6,3,7])  # 假设batch_size为5的输入
batch_size = sequence_length.size(0)                     # 获得batch_size
max_len = sequence_length.data.max()					 # 获得最大长度
seq_range = torch.arange(0,max_len).long()
print(seq_range, seq_range.size())
# tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) torch.Size([10])

seq_range_expand = seq_range.unsqueeze(0).expand(batch_size, max_len)
# seq_range_expand = seq_range_expand.cuda()  # 转换至gpu上
print(seq_range_expand, seq_range_expand.size())
# tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
#         [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
#         [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
#         [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
#         [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]) torch.Size([5, 10])

seq_length_expand = sequence_length.unsqueeze(1).expand_as(seq_range_expand) # expand_as 函数
print(seq_length_expand, seq_length_expand.size())
# tensor([[10, 10, 10, 10, 10, 10, 10, 10, 10, 10],
#         [ 8,  8,  8,  8,  8,  8,  8,  8,  8,  8],
#         [ 6,  6,  6,  6,  6,  6,  6,  6,  6,  6],
#         [ 3,  3,  3,  3,  3,  3,  3,  3,  3,  3],
#         [ 7,  7,  7,  7,  7,  7,  7,  7,  7,  7]]) torch.Size([5, 10])

print(seq_range_expand < seq_length_expand)
# tensor([[ True,  True,  True,  True,  True,  True,  True,  True,  True,  True],
#         [ True,  True,  True,  True,  True,  True,  True,  True, False, False],
#         [ True,  True,  True,  True,  True,  True, False, False, False, False],
#         [ True,  True,  True, False, False, False, False, False, False, False],
#         [ True,  True,  True,  True,  True,  True,  True, False, False, False]])

另一种创建mask的简单方法

def generate_sent_masks(self, batch_size, max_seq_length, source_lengths):
    """ Generate sentence masks for encoder hidden states.
        returns enc_masks (Tensor): Tensor of sentence masks of shape (b, max_seq_length),where max_seq_length = max source length """
    enc_masks = torch.zeros(batch_size, max_seq_length, dtype=torch.float)
    for e_id, src_len in enumerate(source_lengths):
        enc_masks[e_id, :src_len] = 1
    return enc_masks
  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用PyTorch实现掩码自编码器的示例: ``` import torch import torch.nn as nn import torch.optim as optim class MaskedAutoencoder(nn.Module): def __init__(self, input_size, hidden_size): super(MaskedAutoencoder, self).__init__() self.encoder = nn.Sequential( nn.Linear(input_size, hidden_size), nn.ReLU(), nn.Linear(hidden_size, hidden_size), nn.ReLU(), nn.Linear(hidden_size, hidden_size), ) self.decoder = nn.Sequential( nn.Linear(hidden_size, hidden_size), nn.ReLU(), nn.Linear(hidden_size, input_size), ) def forward(self, x, mask): encoded = self.encoder(x * mask) decoded = self.decoder(encoded) return decoded * mask input_size = 10 hidden_size = 5 model = MaskedAutoencoder(input_size, hidden_size) criterion = nn.MSELoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # Dummy data data = torch.rand(100, input_size) mask = torch.zeros(100, input_size) mask[:, :5] = 1 for epoch in range(100): optimizer.zero_grad() output = model(data, mask) loss = criterion(output, data) loss.backward() optimizer.step() print('Epoch {}: Loss = {}'.format(epoch+1, loss.item())) ``` 在这个示例,我们首先定义了一个名为`MaskedAutoencoder`的类,它继承自`nn.Module`。该类实现了一个简单的自编码器,其编码器和解码器都是由线性层和ReLU激活函数组成的简单神经网络。在前向传递过程,我们将输入向量乘以一个掩码,以确保只有掩码指定的部分被编码和解码。 我们使用均方误差损失函数和Adam优化器来训练模型。在每个时期,我们将数据传递到模型,并计算损失。然后我们计算损失的梯度并使用优化器来更新模型参数。最后,我们打印出当前时期的损失。 在这个示例,我们使用了一个伪造的数据集,其输入向量是大小为10的随机向量,掩码是一个大小为10的零向量,其前5个元素是1。这意味着我们只想编码和解码输入向量的前5个元素。您可以根据需要更改数据集和掩码

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值