В первом случае используйте 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]