训练时 Keras 神经网络精度始终为 0
Posted
技术标签:
【中文标题】训练时 Keras 神经网络精度始终为 0【英文标题】:Keras Neural Network Accuracy is always 0 While Training 【发布时间】:2020-06-07 13:31:50 【问题描述】:我正在使用 keras 神经网络制作一个简单的分类算法。目标是获取 3 个天气数据点并确定是否发生野火。这是我用来训练模型的 .csv 数据集的图像(此图像只是前几行,并不是全部): wildfire weather dataset 如您所见,有 4 列,第四列要么是“1”,意思是“火”,要么是“0”,意思是“没有火”。我希望算法预测 1 或 0。这是我编写的代码:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import keras
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import csv
#THIS IS USED TO TRAIN THE MODEL
# Importing the dataset
dataset = pd.read_csv('Fire_Weather.csv')
dataset.head()
X=dataset.iloc[:,0:3]
Y=dataset.iloc[:,3]
X.head()
obj=StandardScaler()
X=obj.fit_transform(X)
X_train,X_test,y_train,y_test=train_test_split(X, Y, test_size=0.25)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
classifier = Sequential()
# Adding the input layer and the first hidden layer
classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation =
'relu', input_dim = 3))
# classifier.add(Dropout(p = 0.1))
# Adding the second hidden layer
classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation
= 'relu'))
# classifier.add(Dropout(p = 0.1))
# Adding the output layer
classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation
= 'sigmoid'))
# Compiling the ANN
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics
= ['accuracy'])
classifier.fit(X_train, y_train, batch_size = 3, epochs = 10)
y_pred = classifier.predict(X_test)
y_pred = (y_pred > 0.5)
print(y_pred)
classifier.save("weather_model.h5")
问题是每当我运行它时,我的准确率总是“0.0000e+00”,我的训练输出如下所示:
Epoch 1/10
2146/2146 [==============================] - 2s 758us/step - loss: nan - accuracy: 0.0238
Epoch 2/10
2146/2146 [==============================] - 1s 625us/step - loss: nan - accuracy: 0.0000e+00
Epoch 3/10
2146/2146 [==============================] - 1s 604us/step - loss: nan - accuracy: 0.0000e+00
Epoch 4/10
2146/2146 [==============================] - 1s 609us/step - loss: nan - accuracy: 0.0000e+00
Epoch 5/10
2146/2146 [==============================] - 1s 624us/step - loss: nan - accuracy: 0.0000e+00
Epoch 6/10
2146/2146 [==============================] - 1s 633us/step - loss: nan - accuracy: 0.0000e+00
Epoch 7/10
2146/2146 [==============================] - 1s 481us/step - loss: nan - accuracy: 0.0000e+00
Epoch 8/10
2146/2146 [==============================] - 1s 476us/step - loss: nan - accuracy: 0.0000e+00
Epoch 9/10
2146/2146 [==============================] - 1s 474us/step - loss: nan - accuracy: 0.0000e+00
Epoch 10/10
2146/2146 [==============================] - 1s 474us/step - loss: nan - accuracy: 0.0000e+00
有谁知道为什么会发生这种情况以及我可以对我的代码做些什么来解决这个问题? 谢谢!
【问题讨论】:
嗨,您是否已经检查过您的数据是否包含NaN
或inf
值? keras/tensorflow 根本不喜欢这样!我建议您将所有数据转换为 float32
,确保不包含此类值并应用标准规范化器(例如 sklearn 的那个)。
你能帮我打印几行 X 和 Y 吗?
请从 csv 文件中粘贴一些数据以查看发生了什么
请提供一个数据集,否则我将无法预测出什么问题?因为我使用的数据集可以正常工作吗?你的代码是正确的。并检查天气它不是 nan 或字符串值
【参考方案1】:
编辑:我意识到我之前的回复具有高度误导性,幸好@xdurch0 和@Timbus Calin 指出了这一点。这是经过编辑的答案。
检查所有输入值是否有效。您的训练数据中是否有 nan
或 inf
值?
尝试使用不同的激活函数。 ReLU
很好,但它很容易出现所谓的 dying ReLu problem,在这种情况下,神经网络基本上什么也学不到,因为它的权重没有更新。一种可能性是使用Leaky ReLu or PReLU。
尝试使用渐变剪裁,这是一种用于解决渐变消失或爆炸的技术(您的情况可能就是这种情况)。 Keras 允许用户为优化器配置clipnorm
clip value
。
SO 上有一些帖子报告了类似的问题,例如this one,您可能也会感兴趣。
【讨论】:
这是不正确的。 Keras 足够“聪明”,可以将预测转换为 0/1(通过 0.5 的阈值)并以这种方式进行比较(假设标签提供正确)。该问题很可能源于导致nan
丢失的相同问题(无论可能是什么)。 IE。模型输出要么是nan
,要么是inf
。
xdurch0 是正确的。根据您的逻辑,几乎所有时候我们的准确率都是 0%,只有在模型 100% 确定数据点是否属于某个类的情况下。
@xdurch0 感谢您的指出。我之前的回复是匆匆写下的,诚然是经过深思熟虑的。经过更多思考,我编辑了答案。再次感谢。
感谢大家的帮助!我再次浏览了我的数据集,并意识到我有一些 NaN
值。删除这些后,我的算法开始按预期进行训练,现在完美运行。以上是关于训练时 Keras 神经网络精度始终为 0的主要内容,如果未能解决你的问题,请参考以下文章
Keras训练神经网络DEMO——全连接神经网络训练MNIST