簡體   English   中英

創建CoreML LRCN模型

[英]Creating a CoreML LRCN model

您好,在此先感謝您或提供的任何幫助或指導!

我的問題來自於Apple CoreML文檔站點上發布的一篇文章。 在WWDC 2017講座中也涵蓋了本文的主題,我發現它很有趣。 我最近發布了一個問題,該問題與我正在從事的同一項目的一部分有關,並且可以輕松解決。 但是,隨着我進一步努力,我發現自己不了解該模型的一部分是如何實現的。

首先,我要在Keras中建立一個模型,該模型的Tensorflow后端在時間分布式包裝器中使用卷積層。 在卷積部分之后,單個LSTM層連接到密集層作為輸出。 目標是創建一個多對多結構,以填充圖像序列將每個項目分類。 我將在下面發布該模型的代碼。

我計划培訓和部署該網絡的計划可能會提出其他問題,但是如果它們引起麻煩,我將在此單獨發布。 它涉及到使用時間分布式包裝器進行訓練,然后將其剝離模型並在CoreML轉換時加載已包裝層的權重,因為時間分配包裝器不適用於CoreML。

我的問題是這樣的:

在上述文章(以及我在GitHub上找到的CormeML示例項目)中,實現非常聰明。 由於CoreML(或至少庫存轉換器)不支持將圖像序列作為輸入,因此圖像一次被饋入,並且LSTM狀態作為輸入與輸出預測一起從網絡傳遞出去。 對於序列中的下一個圖像,用戶將圖像以及上一個時間步的LSTM狀態傳遞給該圖像,以便該模型可以“從中斷處拾取”,以便將單個輸入作為序列進行處理。 它為LSTM狀態形成了一個循環(Apple文章對此進行了詳細介紹)。 現在,對於實際問題部分...

如何在像Keras這樣的庫中實現這一點? 到目前為止,我已經成功使用功能性API和LSTM層上的“ return_state”設置輸出LSTM狀態,並將其路由到輔助輸出。 很簡單 (至少對我而言)不是那么簡單,是如何將該狀態傳回網絡以進行下一個預測。 我已經查看了LSTM層的源代碼和文檔,但看不到任何作為狀態輸入而跳出的內容。 我唯一能想到的就是可能使LSTM層成為其自己的模型,並使用“ initial_state”進行設置,但是基於我發現的Keras GitHub上的一篇文章,看來該模型需要自定義調用功能,我不確定如何在CoreML中使用它。 僅供參考,我打算將隱藏狀態和單元狀態都循環到模型中或從模型中循環出來,除非這不是必需的,並且僅應使用隱藏狀態,如Apple模型中所示。

再次感謝。 提供的任何幫助總是感激不盡!

我當前的模型如下所示:

image_input = Input(shape=(max_sequence_length, 224, 224, 3))
hidden_state_input = Input(shape=((None, 256)))
cell_state_input = Input(shape=((None, 256)))

convolutional_1 = TimeDistributed(Conv2D(64, (3, 3), activation='relu', data_format = 'channels_last'))(image_input)
pooling_1 = TimeDistributed(MaxPooling2D((2, 2), strides=(1, 1)(convolutional_1)

convolutional_2 = TimeDistributed(Conv2D(128, (4,4), activation='relu'))(pooling_1)
pooling_2 = TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2)))(convolutional_2)

convolutional_3 = TimeDistributed(Conv2D(256, (4,4), activation='relu'))(pooling_2)
pooling_3 = TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2)))(convolutional_3)

flatten_1 = TimeDistributed(Flatten())(pooling_3)
dropout_1 = TimeDistributed(Dropout(0.5))(flatten_1)

lstm_1, state_h, state_c = LSTM(256, return_sequences=True, return_state=True, stateful=False, dropout=0.5)(dropout_1)

dense_1 = TimeDistributed(Dense(num_classes, activation='sigmoid'))(lstm_1)

model = Model(inputs = [image_input, hidden_state_input, cell_state_input], outputs = [dense_1, state_h, state_c])

鏈接到Apple文章: https : //developer.apple.com/documentation/coreml/core_ml_api/making_predictions_with_a_sequence_of_inputs

使用使用類似方法的示例模型鏈接到GitHub存儲庫: https : //github.com/akimach/GestureAI-CoreML-iOS

鏈接到有關自定義調用函數的Keras GitHub帖子: https : //github.com/keras-team/keras/issues/2995

事實證明coremltools轉換器將在轉換過程中自動添加狀態輸入和輸出。

Keras轉換器_topology.py,第215行供參考。

暫無
暫無

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

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