keras 編寫自己的Layer

2021-09-08 07:34:15 字數 1496 閱讀 8689

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)究竟是什麼?

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官方文件

keras 高階技巧 重寫Layer

在使用keras快速建模時,會遇到現有的庫無法實現,需要自己做一些定製,有兩種方式 不涉及引數weights的優化訓練,可以使用keras.layers.lambda 使用類支出keras.layers.layer 使用lambda from keras.models import sequenti...

caffe中增加自己的layer

假設新增加的層命名為 new 1.在src proto的layerparameter 的 layertype下 加 new 數字 2.在src layer factory.cpp中,加 case layerparameter layertype new return new newlayer par...

利用Keras進行網路編寫

一.使用keras.model中的model.sequential 二.使用類建立模型 以下是乙個自編碼器的例子 from keras.layers import lambda,input,dense,lstm,repeatvector,timedistributed import keras fr...