这是一个简单的二元分类任务。特征是一个值在[-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]
这样的结果,这对于判断你的输入图像属于哪个类别没有任何意义。