我正在使用Keras神经网络创建一个简单的分类算法。目标是根据天气数据的3个数据点来判断是否有野火发生。以下是我用来训练模型的.csv数据集的图像(此图像仅显示了前几行,并不是完整的数据集):野火天气数据集如你所见,数据集有4列,第四列的值为“1”表示“有火”,值为“0”表示“无火”。我希望算法能预测出1或0。以下是我编写的代码:
import numpy as npimport matplotlib.pyplot as pltimport pandas as pdimport kerasfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.layers import Dropoutfrom sklearn.preprocessing import StandardScalerfrom sklearn.model_selection import train_test_splitimport csv#THIS IS USED TO TRAIN THE MODEL# Importing the datasetdataset = 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 layerclassifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 3)) # classifier.add(Dropout(p = 0.1)) # Adding the second hidden layerclassifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu')) # classifier.add(Dropout(p = 0.1)) # Adding the output layerclassifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid')) # Compiling the ANNclassifier.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/102146/2146 [==============================] - 2s 758us/step - loss: nan - accuracy: 0.0238Epoch 2/102146/2146 [==============================] - 1s 625us/step - loss: nan - accuracy: 0.0000e+00Epoch 3/102146/2146 [==============================] - 1s 604us/step - loss: nan - accuracy: 0.0000e+00Epoch 4/102146/2146 [==============================] - 1s 609us/step - loss: nan - accuracy: 0.0000e+00Epoch 5/102146/2146 [==============================] - 1s 624us/step - loss: nan - accuracy: 0.0000e+00Epoch 6/102146/2146 [==============================] - 1s 633us/step - loss: nan - accuracy: 0.0000e+00Epoch 7/102146/2146 [==============================] - 1s 481us/step - loss: nan - accuracy: 0.0000e+00Epoch 8/102146/2146 [==============================] - 1s 476us/step - loss: nan - accuracy: 0.0000e+00Epoch 9/102146/2146 [==============================] - 1s 474us/step - loss: nan - accuracy: 0.0000e+00Epoch 10/102146/2146 [==============================] - 1s 474us/step - loss: nan - accuracy: 0.0000e+00
有谁知道这是为什么,以及我可以对代码做些什么来解决这个问题吗?谢谢!
回答:
编辑: 我意识到我之前的回答非常具有误导性,幸运的是被@xdurch0和@Timbus Calin指出了。这里是经过编辑的答案。
-
检查所有输入值是否有效。你的训练数据中是否有
nan
或inf
值? -
尝试使用不同的激活函数。
ReLU
很好,但它容易出现所谓的死亡ReLU问题,神经网络基本上学不到任何东西,因为它的权重没有更新。一种可能性是使用Leaky ReLU或PReLU。 -
尝试使用梯度裁剪,这是一种用来处理梯度消失或梯度爆炸的技术(这很可能是你遇到的问题)。Keras允许用户为优化器配置
clipnorm
和clip value
。
在Stack Overflow上有一些报告类似问题的帖子,比如这个,你可能也会感兴趣。