Python Keras多层感知器列车数据显示损失=nan
我在data_2.csv中有这样的数据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] ... [
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
,则只能在插入输入之前尝试缩放输入。