Данные многослойного поезда Perceptron Keras показывают потерю = нан - PullRequest
0 голосов
/ 22 октября 2019

У меня есть данные в 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)

пока я тренирую данные, они показывают убыток: nan вот так

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 is (45000, 5) y_train.shape is (45000, 1) Все выходные данные NaN. Как это исправить?

1 Ответ

1 голос
/ 22 октября 2019

Главная проблема в вашем коде в том, что вы не очищаете свои данные. Нейронные сети ведут себя простыми словами, умножая каждый узел на каждом слое (это плотный слой). Затем представьте себе: у вас есть 32 узла на первом слое, самое большое положительное число у вас составляет около 35 000. Если вы умножите эти 35 000 (более или менее в зависимости от веса и смещения) на себя 32 раза, ваше число превысит лимит и в конечном итоге будет равно NaN всего за несколько эпох.

Таким образом, ваша проблемас вашим активатором, relu. Этот активатор фильтрует только положительное число (ноль или больше) и превращает любые отрицательные числа в ноль. С этим активатором ваши начальные узлы будут иметь астрономические числа!

Я рекомендую изменить ваш активатор на sigmoid функцию. Эта функция масштабирует число от 1 до -1 (в основном). При этом ваши большие входы будут превращены в числа с абсолютными значениями меньше 1.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...