【问题标题】:Combine CNN with LSTM将 CNN 与 LSTM 相结合
【发布时间】:2021-04-08 22:01:57
【问题描述】:

我希望将 RNN 与 CNN 一起实现,以便基于两张图像而不是单独使用 CNN 进行预测。 我正在尝试修改 alexnet 模型代码:

def alexnet(width, height, lr, output=3):
    network = input_data(shape=[None, width, height, 1], name='input')
    network = conv_2d(network, 96, 11, strides=4, activation='relu')
    network = max_pool_2d(network, 3, strides=2)
    network = local_response_normalization(network)
    network = conv_2d(network, 256, 5, activation='relu')
    network = max_pool_2d(network, 3, strides=2)
    network = local_response_normalization(network)
    network = conv_2d(network, 384, 3, activation='relu')
    network = conv_2d(network, 384, 3, activation='relu')
    network = conv_2d(network, 256, 3, activation='relu')
    network = max_pool_2d(network, 3, strides=2)
    network = local_response_normalization(network)
    network = fully_connected(network, 4096, activation='tanh')
    network = dropout(network, 0.5)
    network = fully_connected(network, 4096, activation='tanh')
    network = dropout(network, 0.5)
    network = fully_connected(network, output, activation='softmax')
    network = regression(network, optimizer='momentum',
                         loss='categorical_crossentropy',
                         learning_rate=lr, name='targets')

    model = tflearn.DNN(network, checkpoint_path='model_alexnet',
                        max_checkpoints=1, tensorboard_verbose=0, tensorboard_dir='log')

    return model

我将图像放在一个 np 数组中,其中每个元素都是一个图像的像素数据。我无法通过 RNN 实现使用两个图像的功能。

我已经看到了 tflearn 的 reshape 和 lstm 方法,我认为它们应该放在最终的全连接层之前,但不确定如何指定要使用的图像数量。

另外,使用 Keras 会更容易实现吗?

【问题讨论】:

  • 你到底想用rnn分析什么?什么是“时间步长”——通过 cnn 获得的图像的编码还是什么?
  • @IvanK。我在 np 数组中有一系列游戏图像。使用 RNN,我想分析 X 帧之间的运动。我只是使用 CNN 来提取图像的特征。

标签: python tensorflow keras neural-network tflearn


【解决方案1】:

如果我理解正确,您需要执行以下操作。让model 成为网络,将一系列图像作为输入并返回预测。使用功能 API,其示意图如下:

    def create_model():
        input_data = keras.Input(shape=(number-of-images,shape-of-images))
        ### processing part ###
        model = keras.Model(input_images, your-predictions)
        return model
    model = create_model()

processing part 中,您希望获取每个图像的编码,然后使用 RNN 将它们分析为序列。

第一步,您需要获取所有图像的编码。让encoder 成为对单个图像进行编码的网络,返回enc_dim 维编码。为了有效地获取所有图像的编码,请注意在训练期间model 处理形状为(batch-size,number-of-images,shape-of-images) 的数据。因此,您总共有 total-number-of-images=(batch-size) x (number-of-images) 个图像。要处理它们,请将input_data 重塑为具有尺寸 (total-number-of-images,shape-of-images),如下所示:

    input_data_reshaped = tf.reshape(input_data, (-1,shape-of-images)),

并将它们通过encoder:

    image_encodings_flatterned = encoder(input_data_reshaped).

这将产生 (total-number-of-images,enc_dim) 形式的输出。要处理编码,您需要恢复 batch-size 维度。这很容易做到:

    image_encodings = tf.reshape(image_encodings_flatterned, (-1,number-of-images,enc_dim))

正如预期的那样,它将数据重塑为 (batch-size,number-of-images,enc_dim)。这些数据可以很容易地被 RNN 层或其组合处理。例如,对于单个 LSTM 层,

    rnn_analyzer = tf.keras.layers.LSTM(parameters)

预测结果如下:

    rnn_encodings = rnn_analyzer(image_encodings).

rnn_encodings 可以进一步被密集层用于进行最终预测。

通过将上述内容放在modelprocessing part 中,您将达到目标。

【讨论】:

  • 这种方法是否还需要 CNN 才能从图像中提取特征?
  • 是的,encoder 是您的 CNN 特征提取器。
猜你喜欢
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
  • 2021-08-03
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多