【问题标题】:Changing loss value and a frozen accuracy value in binary classification using keras使用 keras 更改二进制分类中的损失值和冻结精度值
【发布时间】:2021-10-12 22:47:14
【问题描述】:

二进制分类的简单示例任务。特征是二维数组,其值在 [-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/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

【问题讨论】:

    标签: python tensorflow machine-learning deep-learning tf.keras


    【解决方案1】:

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

    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)>
    

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

    【讨论】:

      【解决方案2】:

      这是我们大多数人在开始学习二进制分类时遇到的一个非常基本的错误。您的准确性冻结的原因是在最后一层中只有一个单位。由于这是一个二元分类任务,最后一层应该有 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] 这样的结果,这对于您的输入图像属于哪个类没有任何意义。

      【讨论】:

        猜你喜欢
        • 2017-04-04
        • 2018-11-05
        • 2017-04-04
        • 2023-02-04
        • 2018-04-09
        • 2020-09-08
        • 2017-05-30
        • 2019-11-10
        • 2021-01-31
        相关资源
        最近更新 更多