【问题标题】:1x1 convolution as classification layer in Pytorch1x1 卷积作为 Pytorch 中的分类层
【发布时间】:2020-02-09 08:14:16
【问题描述】:

我正在尝试使用神经网络将图像块分为 10 个不同的类别。我的想法(借用自this 文章是使用预训练 VGG 网络的前 5 层并将 1x1 卷积应用于此编码器。因此,给定 VGG 网络的前 5 层:

Sequential(
    (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU(inplace=True)
    (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (3): ReLU(inplace=True)
    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (6): ReLU(inplace=True)
    (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (8): ReLU(inplace=True)
    (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (11): ReLU(inplace=True)
    (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (13): ReLU(inplace=True)
    (14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (15): ReLU(inplace=True)
    (16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (18): ReLU(inplace=True)
    (19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (20): ReLU(inplace=True)
    (21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (22): ReLU(inplace=True)
    (23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (25): ReLU(inplace=True)
    (26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (27): ReLU(inplace=True)
    (28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (29): ReLU(inplace=True)
    (30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)

如何添加一个层来将每个激活分类为 n_classes?我正在尝试从 512(最后一层中的过滤器数量)到 n_classes 的 1x1 卷积,如下所示:

nn.Sequential(
    nn.Conv2d(in_channels=512, out_channels=n_classes, kernel_size=1),
    nn.Softmax(dim=1)
    )

这个网络给出 (batch_size, n_classes H // 32, W // 32) 输出。但是,对于给定的图像,每个类的所有输出都是相等的,我的意思是,对于给定的批次,B 和 C 类,所有值都是相同的。

我尝试过使用 CrossEntropyLoss 进行培训,甚至转换为 logits 并应用 BCELoss,但没有成功。我还在我的火车循环中尝试了其他网络,但没有发生这种情况。

有什么线索吗?

谢谢

【问题讨论】:

    标签: pytorch vgg-net


    【解决方案1】:

    终于解决了管理自己。这是最后一层权重的初始化

    最好的

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 1970-01-01
      • 2021-11-09
      • 2019-01-16
      • 2019-06-26
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      相关资源
      最近更新 更多