在訓練模型的時候,keras提供了許多損失函式供我們使用,但是即便如此,我們也會有遇到需要用自己的損失函式的情況,這樣我們就要自定義乙個損失函式。比如我現在需要定義乙個損失函式,類似於relu函式,低於threshold的loss為0,大於threshold的loss就是他們之間的差。注意我們在定義損失函式的時候,必須可以求導。任何損失函式必須有y_true, y_pred兩個引數,他們的型別為tensor。
def
relu_loss
(y_true, y_pred, threshold =1)
:ifnot k.is_tensor(y_pred)
: y_pred = k.constant(y_pred)
y_true = k.cast(y_true, y_pred.dtype)
return k.
sum(k.cast(k.greater(k.
abs(y_pred - y_true)
, threshold)
, k.floatx())
* k.
abs(y_pred - y_true)
)
在定義完之後,我們就可以通過名字把損失函式和指標函式給模型了。
model.
compile
(optimizer=
'rmsprop'
, loss=relu_loss, metrics=
[relu_loss]
)
要注意的是,我們在重新讀取模型的時候,因為我們自定義了損失函式和指標函式,所以我們在用load_model的時候,必須通過custom_objects引數宣告這些函式名字代表了什麼。
model = load_model(
'linear.model'
, custom_objects=
)
可以看到這個損失函式在高學習率下收斂的非常快。
epoch 10/300
8/8 [******************************] - 0s 4ms/step - loss: 0.0000e+00 - relu_loss: 0.0000e+00 - val_loss: 0.0000e+00 - val_relu_loss: 0.0000e+00
以上就是如何通過keras自定義損失函式和指標函式了。 keras訓練和載入自定義的損失函式
keras 自定義loss 函式 有的時候keras 裡面提供的loss函式不能滿足我們的需求,我們就需要自己去提供loss函式,比如dice loss。dice loss 一般是dice coef 取反,因此先求dice coef import keras.backend as k def dic...
tensflow自定義損失函式
tensflow 不僅支援經典的損失函式,還可以優化任意的自定義損失函式。商品銷量時,如果 值比真實銷量大,商家損失的是生產商品的成本 如果 值比真實值小,損失的則是商品的利潤。比如如果乙個商品的成本是1元,但利潤是10元,那麼少 乙個就少賺9元 而多 乙個才虧1元,為了最大化利潤預期,需要將損失函...
tensflow自定義損失函式
tensflow 不僅支援經典的損失函式,還可以優化任意的自定義損失函式。商品銷量時,如果 值比真實銷量大,商家損失的是生產商品的成本 如果 值比真實值小,損失的則是商品的利潤。比如如果乙個商品的成本是1元,但利潤是10元,那麼少 乙個就少賺9元 而多 乙個才虧1元,為了最大化利潤預期,需要將損失函...