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

时间:2019-10-22 08:31:28

标签: 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
....

我尝试使用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)

当我训练数据时,它会显示损失:南

Epoch 1/200
45000/45000 [==============================] - 2s 48us/step - loss: nan
Epoch 2/200
45000/45000 [==============================] - 2s 38us/step - loss: nan

完成训练后,将显示如下输出。

##########################################
[[nan]
 [nan]
 [nan]
 ...
 [nan]
 [nan]
 [nan]]

X_train.shape是(45000,5) y_train.shape是(45000,1) 所有输出均为NaN。如何解决?

1 个答案:

答案 0 :(得分:2)

代码中最突出的问题是您没有清除数据。简单来说,神经网络的行为是通过将每一层(即密集层)上的每个节点相乘。然后,想象一下:您在第一层有32个节点,最大正数约为35,000。如果您将这35,000(或多或少取决于体重和偏见)本身乘以32,则您的数字将超出限制,并在短短几个纪元内得出NaN。

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

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

希望这会有所帮助。