Регрессия с CNN - перекрытие изображений и утечка данных [закрыто]

Я использую изображения для выполнения регрессии с CNN. Проблема в том, что исходный набор данных очень мал. Поэтому я использовал перекрытие 96%, чтобы получить больше данных (от 250 до 2467 точек данных). Это приводит к проблемам при разделении набора данных на train, val, test, поскольку мне приходится пропускать 20 изображений до и после каждого интервала выборки. Я работал со случайной выборкой (без пропуска), что дало очень хорошие результаты по набору val, но обнаружил, что оптимистичные результаты были вызваны утечкой данных val в данные обучения.

Теперь я попытался выбрать два непрерывных интервала, где я пропустил до и после каждой интервальной выборки, что привело к потере 80 точек данных (для предотвращения утечки данных). Результаты сильно ухудшились, чего и следовало ожидать, но странно то, что я попробовал выполнить выборку без пропусков, что означает утечку данных в 80 точек. Результаты все еще такие же плохие, как и с пропуском, что я считаю странным. Как при пропуске, так и без пропуска кажется, что модель CNN ничему не учит, поскольку MSE находится в застое.

Может быть, моя предварительная обработка неисправна (образец был жестко закодирован со списками и numpy)? Или модель CNN просто не способна к обучению? Есть ли проблема с непрерывной проверкой выборки и тестовыми наборами (должны ли они выбираться случайным образом)? Возможно, у меня недостаточно данных, поскольку исходные данные имеют размер 250, а после предварительной обработки с перекрывающимися изображениями - 2467.

  • данные имеют форму (-1, 332, 76, 1)

Вот несколько изображений предсказания на множестве val, обученном на 150 эпохах.

График с утечкой данных (train_test_split для наборов train и val, легенда на этом графике неверна)

График без утечки данных (непрерывная выборка для проверки, всего 80 изображений с пропуском)

График с утечкой 80 точек данных (непрерывная выборка валидации без пропуска)

Это следующая модель, которую я использовал для графиков выше.

      def baseline_model():
  Regressor = Sequential()
  Regressor.add(Conv2D(224, kernel_size=(3, 3), activation = 'relu', padding='same', input_shape=(height,width, 1)))
  Regressor.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
  for i in range(1,5):
    Regressor.add(Conv2D(512, kernel_size=(3, 3), activation = 'relu', padding='same'))
    Regressor.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
  Regressor.add(Flatten())
  Regressor.add(Dense(256, activation='relu'))
  Regressor.add(Dropout(0.1))
  Regressor.add(Dense(1, activation='linear'))
  Adam= optimizers.Adam(lr=0.00055292)
  Regressor.compile(loss = 'mean_squared_error', optimizer=Adam, metrics=['mean_squared_error'])
  return Regressor

0 ответов

Другие вопросы по тегам