#tensorflow #keras #deep-learning #neural-network #regression
#тензорный поток #keras #глубокое обучение #нейронная сеть #регрессия
Вопрос:
Я пытаюсь обучить ANN для выполнения регрессии. Набор данных состоит из ~ 10 тыс. точек данных для 7 параметров. Я использую этот базовый пример регрессии из Tensorflow.
Однако во время обучения значения потерь возвращают значения NaN от самой первой эпохи до последней. Я пробовал разные методы регуляризации (нормализация, отсев, регуляризация веса L1 / L2) без какого-либо успеха.
Любые предложения о том, что может быть источником этого, и как решить?
Ниже приведены некоторые полезные фрагменты кода и изображения:
Модель
def build_and_compile_model(norm):
model = keras.Sequential([
norm,
layers.Dense(10, activation='relu', kernel_regularizer=regularizers.l1_l2(l1=1e-5, l2=1e-4),
bias_regularizer=regularizers.l2(1e-4),
activity_regularizer=regularizers.l2(1e-5)),
layers.Dense(1)
])
model.add(Dropout(0.2, input_shape=(6,)))
model.compile(loss='mean_absolute_error',
optimizer=tf.keras.optimizers.Adam(0.0001))
return model
dnn_model = build_and_compile_model(normalizer)
dnn_model.summary()
Обучение
%%time
history = dnn_model.fit(
train_features, train_labels,
validation_split=0.2,
verbose=0, epochs=100)
hist = pd.DataFrame(history.history)
hist['epoch'] = history.epoch
print(hist.head())
print(hist.tail())
# PRINT:
loss val_loss epoch
0 NaN NaN 0
1 NaN NaN 1
2 NaN NaN 2
3 NaN NaN 3
4 NaN NaN 4
loss val_loss epoch
95 NaN NaN 95
96 NaN NaN 96
97 NaN NaN 97
98 NaN NaN 98
99 NaN NaN 99
Wall time: 26.1 s
Проверка данных
Последняя строка является выходным параметром.
Комментарии:
1. у вас есть значения inf (np.inf) в вашем наборе данных?
2. Проверьте, нет ли у вас каких-либо
NaN
значений в вашем фрейме данных3. NaN означает, что ваши потери стали бесконечными. Попробуйте снизить скорость обучения (например, 0,000001 или даже ноль), чтобы вы могли видеть, плохо ли ваша модель обучается или проблема в чем-то другом. И в качестве предложения я предлагаю удалить
norm
layer и регуляризаторы и попробовать простейшую версию вашей сети, пока она не заработает4. @Yefet Я попытался заменить все значения inf на значения NaN, используя
dataset.replace([np.inf, -np.inf], np.nan)
безрезультатно. Однако это работает при удалении всех значений NaNdataset.dropna(inplace=True)
. Однако это значительно уменьшает набор данных. Действительно ли значения NaN влияют на обучение таким образом?5. @BDouchet Смотрите комментарий выше. Это работает при удалении всех значений NaN, но значительно уменьшает набор данных с 10 тыс. до 3 тыс. точек данных, что приводит к плохой подготовке. Я думаю, мне нужно поэкспериментировать с параметрами обучения, чтобы заставить его работать!
Ответ №1:
Я думаю, проблема в том, что вы добавили выпадающий слой после плотного (1) слоя. Это делает отсев верхним слоем вашей модели. Удалите его, и он должен работать
Комментарии:
1. Я пробовал много разных конфигураций модели, но безуспешно. С выпадением и без него, разное количество нейронов в скрытом слое и т. Д.