【问题标题】:CNN and LSTM for image captioning in KerasCNN 和 LSTM 用于 Keras 中的图像字幕
【发布时间】:2020-07-29 17:45:45
【问题描述】:

我想在 Keras 中实现以下架构以用于图像字幕,但我在将 CNN 的输出连接到 的输入时遇到了很多困难>LSTM.

使用 CNN 的输出作为 LSTM 的输入很重要。类似于下图的东西。

我可以单独制作 LSTM 或 CNN,但我不知道如何构建这种结构。 必须将图像转换为特征描述 CNN 并输入到 LSTM,而向量表示中的标题文字则从另一种方式插入到 LSTM 单元中。这样一号单元格负责产生第一个单词,依此类推。我认为 CNN 和 LSTM 必须同时训练。

顺便说一句,这不是学校作业:)

提前感谢您的帮助。

【问题讨论】:

    标签: tensorflow keras deep-learning lstm conv-neural-network


    【解决方案1】:

    我假设您熟悉 Tensorflow Keras API。我将通过以下方式实现代码。

    假设: Vocab_size = 4000input_image_size = (572,572,3)

    vocab_size = 4000
    
    inputs = layers.Input(shape=(572, 572, 3))
    
    c0 = layers.Conv2D(64, activation='relu', kernel_size=3)(inputs)
    c1 = layers.Conv2D(64, activation='relu', kernel_size=3)(c0)  # This layer for concatenating in the expansive part
    c2 = layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding='valid')(c1)
    
    c3 = layers.Conv2D(128, activation='relu', kernel_size=3)(c2)
    c4 = layers.Conv2D(128, activation='relu', kernel_size=3)(c3)  # This layer for concatenating in the expansive part
    c5 = layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding='valid')(c4)
    
    c6 = layers.Conv2D(256, activation='relu', kernel_size=3)(c5)
    c7 = layers.Conv2D(256, activation='relu', kernel_size=3)(c6)  # This layer for concatenating in the expansive part
    c8 = layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding='valid')(c7)
    
    c9 = layers.Conv2D(512, activation='relu', kernel_size=3)(c8)
    c10 = layers.Conv2D(512, activation='relu', kernel_size=3)(c9)  # This layer for concatenating in the expansive part
    c11 = layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding='valid')(c10)
    
    fc1 = layers.Dense(4096)(c11)
    fc2 = layers.Dense(4096)(fc1)
    
    reshape = layers.Reshape((64, 4096))(fc2)
    
    rnn1 = layers.LSTM(64, return_sequences=True)(reshape)
    rnn2 = layers.LSTM(64)(rnn1)
    
    outputs = layers.Dense(vocab_size, activation='softmax')(rnn2)
    
    model = tf.keras.Model(inputs=inputs, outputs=outputs, name="caption_generate")
    
    
    model.summary()
    

    这里的重要部分是将您的输出从4 dimensions 真正重塑为3 dimensions。由于LSTM 需要在3 dimensions 中输入

    reshape = layers.Reshape((64, 4096))(fc2)
    

    以下代码有效,您应该可以使用它。 我希望答案对您有帮助。

    【讨论】:

    • 感谢您的回复。我想这就是我一直在寻找的。就一件事。你如何将图像和单词分别插入到 LSTM 中?我的意思是,如何定义单词应该输入到每个单元格的位置以及 Conv 的结果如何成为第一个 LSTM 单元格的输入?再次感谢,期待您的回复。
    • 您必须使用 fit API。只需使用此tensorflow.org/api_docs/python/tf/keras/Model#fit 提供您的x 图像和y 句子。要了解这种模型的训练是如何工作的,请查看以下文章。 tensorflow.org/tutorials/text/image_captioning。上面提供的解决方案实现了您希望的确切结构。
    • 谢谢伙计。我已经看过你给我的链接,但我想我知道标签和图像之间的区别是通过这种方式完成的
    猜你喜欢
    • 1970-01-01
    • 2021-02-28
    • 2019-10-22
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多