Python Keras多层感知器列车数据显示损失=nan

Python Keras多层感知器列车数据显示损失=nan,python,tensorflow,machine-learning,keras,Python,Tensorflow,Machine Learning,Keras,我在data_2.csv中有这样的数据 a b c d e outcome 2 9 5 10175 3500 10000 1 3 4 23085 35000 34000 2 1 3 NaN 23283.33333 50000 .... ########################################## [[nan] [nan] [nan] ... [

我在data_2.csv中有这样的数据

a   b   c   d        e         outcome
2   9   5   10175   3500        10000
1   3   4   23085   35000       34000
2   1   3   NaN     23283.33333 50000
....
##########################################
[[nan]
 [nan]
 [nan]
 ...
 [nan]
 [nan]
 [nan]]
我试着用MLP训练。列结果是目标输出。这是我的密码

df = pd.read_csv('C://data_2.csv')

sc = MinMaxScaler()
X = sc.fit_transform(df.drop('income', axis=1).astype(float))

test= df[['outcome']]

y = sc.fit_transform(test.astype(float))

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=20, test_size=0.1)

model = Sequential()
model.add(Dense(32,input_shape=(5,), activation='relu'))
model.add(Dense(32,activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1,activation='softmax'))
model.compile(loss='mean_squared_error', optimizer='adam')
model.summary()

model.fit(X_train, y_train, epochs=200, batch_size=32, verbose=1)

y_pred = model.predict(X_test)

print("##########################################")
print(y_pred)
当我对数据进行训练时,它显示出如下的损失:nan

Epoch 1/200
45000/45000 [==============================] - 2s 48us/step - loss: nan
Epoch 2/200
45000/45000 [==============================] - 2s 38us/step - loss: nan
当完成训练时,它会像这样显示输出

a   b   c   d        e         outcome
2   9   5   10175   3500        10000
1   3   4   23085   35000       34000
2   1   3   NaN     23283.33333 50000
....
##########################################
[[nan]
 [nan]
 [nan]
 ...
 [nan]
 [nan]
 [nan]]
X_列车形状为(45000,5) y_列车形状为(45000,1)
所有输出均为NaN。如何修复它?

代码中的突出问题是没有清理数据。简单来说,神经网络的行为是将每一层(即密集层)上的每个节点相乘。然后,想象一下:第一层有32个节点,最大的正数约为35000。如果你将这个35000(多少取决于重量和偏差)乘以32倍,你的数字将超过极限,并在几个时代内变成NaN

因此,您的问题在于激活器,
relu
。此激活器仅过滤正数(零或更大),并将任何负数变为零。使用此激活器,您的初始节点将有天文数字

我建议将激活器更改为
sigmoid
功能。此函数用于缩放介于1和-1之间的数字(大多数情况下)。这样,您的大输入将变成绝对值小于1的数字


希望这有帮助。

代码中的突出问题是没有清理数据。简单来说,神经网络的行为是将每一层(即密集层)上的每个节点相乘。然后,想象一下:第一层有32个节点,最大的正数约为35000。如果你将这个35000(多少取决于重量和偏差)乘以32倍,你的数字将超过极限,并在几个时代内变成NaN

因此,您的问题在于激活器,
relu
。此激活器仅过滤正数(零或更大),并将任何负数变为零。使用此激活器,您的初始节点将有天文数字

我建议将激活器更改为
sigmoid
功能。此函数用于缩放介于1和-1之间的数字(大多数情况下)。这样,您的大输入将变成绝对值小于1的数字


希望这能有所帮助。

为什么不使用
sigmoid
而不是
校正线性单位
?在我看来,您的代码试图处理天文数字。尝试将第一个
relu
更改为
sigmoid
,并对其进行测试。为什么不使用
sigmoid
而不是
校正线性单位
?在我看来,您的代码试图处理天文数字。尝试将第一个
relu
更改为
sigmoid
并进行测试。如果要坚持
relu
,则只能在插入输入之前尝试缩放输入。如果要坚持
relu
,则只能在插入输入之前尝试缩放输入。