【问题标题】:Why is my loss trending down while my accuracy is going to zero?为什么我的准确率趋于零,而我的损失却呈下降趋势?
【发布时间】:2020-03-22 15:17:12
【问题描述】:

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

我正在使用来自 Kaggle 的 Costa Rican Household Poverty Level Prediction Challenge 的数据集

由于我只是想熟悉 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)

下面是那个结果

我的笔记本的链接是Here

我应该提一下,我的实现非常基于 Tensorflow 的虹膜数据walkthrough

谢谢!

【问题讨论】:

  • 我尝试将binary_crossentropy 更改为categorical_crossentropy ,它提供了更真实的准确度,但损失数字很大。

标签: python tensorflow machine-learning structured-data


【解决方案1】:

一段时间后,我能够找到您的代码存在的问题,它们按重要性顺序排列。 (首先是最重要的)

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

  2. 您不是对标签进行单一编码。使用 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 learn 中的 Scalers 并选择最适合您的内容。
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)

这些问题应该让你的模型变得正确。

【讨论】:

  • 感谢您的回答! 1-2简单易行。唯一的问题是pack_features_vector 标签输出给我带来了一些问题,因为它只能预测类 [0,1,2,3] 而不是 [1,2,3,4] 但这没什么大不了的。不过,我确实有一个问题是,你会标准化整个数据集还是只标准化具有大范围的列,比如 1-100,000?
猜你喜欢
  • 2023-02-23
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
相关资源
最近更新 更多