Keras-验证损失和准确性停留在0

时间:2020-05-10 02:46:16

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

我正在尝试为Tensorflow keras中的二进制分类训练一个简单的2层全连接神经网络。我已使用sklearn的train_test_split()将数据分为80-20个训练和验证集。

当我打电话给model.fit(X_train, y_train, validation_data=[X_val, y_val])时,对于所有时期它显示0验证丢失和准确性,但是训练得很好。

Screenshot of model.fit call and verbose log

此外,当我尝试在验证集上对其进行评估时,输出为非零。

Screenshot of model.evaluate function call

有人可以解释一下为什么我在验证时遇到0损失0精度错误的问题。感谢您的帮助。

以下是此错误的完整示例代码(MCVE):https://colab.research.google.com/drive/1P8iCUlnD87vqtuS5YTdoePcDOVEKpBHr?usp=sharing

1 个答案:

答案 0 :(得分:26)

  • 如果您使用keras而不是tf.keras,则一切正常。

  • 对于tf.keras,我什至尝试使用validation_data = [X_train, y_train],这也提供了零精度。

这是一个示范:

model.fit(X_train, y_train, validation_data=[X_train.to_numpy(), y_train.to_numpy()], 
epochs=10, batch_size=64)

Epoch 1/10
8/8 [==============================] - 0s 6ms/step - loss: 0.7898 - accuracy: 0.6087 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00
Epoch 2/10
8/8 [==============================] - 0s 6ms/step - loss: 0.6710 - accuracy: 0.6500 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00
Epoch 3/10
8/8 [==============================] - 0s 5ms/step - loss: 0.6748 - accuracy: 0.6500 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00
Epoch 4/10
8/8 [==============================] - 0s 6ms/step - loss: 0.6716 - accuracy: 0.6370 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00
Epoch 5/10
8/8 [==============================] - 0s 6ms/step - loss: 0.6085 - accuracy: 0.6326 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00
Epoch 6/10
8/8 [==============================] - 0s 6ms/step - loss: 0.6744 - accuracy: 0.6326 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00
Epoch 7/10
8/8 [==============================] - 0s 6ms/step - loss: 0.6102 - accuracy: 0.6522 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00
Epoch 8/10
8/8 [==============================] - 0s 6ms/step - loss: 0.7032 - accuracy: 0.6109 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00
Epoch 9/10
8/8 [==============================] - 0s 5ms/step - loss: 0.6283 - accuracy: 0.6717 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00
Epoch 10/10
8/8 [==============================] - 0s 5ms/step - loss: 0.6120 - accuracy: 0.6652 - val_loss: 0.0000e+00 - val_accuracy: 0.0000e+00

因此,tensorflow的{​​{1}}实现肯定存在一些问题。

我挖了出处,似乎是造成fit的那部分:

validation_data

内部调用... ... # Run validation. if validation_data and self._should_eval(epoch, validation_freq): val_x, val_y, val_sample_weight = ( data_adapter.unpack_x_y_sample_weight(validation_data)) val_logs = self.evaluate( x=val_x, y=val_y, sample_weight=val_sample_weight, batch_size=validation_batch_size or batch_size, steps=validation_steps, callbacks=callbacks, max_queue_size=max_queue_size, workers=workers, use_multiprocessing=use_multiprocessing, return_dict=True) val_logs = {'val_' + name: val for name, val in val_logs.items()} epoch_logs.update(val_logs) ,因为我们已经建立了model.evaluate很好,我意识到唯一的罪魁祸首可能是evaluate

所以,我研究了实现:

unpack_x_y_sample_weight

这很疯狂,但是如果您只传递一个元组而不是一个列表,则由于def unpack_x_y_sample_weight(data): """Unpacks user-provided data tuple.""" if not isinstance(data, tuple): return (data, None, None) elif len(data) == 1: return (data[0], None, None) elif len(data) == 2: return (data[0], data[1], None) elif len(data) == 3: return (data[0], data[1], data[2]) raise ValueError("Data not understood.") 中的检查,一切都可以正常工作。 (此步骤之后,您的标签丢失了,并且数据以某种方式固定在unpack_x_y_sample_weight中,因此您在训练时没有合理的标签,这似乎是一个错误,但是文档中明确指出要传递元组)

以下代码可提供正确的验证准确性和准确性:

evaluate

因此,由于这似乎是一个 bug ,我刚刚在Tensorflow Github存储库中打开了一个相关问题:

https://github.com/tensorflow/tensorflow/issues/39370