我在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。如何解决?
答案 0 :(得分:2)
代码中最突出的问题是您没有清除数据。简单来说,神经网络的行为是通过将每一层(即密集层)上的每个节点相乘。然后,想象一下:您在第一层有32个节点,最大正数约为35,000。如果您将这35,000(或多或少取决于体重和偏见)本身乘以32,则您的数字将超出限制,并在短短几个纪元内得出NaN。
因此,您的问题出在激活器relu
上。该激活器仅过滤正数(零或更大),并将任何负数都变为零。使用此激活器,您的初始节点将具有天文数字!
我建议将激活器更改为sigmoid
函数。此函数缩放介于1和-1之间的数字(大多数情况下)。这样,您的大型输入将被转换为绝对值小于1的数字。
希望这会有所帮助。