Я пытаюсь предсказать следующее изображение в последовательности изображений, и я не слишком уверен, почему 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