Сеть предсказывает один и тот же ответ для всех входов - PullRequest
0 голосов
/ 28 октября 2019

Я использую 1D Convnet для прогнозирования скалярного значения на основе 100 временных точек с 28 функциями. Моя проблема в том, что каждая выборка, которую я даю сети для прогнозирования, дает один и тот же ответ (0,0038). Это как если бы обучение оптимизировало сеть для получения единого среднего значения по всем данным обучения. Я прочитал много постов об этой проблеме в StackOverflow, поэтому вот список того, что я уже проверил.

  1. Я начал с глубокого 1D Convnet с 6 слоями Conv (1.2m params), но я упростил его до 2 слоев Conv и Max Pooling и т. д. (200 тыс. параметров). Оба были основаны на примерах в онлайн-документации. Оба дают одну и ту же проблему. Более простой показан ниже.
  2. Если я попытаюсь предсказать разные выборки в неподготовленной сети, будут даны разные ответы. После обучения на 320 000 образцов каждый предсказанный ответ остается тем же. Это подсказывает мне, что это связано с обучением, а не с дизайном сети.
  3. Все мои входные данные нормализованы. В основном от -1 до +1, но некоторые функции иногда выходят за рамки этого.
  4. Вся активация - это relu.
  5. Я использую оптимизатор Адама с mse в качестве функции потерь.
  6. Во времяобучение, потери начинаются примерно с 4 и довольно быстро доходят до 1, заканчивая примерно 0,0007. Это, как квадрат ошибки, находится на правильном уровне для неоптимизированной сети (мои ожидаемые значения находятся в диапазоне от +0,1 до -0,1). Сеть предсказывает 0,0038 в качестве ответа, независимо от того, что я даю в качестве входных данных.

Какие еще причины, по которым люди находят сеть, сходятся на одном выходе таким образом? Какой подход я мог бы использовать, чтобы сломать вещи, чтобы устранить проблему. Все предложения приветствуются!

Спасибо.

Джулиан

Вот упрощенная версия сети.

model = tf.keras.models.Sequential([
  tf.keras.layers.Conv1D(128, 9, activation='relu', input_shape=(100, 28)),
  tf.keras.layers.MaxPooling1D(2),
  tf.keras.layers.Conv1D(256, 5, activation='relu'),
  tf.keras.layers.GlobalAveragePooling1D(),
  tf.keras.layers.Dense(1)])
...