Python 如何将PyTorch张量变为具有不同维数的半尺寸和/或双尺寸?

Python 如何将PyTorch张量变为具有不同维数的半尺寸和/或双尺寸?,python,pytorch,Python,Pytorch,我不熟悉Pytork和张量数据。我有一个关于转换张量形状的问题 我有两个问题 首先,如果我有一个具有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)函数

我不熟悉Pytork和张量数据。我有一个关于转换张量形状的问题

我有两个问题

首先,如果我有一个具有
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=输入#火炬大小([8,512,16,16])
x=层(x)#火炬尺寸([8,256,32,32]
x=x+input#我想做的是在将层传递到一起之前和之后添加张量值(如跳过连接)
我希望添加两个张量的输出会成功,但实际输出是关于维度大小不等的错误

  • 对于第一种情况,请使用
    resize_389;()
    将第二个维度从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])
    
    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]
    
    或者,您也可以使用
    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]
    
    您可以从中阅读有关在pytorch中使用填充重塑张量的更多信息

  • 对于第二种情况,您只需使用
    resize\uz()
    将张量大小调整为原来的一半

    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])
    
    或者,您可以使用
    复制
    ,如下所示:

    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])
    
    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]
    
    不使用
    复制()


我使用了resize_u2;()并得到了
RuntimeError:无法调整需要grad的变量的大小
然后我改用resize(),但仍然得到了另一个错误
RuntimeError:shape“[8,256,16,16]”对于大小为1048576的输入无效
然后尝试第三种方法,使用padding和copy_2;对不起,我还没有考虑你想调整变量的情况,有必要的GRADAD=真的。我的坏。我增加了其他的调整大小的方法。请试试。我试过了CopyTo()。第一种情况似乎有效。我将尝试第二种情况并更新结果。谢谢。Conv2d可能是改变第二张量维度的另一种方法