Прогнозирование следующей последовательности кадров с помощью вариационного автоэнкодера Convolutional, Tensorflow - PullRequest
0 голосов
/ 12 февраля 2020

Я новичок в глубоком обучении, и сейчас я пытаюсь разработать модель для прогнозирования следующей последовательности кадров. Я нашел в сети разные архитектуры и модели, но они высокого уровня. Поэтому я попробовал модель в соответствии с теорией вариационного автоэнкодера (CODER, DECODER), и между кодером и декодером, где должно быть скрытое пространство, я поместил сверточные слои LSTM (ConvLSTM2D). Я работал с tenorflow и keras в python 3.7. (adjunto la arquitectura)

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())

# """    CAPAS ConvLSTM    """

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"))


# """    DECODIFICADOR CONVOLUCIONAL   """

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))))

rmse = tf.keras.metrics.RootMeanSquaredError()

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

Данные для обучения состоят из "изображений" размером 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]

Проблема в том, что я обучил около 800 эпох и у меня нет хороших прогнозов. Я не знаю, что я делаю плохо Я думаю, что моя архитектура не является мощной, возможно, из-за количества слоев, функций активации, оптимизаторов или функции потерь. Я думаю, что должен быть какой-то слой, который использует параметрическое время в каждом кадре между кадрами. Я получаю только квадратное изображение многих рассеянных частиц (в пикселях). Реальное изображение на темном фоне h пузыри движутся.

Буду признателен за ваш вклад и идеи по улучшению моей архитектуры и прогнозированию последовательности изображений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...