Python 尽管该模型非常成功,但稀疏分类交叉熵损失的比例似乎非常高

Python 尽管该模型非常成功,但稀疏分类交叉熵损失的比例似乎非常高,python,tensorflow,machine-learning,keras,Python,Tensorflow,Machine Learning,Keras,我正在使用Tensorflow培训一些CNN的专有数据网络。我们有大量的数据,而且这些模型似乎能够学习大量关于数据分类的信息(到目前为止都是二进制分类) 有时,列车/测试精度曲线可能非常好,在某些情况下可达95%以上。然而,损失函数在规模上是可疑的。从视觉上看,它们看起来很好,我希望它能表现得很好,但这不是正确的数量级 有谁能告诉我,在TF/KERA中,这种缩放通常是如何适当地进行的?我对这些模型很有信心,因为它们已经在其他数据集上进行了测试,并得到了很好的推广,但扭曲的损失函数并不好报告 学习

我正在使用Tensorflow培训一些CNN的专有数据网络。我们有大量的数据,而且这些模型似乎能够学习大量关于数据分类的信息(到目前为止都是二进制分类)

有时,列车/测试精度曲线可能非常好,在某些情况下可达95%以上。然而,损失函数在规模上是可疑的。从视觉上看,它们看起来很好,我希望它能表现得很好,但这不是正确的数量级

有谁能告诉我,在TF/KERA中,这种缩放通常是如何适当地进行的?我对这些模型很有信心,因为它们已经在其他数据集上进行了测试,并得到了很好的推广,但扭曲的损失函数并不好报告

学习率约为0.0001
L1
L2
使用相同的lambda值,在为模型提供介于0.01和0.03之间的值时,我最成功地使用了该值。我现在没有退学

我包括了一个特别高精度跑步的照片。情况并非总是如此,但有时确实会发生。我怀疑这个问题部分是由于异常数据,或者可能是正则化值

下面是相关的代码片段

        model = tf.keras.models.Sequential()

        if logistic_regression is not True:
            for i in range(depth):
                # 1
                model.add(Conv2D(
                    15,
                    kernel_size=(10, 3),
                    strides=1,
                    padding='same',
                    activation='relu',
                    data_format='channels_last',
                    kernel_regularizer=tf.keras.regularizers.l1_l2(
                        l1=regularizer_param,
                        l2=regularizer_param)
                    ))

                model.add(MaxPooling2D(
                    pool_size=(3, 3),
                    strides=1,
                    padding='valid',
                    data_format='channels_last'))

            model.add(BatchNormalization())

            if dropout is not None:
                model.add(Dropout(dropout))

        # flatten
        model.add(Flatten(data_format='channels_last'))

        model.add(Dense(
            len(self.groups),
            # use_bias=True if initial_bias is not None else False,
            # bias_initializer=initial_bias
            # if initial_bias is not None
            # else None,
            kernel_regularizer=tf.keras.regularizers.l1_l2(
                l1=regularizer_param,
                l2=regularizer_param)
            ))

您不应该担心损失函数值的规模。请记住,损失函数只是衡量网络的距离。但是,您可以随时按自己喜欢的方式进行缩放。重要的是各个时代的损失趋势?您希望它是一个平滑的减少,这是您的第二个图所示

损失只是:对于同一网络,对于同一数据集,一个仅在相对意义上有意义的任意数字。它没有其他意义。事实上,损失也与指标不符:见Huang等人,2019年

由于它们已经在其他数据集上进行了测试,并且得到了很好的推广

这才是重要的

但是扭曲的损失函数并不好报道

你可以将这些损失扩大1000倍。它们只有在相对意义上才有意义

参考文献:


交叉熵损失的值取决于类的数量,您有多少类?此外,高值可能表明模型的机密性存在问题。@Dr.Snoopy这些是二进制分类,即2个输出节点{0,1}二进制分类(复数)是什么意思?@Dr.Snoopy啊抱歉,我的措辞选择不当。该模型训练二元分类。我只使用复数,因为我在许多不同的数据集上使用了这个模型,形成了许多二进制分类器。例如,你递给模型患者#1,问“在这两种情况中,预测哪一个患者#1有”无数不同的情况。这个损失值看起来与二进制分类问题不兼容或不可能。损失不是任意数字,它们提供了有用的信息,所以这个答案完全误导了这个问题。谢谢分享这篇文章@史努比博士,他们没有。它们只在相对意义上有用——使用相同的数据和相同的模型。损失值20.86对您意味着什么?绝对没有。同时,F-1为0.9是相当不错的,你知道最高值是1.0。这取决于损失和指标,有些损失是可以由人来解释的。没有你暗示的一般模式。你考虑的是一个非常狭窄的损失空间。更一般地,考虑吉洪诺夫正则化项的损失(L1和L2是特殊情况)。然后,一般来说,你会有一个相当大的损失。
        model.compile(
            optimizer=tf.keras.optimizers.Adagrad(
                learning_rate=learning_rate,
                initial_accumulator_value=0.1,
                epsilon=1e-07,
                name='Adagrad'),
            loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
            metrics=['accuracy'])