【问题标题】:Implement Seq2Seq in Keras with Image Seqs使用图像序列在 Keras 中实现 Seq2Seq
【发布时间】:2026-01-02 16:55:01
【问题描述】:

我有一个问题,输入为图像序列,输出为标签序列,这些标签对应于图像中的每一帧。输入格式如下图:

目标:根据输入序列[img 0, img 1, img 2, img 3] 的列表预测标签列表[label 0, label 1, label 2, label 3]。训练模型的输出应该是:

P([label 0, label 1, label 2, label 3]/[img 0, img 1, img 2, img 3]).

label 0 依赖于img 0,也与img 1, img 2 and img 3 相关。其他标签也取决于输入序列中的所有图像。因此,这使得目标标签同时依赖于每幅图像中的空间信息和时间信息。

因此,我计划使用卷积神经网络 (CNN) 对每个 img 的空间信息进行编码。同时,如何用 LSTM 编码 img 序列的时间信息?

这是我的代码:

from keras.models import Sequential, Model
from keras.layers import Dense, Conv2D, LSTM, Flatten, TimeDistributed, RepeatVector
from keras.layers.normalization import BatchNormalization

def cnn_lstm():

    model = Sequential()

    # CNN module
    model.add(TimeDistributed(Conv2D(filters = 8, 
                                    kernel_size = (2, 2), 
                                    padding = 'same',
                                    activation='relu',
                                    name = 'Conv_1'),
                                    input_shape = (None, img_height, img_width, channels)))

    model.add(TimeDistributed(BatchNormalization(name='BN_1')))
    model.add(TimeDistributed(MaxPooling2D()))

    model.add(TimeDistributed(Conv2D(filters = 8, 
                                    kernel_size = (2, 2), 
                                    padding = 'same',
                                    activation='relu',
                                    name = 'Conv_2')))

    model.add(TimeDistributed(BatchNormalization(name='BN_2')))
    model.add(TimeDistributed(MaxPooling2D()))

    # Flatten all features from CNN before inputing them into LSTM
    model.add(TimeDistributed(Flatten()))

    # LSTM module
    model.add(LSTM(50))
    model.add(RepeatVector(output_seq_length))

    model.add(LSTM(50, return_sequences=True, name = 'decoder'))
    model.add(TimeDistributed(Dense(nb_classes, activation='softmax')))

    model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

    return model

在此示例中为output_seq_length = 4nb_classes = 4

我的模型能达到我的预期吗?

如果是 seq2seq 问题,看起来并不涉及“教师强迫”,如 tutorial 所示。

有没有办法同时利用 CNN 编码空间信息和 LSTM 编码时间信息?像 CNN 和编码器-解码器 LSTM 的组合

欢迎任何意见!非常感谢!

【问题讨论】:

    标签: python keras deep-learning lstm convolutional-neural-network


    【解决方案1】:

    您的模型很可能会工作,但您可以通过使用Bidirectional 包装器来以两种方式积累信息来改进您的 LSTM。您也不想压缩第一个 LSTM 并在标记每个图像时返回序列。

    CNN 和 LSTM 的组合? Keras 有一个 ConvLSTM2D 层,可以将卷积应用于输入和循环组件。

    【讨论】:

    • 感谢您的建议。您能否详细说明“您也不想压缩第一个 LSTM 并返回序列”?如果我在第一个 LSTM 中返回序列,我不会在第二个 LSTM 中使用它。那么return_sequences=True 会有帮助吗?
    • 您希望对两个 LSTM 都使用 return_sequences,这样所有图像都不会被编码/压缩成单个向量。相反,您会为两个图层中的每个图像返回一个隐藏状态。
    • 在我的代码中,model.add(LSTM(50)) 仅将最终单元状态作为具有 50 个元素的向量返回。如果我将return_sequences=True 用于第一个 LSTM,我将在每个时间步获得 LSTM 的输出。您的建议是拥有 return_sequences,并在第二个 LSTM 中使用它们?如何同时使用 return_sequencesfinal cell state 作为第二个 LSTM 的输入?
    • @Jundong 你的问题终于解决了吗?并想分享您的解决方案?
    • 对不起,@TheJokerAEZ,我没有解决这个问题。