關於Keras中函數式編程的建模方式其代碼編寫形式的理解

學習筆記:

在剛開始接觸Keras中神經網絡模型的函數式編程建模方式時有一點點不太理解,例如下面代碼段中的第二句代碼。

input = Input(shape=(config.lag, 5))
lstm = LSTM(config.units_num, input_shape=(config.lag, 5), return_sequences=True)(input)

在初步瞭解了Keras中模型的函數式編程建模方式後,我們可以知道,這兩句代碼的含義是首先創建一個模型的輸入層(input)對應於代碼段中的第一句代碼,然後將這個輸入層傳入給LSTM層(lstm),作爲LSTM層的輸入層,對應於代碼段中的第二句代碼。

我的疑問是LSTM(config.units_num, input_shape=(config.lag, 5), return_sequences=True),這句代碼應該會返回一個LSTM類的對象,那麼直接使用對象+()即後面跟着的(input)的方式就可以完成將input設置爲LSTM層的輸入層這樣一個任務嗎,其實現的原理是什麼呢。

在查閱了一些資料後發現,對於python語言而言,使用類對象+()的方式會自動調用類中的__call__()方法。這樣的操作相當於把類對象當作函數在調用它,故當程序運行到LSTM(...)(input)這行代碼時,實際上就完成了兩個操作:第一:創建了一個LSTM類對象,第二:將input對象作爲形參傳入到LSTM類對象的__call__(self,inputs,...[該方法有很多參數,就不一一寫出了])方法中,並調用該方法,完成LSTM層的創建。

至此Keras中函數式編程建模代碼之所以可以這樣寫,我們已經瞭解清楚了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章