使用Keras进行二元分类时损失值变化但准确率值冻结

这是一个简单的二元分类任务。特征是一个值在[-1,1]范围内的二维数组。(数据集来自sklearn.datasets中的make_circles)

我的模型如下:

model = tf.keras.Sequential()model.add(tf.keras.layers.Dense(6,                                 activation= tf.keras.activations.sigmoid,                                 input_shape=(2,),                                kernel_regularizer='l2'))model.add(tf.keras.layers.Dense(6,                                 activation= tf.keras.activations.sigmoid,                                 kernel_regularizer='l2'))model.add(tf.keras.layers.Dense(1,                                 activation= tf.keras.activations.softmax))model.compile (optimizer=tf.keras.optimizers.RMSprop() ,                loss=tf.keras.losses.BinaryCrossentropy(),                metrics=[tf.keras.metrics.BinaryAccuracy()]) ```

输出显示损失值在降低,而二元准确率在所有轮次中都冻结在0.5067。

Epoch 1/1045/45 [==============================] - 1s 8ms/step - loss: 0.7802 - binary_accuracy: 0.5067 - val_loss: 0.7563 - val_binary_accuracy: 0.4400Epoch 2/1045/45 [==============================] - 0s 4ms/step - loss: 0.7605 - binary_accuracy: 0.5067 - val_loss: 0.7486 - val_binary_accuracy: 0.4400Epoch 3/1045/45 [==============================] - 0s 3ms/step - loss: 0.7487 - binary_accuracy: 0.5067 - val_loss: 0.7425 - val_binary_accuracy: 0.4400Epoch 4/1045/45 [==============================] - 0s 3ms/step - loss: 0.7396 - binary_accuracy: 0.5067 - val_loss: 0.7368 - val_binary_accuracy: 0.4400Epoch 5/1045/45 [==============================] - 0s 4ms/step - loss: 0.7320 - binary_accuracy: 0.5067 - val_loss: 0.7306 - val_binary_accuracy: 0.4400Epoch 6/1045/45 [==============================] - 0s 4ms/step - loss: 0.7254 - binary_accuracy: 0.5067 - val_loss: 0.7269 - val_binary_accuracy: 0.4400Epoch 7/1045/45 [==============================] - 0s 3ms/step - loss: 0.7203 - binary_accuracy: 0.5067 - val_loss: 0.7211 - val_binary_accuracy: 0.4400Epoch 8/1045/45 [==============================] - 0s 2ms/step - loss: 0.7157 - binary_accuracy: 0.5067 - val_loss: 0.7158 - val_binary_accuracy: 0.4400Epoch 9/1045/45 [==============================] - 0s 2ms/step - loss: 0.7118 - binary_accuracy: 0.5067 - val_loss: 0.7116 - val_binary_accuracy: 0.4400Epoch 10/1045/45 [==============================] - 0s 2ms/step - loss: 0.7082 - binary_accuracy: 0.5067 - val_loss: 0.7099 - val_binary_accuracy: 0.4400

回答:

这是一个我们在开始学习二元分类时经常遇到的基本错误。你的准确率冻结的原因是最后一层只有一个单元。由于这是一个二元分类任务,最后一层应该有2个单元。你的代码应该像这样:

model = tf.keras.Sequential()model.add(tf.keras.layers.Dense(6,                                 activation= tf.keras.activations.sigmoid,                                 input_shape=(2,),                                kernel_regularizer='l2'))model.add(tf.keras.layers.Dense(6,                                 activation= tf.keras.activations.sigmoid,                                 kernel_regularizer='l2'))model.add(tf.keras.layers.Dense(2,                                 activation= tf.keras.activations.softmax))model.compile (optimizer=tf.keras.optimizers.RMSprop() ,                loss=tf.keras.losses.BinaryCrossentropy(),                metrics=[tf.keras.metrics.BinaryAccuracy()]) 

现在,当你将输入数据传递给模型时,输出将是一个长度为2的数组(张量),例如[0.37, 0.63]。如果你仔细观察,会发现这个数组的两个条目之和为1.0(0.37+0.63)。这实际上意味着你的给定输入属于类别1的概率为0.63,属于类别0的概率为0.37

而在你的情况下(最后一层只有一个单元),输出结果只会是像[0.78][0.21]这样的结果,这对于判断你的输入图像属于哪个类别没有任何意义。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注