Регрессия с 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