【问题标题】:Neural Network accuracy is always 0 while training classification problem in Keras [closed]在 Keras 中训练分类问题时,神经网络的准确度始终为 0 [关闭]
【发布时间】:2021-01-14 16:20:36
【问题描述】:

我正在为泰坦尼克号分类问题制作神经网络,但我的训练准确度始终为 0。我检查了其他解决方案,但找不到有效的解决方案。损失减少,但准确率为 0。

model= keras.Sequential(
    [
     layers.Dense(10,activation="relu",input_shape=(8,)),
     layers.Dense(10,activation="relu"),
     layers.Dense(1,activation="sigmoid")
    ]
)

model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['Accuracy'])
model.fit(X_train,y_train,batch_size=64,epochs=200,verbose=2)

输入没有任何空值。

Survived     0
Age          0
Fare         0
Total_mem    0
female       0
Q            0
S            0
2            0
3            0
dtype: int64

以下是一些显示 0 准确度的值。

Epoch 1/200
12/12 - 0s - loss: 0.7219 - accuracy: 0.0000e+00
Epoch 2/200
12/12 - 0s - loss: 0.7028 - accuracy: 0.0000e+00
Epoch 3/200
12/12 - 0s - loss: 0.6879 - accuracy: 0.0000e+00
Epoch 4/200
12/12 - 0s - loss: 0.6749 - accuracy: 0.0000e+00
Epoch 5/200
12/12 - 0s - loss: 0.6626 - accuracy: 0.0000e+00
Epoch 6/200
12/12 - 0s - loss: 0.6515 - accuracy: 0.0000e+00
Epoch 7/200
12/12 - 0s - loss: 0.6397 - accuracy: 0.0000e+00
Epoch 8/200
12/12 - 0s - loss: 0.6272 - accuracy: 0.0000e+00
Epoch 9/200
12/12 - 0s - loss: 0.6143 - accuracy: 0.0000e+00
Epoch 10/200
12/12 - 0s - loss: 0.6005 - accuracy: 0.0000e+00
Epoch 11/200
12/12 - 0s - loss: 0.5871 - accuracy: 0.0000e+00
Epoch 12/200
12/12 - 0s - loss: 0.5750 - accuracy: 0.0000e+00

【问题讨论】:

  • 它的 accuracy 不是 Accuracy
  • 我投票重新提出这个问题,因为这个问题指向了 TF 2.4 代码中的一个潜在问题/错误(即使它可以通过一个简单的错字来修复)。详情请查看我的答案及其 cmets。

标签: python tensorflow machine-learning keras neural-network


【解决方案1】:

首先,您错误地使用了metrics=['accuracy']。其次,这指向了一个更深层次的错误,我认为这是无意的。 I have raised an Issue 用于 tensorflow 回购。让我们希望有人回应。

Keras 无法识别指标 Accuracy。 Keras 无法正确调用此处所需的 MeanMetricWrapper。


解决问题

修复开始显示指标的正确值。

from tensorflow import keras
from tensorflow.keras import layers

X_train = np.random.random((100,8))
y_train = np.random.randint(0,2,(100,))

model = keras.Sequential(
    [
     layers.Dense(10,activation="relu",input_shape=(8,)),
     layers.Dense(10,activation="relu"),
     layers.Dense(1,activation="sigmoid")
    ]
)

model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
model.fit(X_train,y_train,batch_size=64,epochs=5,verbose=2)
Epoch 1/5
2/2 - 0s - loss: 0.6926 - accuracy: 0.5500
Epoch 2/5
2/2 - 0s - loss: 0.6915 - accuracy: 0.5500
Epoch 3/5
2/2 - 0s - loss: 0.6909 - accuracy: 0.5600
Epoch 4/5
2/2 - 0s - loss: 0.6900 - accuracy: 0.5700
Epoch 5/5
2/2 - 0s - loss: 0.6894 - accuracy: 0.5600
<tensorflow.python.keras.callbacks.History at 0x7f90e5f7d250>

了解和跟踪问题

@Mathias Müller 提出了一个有效的担忧,即如果 Keras 无法识别大写指标,那么它应该抛出错误而不是运行。

我跟踪了 GitHub 实现以了解当前代码的工作方式。以下是步骤。 (我已经链接了 GitHub 存储库中突出显示的代码行)

  1. 在编译期间,当传递一个指标时,该参数存储在一个MetricsContainer 对象中。
  2. 该容器类然后从compile_utils.py 调用一个名为_get_metric_object 的函数。此函数的工作是获取输入并返回该指标类的指标对象。
  3. 如果输入是否属于列表['accuracy', 'acc', 'crossentropy', 'ce'],此函数首先要做的事情之一是check
    • 如果是YES,那么它直接从metrics.py 和callsMeanMetricWrapper 类中获取类。 job of this class 是用 Mean 度量包装一个无状态度量函数。这会计算您添加的指标的平均值。
    • 如果是NO,那么它会从metrics.py 调用get functionget 函数进一步调用deserialize function,其工作是从utils.generic_utils.py 调用函数调用deserialize_keras_object 函数。该函数的工作是获取字符串并检索实际对象!

现在让我们看看这 2 个场景。

场景 1:“准确度”

#With lower case accuracy
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
print(model.metrics)
[<tensorflow.python.keras.metrics.Mean at 0x7f90c7ea10d0>,
 <tensorflow.python.keras.metrics.MeanMetricWrapper at 0x7f90c7d07e20>]

由于提供的指标属于['accuracy', 'acc', 'crossentropy', 'ce']_get_metric_object 函数获取tf.keras.metrics.Accuracy 类并将其显式传递给tf.keras.metrics.MeanMetricWrapper。这会按预期计算平均准确度。

场景 2:“准确度”

#With upper case Accuracy
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['Accuracy'])
print(model.metrics)
[<tensorflow.python.keras.metrics.Mean at 0x7f90e7285e20>,
 <tensorflow.python.keras.metrics.Accuracy at 0x7f90e72fceb0>]

这里发生了一些有趣的事情。由于“准确度”不属于该列表,_get_metric_object 调用 metrics.get() ->metrics.deserialize()-> generic_utils.deserialize_keras_object() 函数,该函数只需拉起 tf.keras.metrics.Accuracy 并直接返回,而不是调用 tf.keras.metrics.MeanMetricWrapper

这就是为什么你得到不正确的准确性值,但它不会引发错误!

【讨论】:

  • “不识别”是什么意思? OP显示的代码应该抛出错误吗?
  • 感谢您的关注。我正在用详细信息更新我的答案。
  • 更新了,把我带进了一个兔子洞,但很高兴。非常感谢!
  • 同样提出了一个问题。 github.com/tensorflow/tensorflow/issues/46436
  • 乐于助人,对问题的分析很好!
猜你喜欢
  • 2020-06-07
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 2015-10-28
相关资源
最近更新 更多