例如输入形状=[1,64,12,60,33]
当我使用时
nn.Conv3d(in_channels=128, out_channels=64, kernel_size=(3, 3, 3), stride=2, padding=1)
输出形状=[1,64,30,17]
之后,我想让输出返回[1,64,12,60,33]
但是当我使用时
nn.ConvTranspose3d(in_channels=128, out_channels=64, kernel_size=(3, 3, 3), stride=2, padding=1,output_padding=1)
结果变成了[1,64,12,60,34],这不是我想要的。
我该如何解决这个问题?我的意思是,我希望下一个网络与输入的形状无关(当然我不使用密集层,只使用conv和decov(
例如:
input = torch.randn((1,64,12,60,33))
C3d=torch.nn.Conv3d(64,64,kernel_size=(3,3,3),stride=2 ,padding=1)
output_conv = C3d(input)#shape==[1,64,6,30,17]
de_C3d = torch.nn.ConvTranspose3d(64,64,(3,3,3),stride=2,padding=1)
output_deconv=de_C3d(out_conv) #shape = [1,64,11,59,33]
我只想要output_decov.shape等于输入
如果您要处理任意形状的张量,这可能很困难。如果它们被修复了,你可以添加临时修复程序来解决你的问题。一种方法是利用这样一个事实,即您可以将元组传递给参数padding
和output_padding
,这将在您的情况下起作用:
input = torch.randn((1,64,12,60,33))
C3d=torch.nn.Conv3d(64,64,kernel_size=(3,3,3),stride=2 ,padding=1)
output_conv = C3d(input) #shape==[1,64,6,30,17]
de_C3d = torch.nn.ConvTranspose3d(64,64,(3,3,3),stride=2,padding=1,output_padding=(1,1,0))
output_de=de_C3d(out_conv) #shape = [1,64,12,60,33]
你也可以垫上然后裁剪,这在UNet架构中很常见:
de_C3d = torch.nn.ConvTranspose3d(64,64,(3,3,3),stride=2,padding=0)
output_deconv=de_C3d(out_conv) #shape = [1,64,13,61,35]
output_deconv = output_deconv[:,:,:input.shape[2],:input.shape[3],:input.shape[4]]
我想解决这个问题的一种方法是根据输入是奇数还是偶数来添加不同的填充:
de_C3d = torch.nn.ConvTranspose3d(64,64,(3,3,3),stride=2,padding=1,
output_padding=tuple([(i+1)%2 for i in input.shape[2:]]))
output_deconv=de_C3d(out_conv) #shape = [1,64,12,60,33]