簡體   English   中英

將 CNN 與 LSTM 相結合

[英]Combine CNN with LSTM

我希望與 CNN 一起實現 RNN,以便基於兩張圖像而不是單獨使用 CNN 進行預測。 我正在嘗試修改 alexnet model 代碼:

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 會更容易實現嗎?

如果我理解正確,您需要執行以下操作。 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 = (批量大小)x(圖像數)圖像。 要處理它們,請將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) 的 output 要處理編碼,您需要恢復批量尺寸。 這很容易做到:

    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 ,您將達到目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM