Значения потерь NaN регрессии ANN

#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) безрезультатно. Однако это работает при удалении всех значений NaN dataset.dropna(inplace=True) . Однако это значительно уменьшает набор данных. Действительно ли значения NaN влияют на обучение таким образом?

5. @BDouchet Смотрите комментарий выше. Это работает при удалении всех значений NaN, но значительно уменьшает набор данных с 10 тыс. до 3 тыс. точек данных, что приводит к плохой подготовке. Я думаю, мне нужно поэкспериментировать с параметрами обучения, чтобы заставить его работать!

Ответ №1:

Я думаю, проблема в том, что вы добавили выпадающий слой после плотного (1) слоя. Это делает отсев верхним слоем вашей модели. Удалите его, и он должен работать

Комментарии:

1. Я пробовал много разных конфигураций модели, но безуспешно. С выпадением и без него, разное количество нейронов в скрытом слое и т. Д.