Я использую 1D Convnet для прогнозирования скалярного значения на основе 100 временных точек с 28 функциями. Моя проблема в том, что каждая выборка, которую я даю сети для прогнозирования, дает один и тот же ответ (0,0038). Это как если бы обучение оптимизировало сеть для получения единого среднего значения по всем данным обучения. Я прочитал много постов об этой проблеме в StackOverflow, поэтому вот список того, что я уже проверил.
- Я начал с глубокого 1D Convnet с 6 слоями Conv (1.2m params), но я упростил его до 2 слоев Conv и Max Pooling и т. д. (200 тыс. параметров). Оба были основаны на примерах в онлайн-документации. Оба дают одну и ту же проблему. Более простой показан ниже.
- Если я попытаюсь предсказать разные выборки в неподготовленной сети, будут даны разные ответы. После обучения на 320 000 образцов каждый предсказанный ответ остается тем же. Это подсказывает мне, что это связано с обучением, а не с дизайном сети.
- Все мои входные данные нормализованы. В основном от -1 до +1, но некоторые функции иногда выходят за рамки этого.
- Вся активация - это relu.
- Я использую оптимизатор Адама с mse в качестве функции потерь.
- Во времяобучение, потери начинаются примерно с 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)])