Прогноз ConvLSTM2D такой же, как у изображения в момент t-1 - PullRequest
1 голос
/ 20 февраля 2020

Я пытаюсь предсказать следующее изображение в последовательности изображений, и я не слишком уверен, почему LSTM не сокращают это для меня. Мое предсказанное изображение, кажется, всегда является копией изображения на предыдущем шаге. Это модель, которую я использовал. У меня также были похожие результаты при использовании Conv3D на моих изображениях, но я не слишком уверен, почему это так. Мой вход был нормализован, чтобы быть в диапазоне [0,1], и я умножил свой выходной сигнал на 255, потому что мои Y не были нормализованы.

Это моя модель LSTM

lstm = tf.keras.models.Sequential([
    tf.keras.layers.Lambda(lambda x: tf.expand_dims(x,axis=-1),input_shape=X.shape[1:]),
    tf.keras.layers.GaussianNoise(0.05),
    tf.keras.layers.ConvLSTM2D(25,padding='same',kernel_size=(3,3),return_sequences=True,stateful=False),
    tf.keras.layers.ConvLSTM2D(25,padding='same',kernel_size=(3,3),return_sequences=True),
    tf.keras.layers.ConvLSTM2D(25,padding='same',kernel_size=(3,3),return_sequences=False),
    tf.keras.layers.Conv2D(1,padding='same',kernel_size=(1,1),trainable=False),
    tf.keras.layers.Lambda(lambda x: tf.keras.backend.squeeze(x,axis=-1)),
    tf.keras.layers.Lambda(lambda x: 255. * tf.clip_by_value(x,0.,1.))
    ])

А это моя модель Conv3D

conv = tf.keras.models.Sequential([
    tf.keras.layers.Lambda(lambda x: tf.expand_dims(x,axis=-1),input_shape=X.shape[1:]),
    tf.keras.layers.GaussianNoise(0.05),
    tf.keras.layers.Conv3D(25,padding='same',data_format='channels_last',kernel_size=(5,3,3)),
    tf.keras.layers.LeakyReLU(),
    tf.keras.layers.Conv3D(25,padding='same',data_format='channels_last',kernel_size=(5,3,3)),
    tf.keras.layers.LeakyReLU(),
    tf.keras.layers.Conv3D(1,padding='same',data_format='channels_last',kernel_size=(1,1,1), trainable=True),
    tf.keras.layers.Lambda(lambda x: tf.keras.backend.squeeze(x,axis=-1)),
    tf.keras.layers.Conv2D(1,kernel_size=(1,1),data_format='channels_first',trainable=True),
    tf.keras.layers.Lambda(lambda x: tf.keras.backend.squeeze(x,axis=-3)),
    tf.keras.layers.LeakyReLU(),
    tf.keras.layers.Lambda(lambda x: 255. * tf.clip_by_value(x,0.,1.))
    ])

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

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

def custom_err(y_true,y_pred):
    #ssim has range [-1,1], with -1 being the worst and 1 being the best
    def SSIM(y_true,y_pred):
        ssim= tf.image.ssim(tf.expand_dims(y_true,-1),tf.expand_dims(y_pred,-1),255.)
        return ssim
    ssim=SSIM(y_true,y_pred)
    return 10**(abs(ssim - 1) * 20) - 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...