使用keras在二进制分类中更改损失值和冻结精度值

Changing loss value and a frozen accuracy value in binary classification using keras

二元分类的简单示例任务。特征是二维数组,其值在 [-1,1] 中。 (数据集来自make_circles来自sklearn.datasets)

我的模型:

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()]) ```

输出是在所有 epoch 期间二进制精度都冻结在 0.5067 时,损失在减少。

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

尝试用最后一层的 sigmoid 激活函数替换 softmax 激活函数:

model.add(tf.keras.layers.Dense(units=1, activation='sigmoid'))

Softmax 用于 multiclass classification

编辑:预计,对 (batch_size, 1) 维数据的 softmax 激活给出仅 1 的张量:

tf.keras.activations.softmax(tf.constant([[-55.], [.1], [102.]))

>> <tf.Tensor: shape=(3, 1), dtype=float32, numpy=
>> array([[1.],
>>        [1.],
>>        [1.]], dtype=float32)>

但是,我不确定你的损失是如何稳步减少的。

这是我们大多数人在开始学习二元分类时遇到的一个非常基本的错误。你的准确性是 frozen 的原因是在最后一层只有一个单元。因为它是一个二进制 classification 任务,所以最后一层应该有 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)。它实际上意味着您给定的输入属于 class 1 的概率为 0.63 并且属于 class 0 的概率为 0f 0.37

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