從documentation,我們可以看到,所有Keras復發層所期望的輸入形狀是:
(None, TimeSteps, DataDimension)
在Keras形狀,None
是你有實例的個數。
所以,在第一個簡單的方法,你必須有你的訓練數據形如:
(NumberOfVideos, NumberOfFrames, height * width * channels)
而你的第一層(如果第一層是LSTM)應該使用:
LSTM(AnyNumberOfCells, input_shape=(NumberOfFrames, height * width * channels))
批量大小(實例的數量)當您創建的模型從來沒有考慮,只出現在你的訓練數據,這就是爲什麼Keras顯示None
在消息該維度。
現在,這是一個非常簡單和直觀的方式開始,但實際上,沒有塑造這樣的訓練數據的義務,你可以嘗試各種方式,只要一個你保持對LSTM將您的數據定爲(BatchSize,TimeSteps,DataDimension)
。一個很好的方式來做到這一點(在我看來),首先要做一些卷積來減少數據大小,然後再將它送入LSTM。尺寸「高度*寬度*通道」在LSTM層中一次處理可能太多了,並且可能會導致內存問題。
如果你有記憶問題。你可以學習「發電機」或Keras Sequences。這些將與方法fit_generator()一起使用。 Keras將首先使用發生器讀取有限數量的數據,並僅使用該數據進行訓練。但是,你將不得不讓這些發電機以相同的格式輸出東西(ASmallerNumberOfVideos, NumberOfFrames, height * width * channels)
。
現在,如果即使這樣你仍然有內存問題,你將不得不開始使用stateful=True
層。
在這種情況下,「TimeSteps」可能會在不同的陣列中分開。訓練時,你的LSTM圖層不會認爲「這個例子已經完成」。您提供的下一批次將被視爲「繼續之前的序列」。
數據將形狀如(NumberOfVideos,ReducedNumberOfFrames, h*w)
。
在這種情況下,每次在訓練足夠的「ReducedNumberOfFrames」之後,每次完成序列時,都必須手動重置網絡狀態,使用.reset_states()。
只要你在正確的點上保持良好的訓練和.reset_states()
的控制權,你也可以通過像(ReducedNumberOfVideos,ReducedNumberOfFrames,h*w)
這樣的訓練共軛這兩個想法。