繁体   English   中英

为什么我的损失趋于下降,而我的准确度却为零?

[英]Why is my loss trending down while my accuracy is going to zero?

我正在尝试使用 Tensorflow/Keras 练习我的机器学习技能,但是我在拟合模型方面遇到了麻烦。 让我解释一下我做了什么以及我在哪里。

我正在使用来自 Kaggle 的哥斯达黎加家庭贫困水平预测挑战的数据集

由于我只是想熟悉 Tensorflow 工作流程,因此我通过删除一些包含大量缺失数据的列来清理数据集,然后用它们的平均值填充其他列。 所以我的数据集中没有缺失值。

接下来,我使用 TF 的make_csv_dataset加载了新的、清理过的 csv。

batch_size = 32

train_dataset = tf.data.experimental.make_csv_dataset(
    'clean_train.csv',
    batch_size,
    column_names=column_names,
    label_name=label_name,
    num_epochs=1)

我设置了一个函数来返回我编译的模型,如下所示:

f1_macro = tfa.metrics.F1Score(num_classes=4, average='macro')

def get_compiled_model():
    model = tf.keras.Sequential([
      tf.keras.layers.Dense(512, activation=tf.nn.relu, input_shape=(137,)),  # input shape required
      tf.keras.layers.Dense(256, activation=tf.nn.relu),
      tf.keras.layers.Dense(4, activation=tf.nn.softmax)
    ])

    model.compile(optimizer='adam',
                loss='binary_crossentropy',
                metrics=[f1_macro, 'accuracy'])
    return model
model = get_compiled_model()
model.fit(train_dataset, epochs=15)

下面是结果

这是我的输出

我的笔记本的链接在这里

我应该提到,我的实现强烈基于 Tensorflow 的 iris 数据演练

谢谢!

一段时间后,我能够找到您的代码的问题,它们按重要性排序。 (第一个是最重要的)

  1. 您正在进行多类分类(不是二元分类)。 因此,您的损失应该是categorical_crossentropy

  2. 你不是onehot 编码你的标签。 使用binary_crossentropy并将标签作为数字 ID 绝对不是前进的方向。 相反,您应该对标签进行 onehot 编码,并像多类分类问题一样解决这个问题。 这是你如何做到的。

def pack_features_vector(features, labels):
    """Pack the features into a single array."""
    features = tf.stack(list(features.values()), axis=1)
    return features, tf.one_hot(tf.cast(labels-1, tf.int32), depth=4)
  1. 规范化您的数据。 如果你看看你的训练数据。 它们没有标准化。 他们的价值观无处不在。 因此,您应该考虑通过执行以下操作来规范您的数据。 这仅用于演示目的。 你应该阅读有关倍线器在scikit学习和选择最适合你。
x = train_df[feature_names].values #returns a numpy array
min_max_scaler = preprocessing.StandardScaler()
x_scaled = min_max_scaler.fit_transform(x)
train_df = pd.DataFrame(x_scaled)

这些问题应该让你的模型变得直截了当。

由于其他评论的确提供了一些绝对值得考虑的最佳实践建议,因此该评论集中在您的观察上,即您的损失和准确性是相互分离的-首先是反直观的。

查看metrics.py ,您可以在其中找到所有可用度量的定义,包括不同类型的准确性。

accuracy类型取决于目标函数,请参阅training.py binary_accuracy的默认选择如下:

 if output_shape[-1] == 1 or self.loss_functions[i] == objectives.binary_crossentropy:
     # case: binary accuracy
     acc_fn = metrics_module.binary_accuracy

在指标中, binary_accuracy定义如下:

def binary_accuracy(y_true, y_pred):
    '''Calculates the mean accuracy rate across all predictions for binary
    classification problems.
    '''
    return K.mean(K.equal(y_true, K.round(y_pred)))

在目标函数中是这样的:

def binary_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0):
    y_pred = K.constant(y_pred) if not K.is_tensor(y_pred) else y_pred
    y_true = K.cast(y_true, y_pred.dtype)
    if label_smoothing is not 0:
        smoothing = K.cast_to_floatx(label_smoothing)
        y_true = K.switch(K.greater(smoothing, 0),
                          lambda: y_true * (1.0 - smoothing) + 0.5 * smoothing,
                          lambda: y_true)
        return K.mean(K.binary_crossentropy(y_true, y_pred, from_logits=from_logits), axis=-1)

所以总结一下:

  1. 实施中的细微差异可能会引起问题。
  2. 正如您提到的,您有4个类,binary_crossentropy还没有准备好解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM