Python: Как решить низкую точность сверточной модели вариационного автоэнкодера, разработанной для прогнозирования последовательности будущих кадров? - PullRequest
0 голосов
/ 11 февраля 2020

В настоящее время я занимаюсь разработкой модели прогнозирования смещения осадки. Я взял за модель для реализации вариационного сверточного автоэнкодера (я прилагаю код модели). Таким образом, модель получает последовательность из 5 изображений и должна прогнозировать следующие 5. Архитектура состоит из пяти конволюционных слоев в кодере и декодере (Conv Transpose), которые были сделаны для значительного уменьшения размера изображения и изучения пространственных деталей. Между кодером и декодером переносятся уровни ConvLSTM для изучения временных последовательностей. Я работаю с ним в Python, с тензорным потоком и керасом.

Данные состоят из «изображений» дождевого радара 400x400 пикселей, с темным фоном и дождевыми камерами в центре кадра. Время между кадром и кадром составляет 5 минут, настройка радара. После дальнейшей обработки тренировочные данные масштабируются от 0 до 1 и в формате numpy (для работы с матрицами). Мои тренировочные данные, наконец, имеют вид [количество последовательностей, количество изображений в последовательности, высота, ширина, канал = 1].

Последовательность осадков Изображения

Последовательности состоят из: 5 входов и 5 целей, из которых есть 2111 последовательностей радиолокационных изображений (я знаю, у меня мало данных :( для обучения), и 80% были взяты для обучения и 20% для проверки. Для деталей:

  1. train_input = [1688, 5, 400, 400, 1]
  2. train_target = [1688, 5, 400, 400, 1]
  3. valid_input = [423, 5, 400, 400, 1]
  4. valid_target = [423, 5, 400, 400, 1]

Проблема в том, что я обучил свою модель и я получил значение точности очень плохое. около 8e-05. Я тренировал 400 эпох, и значение остается или окружает упомянутое значение. Также, когда я беру последовательность из 5 изображений, чтобы предсказать следующие 5, Я получаю очень плохие результаты (даже небольшое образование "пятен" в центре, которое представляет дождь) , Я уже пытался уменьшить количество слоев в кодере и декодере, в дополнение к оптимизатору [adam, nadam, adadelta], я также пытался использовать функцию активации [relu, elu]. Я не получил никаких выгодных результатов в изображениях прогноза и значении точности.

Потери и точность во время обучения

Я новичок в темах глубокого обучения, я Мне это очень нравится, но я не могу найти решение этой проблемы. Я подозреваю, что моя модель архитектуры не так. В дополнение к этому я должен искать лучший оптимизатор или функцию активации, чтобы улучшить значение точности и предсказанных изображений. В качестве последнего решения, возможно, вырезать изображение размером 400x400 пикселей в центральной области, где выпадают осадки. Хотя я потерял бы обучающие данные.

Я ценю, что вы можете помочь мне решить эту проблему, возможно, предоставив мне некоторые идеи по организации моей модели архитектуры или идеи по организации обучающих данных. С наилучшими пожеланиями.

    # Encoder

    seq = Sequential()

    seq.add(Input(shape=(5, 400, 400,1)))

    seq.add(Conv3D(filters=32, kernel_size=(11, 11, 5), strides=3,
                   padding='same', activation ='relu'))
    seq.add(BatchNormalization())

    seq.add(Conv3D(filters=32, kernel_size=(9, 9, 32), strides=2,
                   padding='same', activation ='relu'))
    seq.add(BatchNormalization())

    seq.add(Conv3D(filters=64, kernel_size=(7, 7, 32), strides=2,
                   padding='same', activation ='relu'))
    seq.add(BatchNormalization())

    seq.add(Conv3D(filters=64, kernel_size=(5, 5, 64), strides=2,
                   padding='same', activation ='relu'))
    seq.add(BatchNormalization())

    seq.add(Conv3D(filters=32, kernel_size=(3, 3, 64), strides=3,
                   padding='same', activation ='relu'))
    seq.add(BatchNormalization())

    # ConvLSTM Layers

    seq.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
    input_shape=(None, 6, 6, 32),
    padding='same', return_sequences=True))
    seq.add(BatchNormalization())

    seq.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
    padding='same', return_sequences=True))
    seq.add(BatchNormalization())

    seq.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
    padding='same', return_sequences=True))
    seq.add(BatchNormalization())

    seq.add(ConvLSTM2D(filters=40, kernel_size=(3, 3),
    padding='same', return_sequences=True))
    seq.add(BatchNormalization())

    seq.add(Conv3D(filters=32, kernel_size=(3, 3, 3),
    activation='relu',
    padding='same', data_format='channels_last'))

    # Decoder

    seq.add(Conv3DTranspose(filters=32, kernel_size=(3, 3, 64), strides=(2,3,3),
                                      input_shape=(1, 6, 6, 32),
                                      padding='same', activation ='relu'))
    seq.add(BatchNormalization())

    seq.add(Conv3DTranspose(filters=64, kernel_size=(5, 5, 64), strides=(3,2,2),
                                      padding='same', activation ='relu'))
    seq.add(BatchNormalization())

    seq.add(Conv3DTranspose(filters=64, kernel_size=(7, 7, 32), strides=(1,2,2),
                                      padding='same', activation ='relu'))
    seq.add(BatchNormalization())

    seq.add(Conv3DTranspose(filters=32, kernel_size=(9, 9, 32), strides=(1,2,2),
                                      padding='same', activation ='relu'))
    seq.add(BatchNormalization())

    seq.add(Conv3DTranspose(filters=1, kernel_size=(11, 11, 5), strides=(1,3,3),
                                      padding='same', activation ='relu'))
    seq.add(BatchNormalization())

    seq.add(Cropping3D(cropping = (0,16,16)))

    seq.add(Cropping3D(cropping = ((0,-5),(0,0),(0,0))))

    seq.compile(loss='mean_squared_error', optimizer='adadelta', metrics=['accuracy'])

1 Ответ

0 голосов
/ 27 февраля 2020

Метри c, которую вы хотели бы использовать в случае проблемы регрессии: mse (mean_squared_error) или mae (mean_absolute_error).

Возможно, вы захотите использовать mse в начале, поскольку он штрафует больше ошибок, чем mae.

Вам просто нужно немного изменить код, где вы компилируете свою модель.

seq.compile(loss='mean_squared_error', optimizer='adadelta', metrics=['mse','mae'])

В этом как вы можете контролировать как mse, так и mae metri c во время тренировки.

...