如何将PyTorch张量更改为尺寸不同的一半和/或两倍大小?

时间:2019-06-24 08:52:05

标签: python pytorch

我是PyTorch和张量数据的新手。我在切换张量形状时遇到问题。

我有两个问题。

首先,如果我有一个torch.Size([8, 512, 16, 16])的张量并且想要将其更改为torch.Size([8, 256, 32, 32]),它是原始张量的两倍,该怎么办。

第二,如果我有一个torch.Size([8, 256, 32, 32])的张量并且想要将其更改为torch.Size([8, 512, 16, 16]),它是原始张量的一半,该怎么办。

在第一个问题中,我尝试使用ZeroPadding2D(8)函数将其重塑为torch.Size([8, 512, 32, 32]),但是我不知道如何将512的第二维更改为256。

第一个问题的实际用法是这样的。

x = input # torch.Size([8, 512, 16, 16])
x = layer(x) # torch.Size([8, 256, 32, 32]
x = x + input # what I want to do is adding tensor values before and after passing the layer together (like skip connection)

我希望将两个张量相加的输出是成功的,但实际输出是关于尺寸不相等的错误

1 个答案:

答案 0 :(得分:0)

  • 对于第一种情况,请使用resize_()将第二维从512更改为256,然后使用填充值和目标尺寸分配张量,并分配具有数据的部分。

  • >
    import torch
    
    target_output = torch.zeros(8, 256, 32, 32)
    
    in_tensor = torch.randn(8, 512, 16, 16)
    out_temp = in_tensor.resize_((8, 256, 16, 16))
    
    target_output[:, :, :16, :16] = out_temp
    print(target_output.shape)
    
    # output:
    # torch.Size([8, 256, 32, 32])
    

    您还可以使用torch.nn.ConstantPad2d(),然后使用resize_(),如下所示:

    in_tensor = torch.randn(8, 512, 16, 16)
    m = nn.ConstantPad2d((8, 8, 8, 8), 0)
    out_tensor = m(in_tensor).resize_(8, 256, 16, 16)
    print(out_tensor.shape) 
    
    # output:
    # torch.Size([8, 256, 32, 32])
    

    或者,您也可以像下面这样使用torch.nn.ConstantPad2d()copy_()

    import torch.nn as nn
    in_tensor = torch.randn(8, 512, 16, 16)  # shape [8, 512, 16, 16]
    m = nn.ConstantPad2d((8, 8, 8, 8), 0) 
    temp = m(in_tensor)                      # shape [8, 512, 32, 32]
    out_tensor = torch.zeros(8, 256, 32, 32) # shape [8, 256, 32, 32]
    out_tensor = out_tensor[:,:,:,:].copy_(temp[:,:256,:,:]) # shape [8, 256, 32, 32]
    

    您可以从here中了解有关使用pytorch中的填充重塑张量的更多信息。

  • 对于第二种情况,您可以简单地使用resize_()将张量调整为大小的一半。

    in_tensor = torch.randn(8, 256, 32, 32)
    out_tensor = in_tensor.resize_(8, 512, 16, 16)
    print(out_tensor.shape)
    
    # output:
    # torch.Size([8, 512, 16, 16])
    

    或者,您可以按以下方式使用copy_

    in_tensor = torch.randn(8, 256, 32, 32)
    temp_tensor = torch.zeros(8, 512, 16, 16) # shape [8, 512, 16, 16]
    temp_tensor[:,:256,:,:].copy_(in_tensor[:,:,:16,:16]) # shape [8, 512, 16, 16]
    out_tensor = temp_tensor # shape [8, 512, 16, 16]
    

    不使用copy_()

    in_tensor = torch.randn(8, 256, 32, 32)
    out_tensor = torch.zeros(8, 512, 16, 16) # shape [8, 512, 16, 16]
    out_tensor[:,:256,:,:] = in_tensor[:,:,:16,:16]