【问题标题】:Tensorflow binary classification training loss won't decrease, accuracy stuck at around 50%TensorFlow 二进制分类训练损失不会减少,准确率停留在 50% 左右
【发布时间】:2021-04-25 05:34:44
【问题描述】:

我对此很陌生,可以就从这里去哪里提出一些建议。

我正在使用带有 keras 的 tensorflow 2.3.0 来构建二进制分类模型。我无法共享数据集,因为它是我公司拥有的专有数据,但这些特征都是数字财务数据,代表客户的一种直方图。

我尝试了两种模型,一种具有 300 项功能,一种具有 600 项功能,一种具有 600 项的功能只是代表了更长的历史。首先对特征进行归一化,标签全部为0或1,表示该账号是否应该被标记。

我有 500,000 个训练样本和 60,000 个测试样本。 0/1 标签分割大约是一半。

这是我目前的代码:

import pandas as pd
import numpy as np

# Make numpy values easier to read.
np.set_printoptions(precision=3, suppress=True)

import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras import utils

features = pd.read_csv('train.csv')
labels = np.array(features.pop('target'))
features = np.array(features)
num_features = features.shape[1]
features = utils.normalize(features)


model = tf.keras.Sequential([
    layers.Dense(512, activation='relu', input_shape=(num_features,)),
    layers.Dropout(0.5),
    layers.Dense(512, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(512, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(1, activation='sigmoid')
])

model.compile(loss = tf.losses.BinaryCrossentropy(), optimizer = tf.optimizers.Adam(learning_rate=0.001), metrics=['accuracy'])

model.fit(features, labels, epochs=100)

这可能是错误的拓扑,这只是我最近的尝试。我尝试了几种不同的拓扑——从具有少量单元的微型单层网络到您在此处看到的。我尝试了不同的学习率和时期,有或没有辍学。它们都给出了基本相同的模式:

Epoch 1/100
15625/15625 [==============================] - 46s 3ms/step - loss: 0.6932 - accuracy: 0.5113
Epoch 2/100
15625/15625 [==============================] - 46s 3ms/step - loss: 0.6929 - accuracy: 0.5127
Epoch 3/100
15625/15625 [==============================] - 46s 3ms/step - loss: 0.6929 - accuracy: 0.5135
Epoch 4/100
15625/15625 [==============================] - 47s 3ms/step - loss: 0.6928 - accuracy: 0.5142
Epoch 5/100
15625/15625 [==============================] - 48s 3ms/step - loss: 0.6928 - accuracy: 0.5138

这里的损失基本上是平坦的,准确度在这一点附近徘徊。如果我使用非常高的学习率,损失开始很高,但最终在同一点附近趋于平缓。

为了测试模型是否正常工作,我尝试了一个非常小的数据子集(只有 5 行左右),它以 100% 的准确率迅速将损失降低到接近零,这当然是很大的过拟合,但只是为了测试代码/数据。

我可以尝试哪些后续步骤来改进这一点?这看起来可能只是神经网络无法弄清楚如何关联的设计不佳的特征,还是这可能不是算法的正确选择?

编辑:

根据 cmets 和响应(谢谢!),我尝试了更多调整,并且正在取得一些进展。我调整了批量大小,调整了拓扑,并降低了学习率。我也不太了解验证数据如何融入图片,所以我现在一直在使用validation_split=0.2 进行培训课程 - 我的新问题是现在我的训练损失正在减少/准确度增加,但反之亦然验证损失/准确性。这是一些时代快照:

Epoch 1/1000
1563/1563 [==============================] - 25s 16ms/step - loss: 0.6926 - accuracy: 0.5150 - val_loss: 0.6927 - val_accuracy: 0.5134

Epoch 20/1000
1563/1563 [==============================] - 24s 15ms/step - loss: 0.6746 - accuracy: 0.5760 - val_loss: 0.7070 - val_accuracy: 0.5103

Epoch 50/1000
1563/1563 [==============================] - 24s 15ms/step - loss: 0.5684 - accuracy: 0.7015 - val_loss: 0.8222 - val_accuracy: 0.5043

我认为这是过度拟合?

【问题讨论】:

  • 尝试 1e-5 的标准 adam 学习率
  • 这是一个很大的辍学!我的建议是完全删除它,看看它的性能如何,然后逐渐添加你需要的东西。请记住,dropout 主要用于正则化,因此,如果您陷入随机猜测的性能,我会首先对所有内容进行去正则化

标签: tensorflow machine-learning keras


【解决方案1】:

我会将密集层单元更改为 512,128,64,1。删除除最后一层之外的所有 dropout 层。将最后一个的辍学率设置为 0.3。使用您的测试样本作为验证数据,以便您可以查看模型是否过拟合/欠拟合。还建议您尝试使用 keras 回调 ReduceLROnPlateau 进行可调整学习,并使用 keras 回调 EarlyStopping 提前停止。文档在 [此处][1] 设置每个回调以监控验证丢失。我建议的代码如下所示:

reduce_lr=tf.keras.callbacks.ReduceLROnPlateau(
          monitor="val_loss",factor=0.5, patience=2, verbose=1)
e_stop=tf.keras.callbacks.EarlyStopping( monitor="val_loss", patience=5, 
          verbose=0,  restore_best_weights=True)
callbacks=[reduce_lr, e_stop]

在 model.fit 中包含

callbacks=callbacks

【讨论】:

  • 我已将您的建议与一些 cmets 结合起来,我正在取得进展,但我确实认为我现在遇到了过度拟合的问题。查看我的编辑。
  • 是的,这是经典的过度拟合,您是否在模型中留下了 dropout 层?如果是这样,提高利率。如果这不能解决它添加一个额外的辍学层。如果这不起作用,请减少密集单元的数量。查看我修改后的答案
  • 我确实留下了 dropout,我将尝试更多地尝试它并调整单位以及回调。将结果报告回来,感谢您的建议。我认为您已将我引向正确的方向,因此我将其标记为答案。干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 2017-08-14
  • 2021-08-03
  • 1970-01-01
  • 2018-01-16
  • 2017-04-04
  • 2019-01-05
相关资源
最近更新 更多