gpt4 book ai didi

python - 内核大小不能大于实际输入大小

转载 作者:行者123 更新时间:2023-12-05 06:16:49 24 4
gpt4 key购买 nike

我有一个深度为 3 的数据,我想将它传递给 3 个卷积层,每个卷积层有 3x3x3 个内核。我当前的代码如下。第一个输入是[batch_size=10, in_channels=1, depth=3, height=128, width=256]我注意到在第一个 conv3d 层之后输出是 [10,8,1,126,254]。显然它现在有深度 1 并且不接受另一个 3x3x3 层。我怎样才能做到这一点?

class CNet(nn.Module):
def __init__(self, **kwargs):
super().__init__()
self.conv1 = nn.Conv3d(1, 8, kernel_size=3, stride=1, padding=0)
self.conv2 = nn.Conv3d(8, 16, kernel_size=3, stride=1, padding=0)
self.conv3 = nn.Conv3d(16, 32, kernel_size=3, stride=1, padding=0)
self.fc1 = nn.Linear(value, 2)

def forward(self, X):
X = F.relu(self.conv1(X))
X = F.relu(self.conv2(X))
X = F.max_pool2d(X,2)
X = self.conv3(X)
X = F.max_pool2d(X,2)
X = self.fc1(X)
return F.softmax(X,dim =1)

最佳答案

您需要使用填充。如果您只想在第一个卷积之后填充卷积的输入,并且仅在深度维度上获得最小维度 3,您可以使用 padding=(1, 0, 0)(它是1 因为对两侧应用了相同的填充,即 (padding, input, padding) 沿该维度)。

self.conv2 = nn.Conv3d(8, 16, kernel_size=3, stride=1, padding=(1, 0, 0))
self.conv3 = nn.Conv3d(16, 32, kernel_size=3, stride=1, padding=(1, 0, 0))

但是,通常在使用 kernel_size=3 时对所有维度使用 padding=1,因为这样可以保持维度不变,从而更容易构建更深的网络,因为你不需要担心尺寸突然变得太小,因为它已经发生在你的深度维度上。此外,当不使用填充时,角点仅包含在一次计算中,而所有其他元素都有助于多次计算。建议对所有卷积使用 kernel_size=3padding=1

self.conv1 = nn.Conv3d(1, 8, kernel_size=3, stride=1, padding=1)
self.conv2 = nn.Conv3d(8, 16, kernel_size=3, stride=1, padding=1)
self.conv3 = nn.Conv3d(16, 32, kernel_size=3, stride=1, padding=1)

关于python - 内核大小不能大于实际输入大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61945404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com