Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 两个等效网络中的形状失配?_Python_Pytorch - Fatal编程技术网

Python 两个等效网络中的形状失配?

Python 两个等效网络中的形状失配?,python,pytorch,Python,Pytorch,因此,答案可能是“这两个网络不相等”,我显然遗漏了一些东西,但在我的理解中,它们应该做同样的事情,但中间输出的维度不一样。我的主要问题是pytorchConvTranspose3d和Conv3d。特别是,我有一个输入,它的形状(1,44,68120),其中44是深度尺寸,68和120是宽度和高度。我使用跨步转换/转换在维度上向下/向上移动。这不应该: self.conv3d1_1 = nn.Conv3d(in_channels=1, out_channels=32, groups=1, stri

因此,答案可能是“这两个网络不相等”,我显然遗漏了一些东西,但在我的理解中,它们应该做同样的事情,但中间输出的维度不一样。我的主要问题是pytorch
ConvTranspose3d
Conv3d
。特别是,我有一个输入,它的形状
(1,44,68120)
,其中44是深度尺寸,68和120是宽度和高度。我使用跨步转换/转换在维度上向下/向上移动。这不应该:

self.conv3d1_1 = nn.Conv3d(in_channels=1, out_channels=32, groups=1, stride=(2,2,2), kernel_size=3, padding=1)
在输出维度方面是否与这两个层等效

self.conv3d1_1 = nn.Conv3d(in_channels=1, out_channels=32, groups=1, stride=(2,1,1), kernel_size=3, padding=1)
self.conv3d1_2 = nn.Conv3d(in_channels=32, out_channels=32, groups=1, stride=(1,2,2), kernel_size=3, padding=1)
其中第一层同时将所有维度减半,而第二层首先减少时间维度,然后减少空间维度

因此,第一个网络:

    self.conv3d1_1 = nn.Conv3d(in_channels=1, out_channels=32, groups=1, stride=(2,2,2), kernel_size=3, padding=1)  # depthwise convolution (1 ch, 44 depth dimension, h, w)
    self.conv3d1_2 = nn.Conv3d(in_channels=32, out_channels=64, groups=1, kernel_size=3, padding=1)

    self.conv3d2_1 = nn.Conv3d(in_channels=64, out_channels=128, groups=1, stride=(2, 2, 2), kernel_size=3, padding=1)
    self.conv3d2_2 = nn.Conv3d(in_channels=128, out_channels=128, groups=1, kernel_size=3, padding=1)

    self.conv3d3_1 = nn.ConvTranspose3d(in_channels=128, out_channels=128, stride=(2, 2, 2), groups=1, kernel_size=4, padding=(1,1,1))
    self.conv3d3_2 = nn.Conv3d(in_channels=128, out_channels=128, groups=1, kernel_size=3, padding=1)

    self.conv3d4_1 = nn.ConvTranspose3d(in_channels=128, out_channels=128, stride=(2, 2, 2), groups=1, kernel_size=4, padding=1)
    self.conv3d4_2 = nn.Conv3d(in_channels=128, out_channels=64, groups=1, kernel_size=3, padding=1)
生成以下中间尺寸:

torch.Size([2, 1, 44, 68, 120])
torch.Size([2, 32, 22, 34, 60])
torch.Size([2, 64, 22, 34, 60])
torch.Size([2, 128, 11, 17, 30])
torch.Size([2, 128, 11, 17, 30])
torch.Size([2, 128, 22, 34, 60])
torch.Size([2, 128, 22, 34, 60])
torch.Size([2, 128, 44, 68, 120])
torch.Size([2, 64, 44, 68, 120])
torch.Size([2, 1, 44, 68, 120])
torch.Size([2, 32, 22, 68, 120])
torch.Size([2, 64, 22, 68, 120])
torch.Size([2, 128, 22, 34, 60])
torch.Size([2, 128, 22, 34, 60])
torch.Size([2, 128, 23, 68, 120])
torch.Size([2, 128, 23, 68, 120])
torch.Size([2, 128, 46, 69, 121])
torch.Size([2, 64, 46, 69, 121])
一切看起来都很好

第二个网络(仅减少1个维度以保持其简短,但当下降2次(所以是4倍)时会发生相同和最坏的情况)

这些是中间尺寸:

torch.Size([2, 1, 44, 68, 120])
torch.Size([2, 32, 22, 34, 60])
torch.Size([2, 64, 22, 34, 60])
torch.Size([2, 128, 11, 17, 30])
torch.Size([2, 128, 11, 17, 30])
torch.Size([2, 128, 22, 34, 60])
torch.Size([2, 128, 22, 34, 60])
torch.Size([2, 128, 44, 68, 120])
torch.Size([2, 64, 44, 68, 120])
torch.Size([2, 1, 44, 68, 120])
torch.Size([2, 32, 22, 68, 120])
torch.Size([2, 64, 22, 68, 120])
torch.Size([2, 128, 22, 34, 60])
torch.Size([2, 128, 22, 34, 60])
torch.Size([2, 128, 23, 68, 120])
torch.Size([2, 128, 23, 68, 120])
torch.Size([2, 128, 46, 69, 121])
torch.Size([2, 64, 46, 69, 121])
出于某种原因,第一个
ConvTranspose3d
增加了时间维度,而它应该只处理空间维度?我最初认为这是一个填充问题,但改变填充并不能解决问题。时间
ConvTranspose3d
也会发生同样的情况,它将空间维度增加1


有什么线索吗?提前感谢。

在浏览代码之后,将第二个conv3d中的“padding”kwarg设置为大于0会让我产生怀疑。毕竟,你需要做两次pad——第一次是一次,第二次是一次。因此,您将两次更改维度…您可以尝试输出吗?padding=1,padding=1请告诉我