首页 > 解决方案 > 尽管模型非常成功,但稀疏分类交叉熵损失的规模似乎确实很高

问题描述

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

有时,训练/测试准确度曲线可能非常好,在某些情况下高达 95%。然而,损失函数在规模方面是可疑的。从视觉上看,它们看起来不错,以及我对表现良好的期望如何,但这不是正确的数量级。

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

学习率大约为 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)
            ))
        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'])

标签: pythontensorflowmachine-learningkeras

解决方案


您不必担心损失函数值的规模。请记住,损失函数只是衡量网络距离的一个指标。但是,您始终可以按自己喜欢的方式扩展它。不同时期的损失趋势有什么关系?你希望它是一个平稳的下降,这就是你的第二个数字所显示的。

损失就是这样:对于同一网络,对于同一数据集,仅在相对意义上才有意义的任意数字。它没有其他意义。事实上,损失与指标也不能很好地对应:参见 Huang et al., 2019。

因为它们已经在其他数据集上进行了测试并且泛化得非常好,

这才是最重要的。

但是螺旋损失函数不是很好报告。

您可以将这些损失扩大 1,000。它们仅在相对意义上有意义。

参考:


推荐阅读