簡體   English   中英

Keras 中的自定義損失函數

[英]Custom loss function in Keras

我正在研究使用 CNN 作為特征提取器和用於分類的全連接塊的圖像類增量分類器方法。

首先,我對 VGG per-trained 網絡進行了微調,以完成一項新任務。 一旦網絡針對新任務進行了訓練,我會為每個類存儲一些示例,以避免忘記何時有新類可用。

當某些類可用時,我必須計算示例的每個輸出,包括新類的示例。 現在為舊類的輸出添加零並在新類輸出上添加與每個新類相對應的標簽我有我的新標簽,即:如果 3 個新類輸入....

舊類類型輸出: [0.1, 0.05, 0.79, ..., 0 0 0]

新的類類型輸出: [0.1, 0.09, 0.3, 0.4, ..., 1 0 0] **最后的輸出對應於類。

我的問題是,如何更改自定義的損失函數以訓練新課程? 我要實現的損失函數定義為:

損失函數

其中蒸餾損失對應於舊類的輸出以避免遺忘,分類損失對應於新類。

如果您能給我提供一個代碼示例來更改 keras 中的損失函數,那就太好了。

謝謝!!!!!

您所要做的就是為此定義一個函數,使用 keras 后端函數進行計算。 該函數必須采用真實值和模型預測值。

現在,由於我不確定函數中的 g、q、x 和 y 是什么,我將在這里創建一個基本示例,而不關心它的含義或它是否是一個實際有用的函數:

import keras.backend as K

def customLoss(yTrue,yPred):
    return K.sum(K.log(yTrue) - K.log(yPred))
    

所有后端功能都可以在這里看到。

之后,使用該函數而不是常規函數編譯您的模型:

model.compile(loss=customLoss, optimizer = .....)

由於 Keras 不再是多后端(來源),自定義損失的操作應該直接在 Tensorflow 中進行,而不是使用后端。

您可以通過創建一個以y_truey_pred作為參數的函數來使用 Tensorflow 進行自定義損失,如文檔中所述:

import tensorflow as tf

x = tf.random.uniform(minval=0, maxval=1, shape=(10, 1), dtype=tf.float32)
y = tf.random.uniform(minval=0, maxval=1, shape=(10, 1), dtype=tf.float32)

def custom_mse(y_true, y_pred):
    squared_difference = tf.square(y_true - y_pred)
    return tf.reduce_mean(squared_difference, axis=-1)

custom_mse(x, y)
<tf.Tensor: shape=(10,), dtype=float32, numpy=
array([0.30084264, 0.03535452, 0.10345092, 0.28552982, 0.02426687,
       0.04410492, 0.01701574, 0.55496216, 0.74927425, 0.05747304],
      dtype=float32)>

然后你可以在model.compile()設置你的自定義損失。 這是一個完整的例子:

x = tf.random.uniform(minval=0, maxval=1, shape=(1000, 4), dtype=tf.float32)
y = tf.multiply(tf.reduce_sum(x, axis=-1), 5) # y is a function of x

model = tf.keras.Sequential([
    tf.keras.layers.Dense(16, input_shape=[4], activation='relu'),
    tf.keras.layers.Dense(32, activation='relu'),
    tf.keras.layers.Dense(1)
])

model.compile(loss=custom_mse, optimizer='adam')

history = model.fit(x, y, epochs=10)
Train on 1000 samples
Epoch 1/5
  32/1000 [..............................] - ETA: 10s - loss: 99.5402
1000/1000 [==============================] - 0s 371us/sample - loss: 105.6800
Epoch 2/5
  32/1000 [..............................] - ETA: 0s - loss: 89.2909
1000/1000 [==============================] - 0s 35us/sample - loss: 98.8208
Epoch 3/5
  32/1000 [..............................] - ETA: 0s - loss: 86.4339
1000/1000 [==============================] - 0s 34us/sample - loss: 82.7988
Epoch 4/5
  32/1000 [..............................] - ETA: 0s - loss: 75.2580
1000/1000 [==============================] - 0s 33us/sample - loss: 52.4585
Epoch 5/5
  32/1000 [..............................] - ETA: 0s - loss: 28.1625
1000/1000 [==============================] - 0s 34us/sample - loss: 17.8190

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM