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

标签 python deep-learning pytorch conv-neural-network

我有一个深度为 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/

相关文章:

python - 如何检查输入是否为小数?

python - 为从 dict 创建的 pandas 数据框设置名称

machine-learning - keras中像素二元分类的最佳损失函数

python - 使用 Pytorch 安装 Open3d-Ml(在 MacO 上)

python - 迭代一段时间后,前向传递速度变慢 10000 倍

python - 禁用的 qtablewidgetitem 不会显示为灰色

python - 通过 SQLAlchemy 查询时如何从 Python 过滤名称列表

python - 如何提高lstm训练的准确性

python - 如何将 MongoDB 与 Keras 的 Sequence 类或生成器一起使用?

pytorch - Torchvision 标准化 - 它如何在手段/SDS 元组上运行?