【问题标题】:ResNet family classification layer activation functionResNet 家族分类层激活函数
【发布时间】:2021-05-19 04:56:13
【问题描述】:

我正在使用 ResNet18 预训练模型,该模型将用于简单的二值图像分类任务。但是,包括 PyTorch 本身在内的所有教程都使用 nn.Linear(num_of_features, classes) 作为最终的全连接层。我不明白的是该模块的激活功能在哪里?另外,如果我想使用 sigmoid/softmax 怎么办?

提前感谢您的帮助,我是 Pytorch 的新手

【问题讨论】:

    标签: python pytorch resnet


    【解决方案1】:

    不,如果您的损失函数是 CrossEntropyLoss,则不要在最后一层使用激活函数,因为 pytorch CrossEntropyLoss 损失将 nn.LogSoftmax()nn.NLLLoss() 组合在一个类中。

    他们这样做吗?

    您实际上需要 logits(sigmoid 的输出)来计算损失,因此不将其作为前向传递的一部分是正确的设计。更多的预测你不需要 logits 因为argmax(linear(x)) == argmax(softmax(linear(x))softmax 不会改变顺序,只会改变幅度(压缩函数将任意值转换为 [0,1] 范围,但保留部分排序]

    如果您想使用激活函数来添加某种非线性,您通常可以通过使用多层 NN 并在最后一层和其他层中使用激活函数来实现。

    最后,如果您使用其他损失函数,例如NLLLossPoissonNLLLossBCELoss,那么您必须自己计算 sigmoid。同样,如果您使用 BCEWithLogitsLoss,则无需再次计算 sigmoid,因为此损失将 Sigmoid 层和 BCELoss 组合在一个类中。

    查看 pytorch 文档以了解如何使用损失。

    【讨论】:

      【解决方案2】:

      通常,最后一层不使用 ReLU 激活函数。 torch.nn.Linear 层的输出被馈送到交叉熵损失的 softmax 函数,例如,通过使用 torch.nn.CrossEntropyLoss。您可能正在寻找的是二元交叉熵损失torch.nn.BCELoss

      【讨论】:

        【解决方案3】:

        在您在互联网上看到的教程中,人们大多进行多类分类,他们使用cross-entropy loss,这不需要用户定义的输出激活函数。它应用了 softmax 激活本身(实际上在交叉熵之前应用激活函数是 PyTorch 中最常见的错误之一)。但是,在您的情况下,您有一个二进制分类问题,您需要使用binary cross-entropy loss,它本身不应用任何激活函数,不像另一个。因此,您需要自己应用 sigmoid 激活(或将实数映射到 (0, 1) 范围的任何类型的激活。

        【讨论】:

          猜你喜欢
          • 2021-03-19
          • 1970-01-01
          • 2022-01-01
          • 2018-08-14
          • 2018-09-29
          • 2013-01-08
          • 1970-01-01
          • 1970-01-01
          • 2016-06-03
          相关资源
          最近更新 更多