首页 > 解决方案 > 训练时 Keras 神经网络精度始终为 0

问题描述

我正在使用 keras 神经网络制作一个简单的分类算法。目标是获取 3 个天气数据点并确定是否发生野火。这是我用来训练模型的 .csv 数据集的图像(此图像只是前几行,不是全部内容): 野火天气数据集 如您所见,有 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

有谁知道为什么会发生这种情况以及我可以对我的代码做些什么来解决这个问题?谢谢你!

标签: pythontensorflowmachine-learningkerasneural-network

解决方案


编辑:我意识到我之前的回答具有高度误导性,幸好@xdurch0 和@Timbus Calin 指出了这一点。这是经过编辑的答案。

  1. 检查所有输入值是否有效。您的训练数据中有任何值吗naninf

  2. 尝试使用不同的激活函数。ReLU很好,但它很容易出现所谓的死亡 ReLu 问题,神经网络基本上什么也没学到,因为它的权重没有更新。一种可能性是使用Leaky ReLu 或 PReLU

  3. 尝试使用渐变剪裁,这是一种用于解决渐变消失或爆炸的技术(这很可能是您的情况)。Keras允许用户配置clipnorm clip value优化器。

SO上有一些帖子报告了类似的问题,例如this one,您可能也会感兴趣。


推荐阅读