我的自定义损失函数是不是正确? (火炬)

Posted

技术标签:

【中文标题】我的自定义损失函数是不是正确? (火炬)【英文标题】:Is my custom loss function correct? (Pytorch)我的自定义损失函数是否正确? (火炬) 【发布时间】:2019-05-22 18:44:55 【问题描述】:

我想使用 CNN + 分类器进行单词识别,其中输入是图像,输出是 10x37 矩阵。 10 是一个单词中的最大字符数,37 是我的示例中的字母数。

我为此模型编写了一个自定义损失函数,但我不确定它是否正确,因为我无法达到 80% 以上的测试准确度。

我正在使用 Pytorch

class CustomLoss(nn.Module):
    def __init__(self):
        super().__init__()
        self.nllloss = nn.NLLLoss()

    def forward(self, output, labels):
        loss = 0
        for i in range(labels.shape[1]):
            loss += self.nllloss(output[:, i, :], labels[:, i])
        loss /= labels.shape[1]
        return loss

信息:

output.shape = (batch_size, 10, 37)

labels.shape = (batch_size, 10)

损失函数是否正确? 而我的分类问题叫什么(Multiple Multi class classification)?

【问题讨论】:

我试图找出模型中的错误。我想,也许错误出在我的损失函数中。问题是我的模型无法达到 80% 的测试准确率(我需要它至少达到 90%)。 【参考方案1】:

损失函数是正确的。

问题出在包含我的训练数据的文件中。它没有正确创建。事实上,我翻转了图像中的尺寸(宽度和高度),因此我的训练集的结果对于我的 CNN 来说是无法辨认的。

现在我已经解决了这个问题,我已经达到了 99.8% 的测试准确率。

【讨论】:

以上是关于我的自定义损失函数是不是正确? (火炬)的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:未知损失函数:使用我的自定义损失函数加载模型时的focal_loss_fixed

Keras 中具有样本权重的自定义损失函数

用于三元组损失训练的自定义精度函数

涉及卷积的张量流中的自定义损失函数

图像分割 - Keras 中的自定义损失函数

Keras 中的自定义损失函数以惩罚假阴性