keras 編寫自己的Layer

1. Layer重寫的基本思路?

Keras層的骨架。只需要實現三個方法即可:

build(input_shape): 這是你定義權重的地方。這個方法必須設self.built = True,可以通過調用super([Layer], self).build()完成。build,這個函數用來確立這個層都有哪些參數,哪些參數是可訓練的哪些參數是不可訓練的。

call(x): 這裏是編寫層的功能邏輯的地方。你只需要關注傳入call的第一個參數:輸入張量,除非你希望你的層支持masking。這個函數在調用層對象時自動使用,裏面就是該層的計算邏輯,或計算圖了。顯然,這個層的核心應該是一段符號式的輸入張量到輸出張量的計算過程。

compute_output_shape(input_shape): 如果你的層更改了輸入張量的形狀,你應該在這裏定義形狀變化的邏輯,這讓Keras能夠自動推斷各層的形狀。

 

2. 在重寫layer的時候是否需要考慮batchsize?

Keras的Layer就是一個Tensor到Tensor的映射

自定義層,只要不是輸入層,都不用考慮batch,因爲batch是從前面傳進來的,自己只是在原來的基礎上增加一個後續操作。個人感覺這樣導致靈活性變差。

 

3. Build的輸入input_shape究竟是什麼?

Keras的所有的層有一個「input_shape」的參數,用來指定輸入張量的shape。然而這

個input_shape,或者有時候是input_dim,只需要在模型的首層加以指定。一旦模型的首層的input_shape指定了,後面的各層就不用再指定,而會根據計算圖自動推斷。這個功能稱爲shape的自動推斷。

 

4. Call 的輸入input、state(RNN)究竟是什麼?

計算圖中上一層中的返回值,因RNN中循環結構,同一層中下一個cell的x就是上一個call的return值???此處不明白

def call(self,x):
 
     return K.dot(x,self.kernel)

5. 如果該層輸入和輸出Tensor的shape不一致怎麼辦?

get_output_shape_for:如果你的層計算後,輸入張量和輸出張量的shape不一致,那麼你需要把這個函數也重新寫一下,返回輸出張量的shape,以保證Keras可以進行shape的自動推斷。如果你的網絡層改變了輸入張量的shape,就應該複寫get_output_shape_for這個函數,以使後面的層能知道本層輸出的shape。

在所有的Keras中都有這樣一個函數,因此後面的層可以通過查看這個函數的返回值獲取前層的輸入shape,並通過自己的get_output_shape_for將這個信息傳遞下去。然而,有時候,這個自動推斷會出錯。這種情況發生在一個RNN層後面接Flatten然後又接Dense的時候,這個時候Dense的output_shape無法自動推斷出。這時需要指定RNN的輸入序列長度input_length,或者在網絡的第一層通過input_shape就指定。這種情況極少見,大致有個印象即可,遇到的話知道大概是哪裏出了問題就好。


6. 示例:


參考: keras官方文檔

    https://zhuanlan.zhihu.com/p/22129301