Как изменить тензор PyTorch на половину и / или двойной размер с другим размером? - PullRequest
0 голосов
/ 24 июня 2019

Я новичок в 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]), но я не знаю, как изменить 2-е измерение, которое равно 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 голосов
/ 24 июня 2019
  • В первом случае используйте 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]
    

    Подробнее о преобразовании тензора с отступом в 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]
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...