1.自定義層
對於簡單、無狀態的自定義操作,你也許可以通過 layers.core.Lambda
層來實現。但是對於那些包含了可訓練權重的自定義層,你應該自己實現這種層。
這是一個 Keras2.0 中,Keras 層的骨架(如果你用的是舊的版本,請更新到新版)。你只需要實現三個方法即可:
build(input_shape)
: 這是你定義權重的地方。這個方法必須設self.built = True
,可以通過調用super([Layer], self).build()
完成。call(x)
: 這里是編寫層的功能邏輯的地方。你只需要關注傳入call
的第一個參數:輸入張量,除非你希望你的層支持masking。compute_output_shape(input_shape)
: 如果你的層更改了輸入張量的形狀,你應該在這里定義形狀變化的邏輯,這讓Keras能夠自動推斷各層的形狀。
還可以定義具有多個輸入張量和多個輸出張量的 Keras 層。 為此,你應該假設方法 build(input_shape)
,call(x)
和 compute_output_shape(input_shape)
的輸入輸出都是列表。 這里是一個例子,與上面那個相似:
已有的 Keras 層就是實現任何層的很好例子。不要猶豫閱讀源碼!
2.自定義評價函數
自定義評價函數應該在編譯的時候(compile)傳遞進去。該函數需要以 (y_true, y_pred)
作為輸入參數,並返回一個張量作為輸出結果。
3.自定義損失函數
自定義損失函數也應該在編譯的時候(compile)傳遞進去。該函數需要以 (y_true, y_pred)
作為輸入參數,並返回一個張量作為輸出結果。
4.處理已保存模型中的自定義層(或其他自定義對象)
如果要加載的模型包含自定義層或其他自定義類或函數,則可以通過 custom_objects
參數將它們傳遞給加載機制:
或者,你可以使用 自定義對象作用域: