有時候,我們需要往模型裡面新增一些自定義的loss。
這些自定義的loss主要分為兩大類:
loss是基於樣本的正確標籤 yre
aly_yr
eal
和**的logit ypr
edy_yp
red
計算得到。這種loss主要集中在對分類損失的改進上,例如focal loss等。
loss需要模型的中間層資訊參與運算。這種loss常見的就是對權重的正則化項,高階一點還有對抗機器學習裡面的fgsm的對抗學習正則化項。
其中,第一類loss可以通過自定義loss函式,或者loss類,然後在模型compile的時候指定損失就可以了。
第二類loss則不能通過模型compile()函式來指定,而需要呼叫add_loss()
函式來指定。
第一類loss必須能夠通過yre
aly_yr
eal
和 ypre
dy_ypred
,以及某些額外的超引數得到計算得到。
這種函式的輸入是兩個引數yre
aly_yr
eal
和 ypre
dy_ypred
, 輸出是乙個tensor,tensor的必須得是對每個樣本都輸出乙個值。
定義好之後,在model的compile裡面指定就是了。
例如:
alpha1=
0.2alpha2=
0.5def
custom_loss_function
(y_true, y_pred)
: squared_difference = tf.square(y_true - y_pred)
##如果計算過程需要用上超引數,則先在全域性作用域定義超引數,然後在函式裡面直接使用這些超引數。
return tf.reduce_mean(squared_difference, axis=-1
)model.
compile
(optimizer=
'adam'
, loss=custom_loss_function)
再比如 focal loss的定義:
其中γ
\gamma
γ 是乙個超引數,用於調和loss,我們可以在實現的時候把它定義為乙個全域性的引數,然後再函式裡面使用它就可以了。
第二類loss則是需要神經網路本身參與計算,例如l2正則化啥的。
這類loss的定義,一般是在網路搭建的後面,因為這些loss的計算能夠方便的訪問到中間層的輸出或權重。
這種loss沒有像第一類loss一樣有輸入輸出的約定,loss一般就是用某個函式封裝的任意計算圖。
定義好loss之後,把呼叫模型的add_loss
函式把這部分計算圖加到模型即可。
compile裡面指定的loss和add_loss指定的loss的關係:
在keras的model.compile函式原始碼中可以看到如下的**:
with k.name_scope(
'loss'):
for i in
range
(len
(self.outputs)):
if i in skip_target_indices:
continue
y_true = self.targets[i]
y_pred = self.outputs[i]
weighted_loss = weighted_losses[i]
sample_weight = sample_weights[i]
mask = masks[i]
loss_weight = loss_weights_list[i]
with k.name_scope(self.output_names[i]
+'_loss'):
output_loss = weighted_loss(y_true, y_pred,
sample_weight, mask)
iflen
(self.outputs)
>1:
+'_loss'
)if total_loss is
none
: total_loss = loss_weight * output_loss
else
: total_loss += loss_weight * output_loss
if total_loss is
none:if
not self.losses:
raise valueerror(
'the model cannot be compiled '
'because it has no loss to optimize.'
)else
: total_loss =0.
# add regularization penalties
# and other layer-specific losses.
for loss_tensor in self.losses:
total_loss += loss_tensor
前面是計算compile裡面指定的loss,然後再把self.losses
裡面損失加起來。
而self.losses
就是模型(包括它使用到所有層)通過add_loss
函式新增的損失。
Keras 自定義層
keras自定義或者重寫層,需要實現三個方法 問題 參考 keras 自定義層 最後舉乙個conditional layer normalization的例子 基於conditional layer normalization的條件文字生成 自定義層需要實現三個方法 class layernorma...
keras自定義層
keras學習筆記 二 keras實現自定義層 例1,參考博文1中的自定義層attentiondecoder。def build self,input shape for model details that correspond to the matrices here.self.batch si...
Keras 中自定義層
keras中自定義層非常普遍。對於簡單,無狀態的自定義操作,可以通過 layers.core.lambda層來實現。對於包含了可訓練權重的自定義層,就需要自己手動去實現。需要實現三個方法 build input shape 定義權重,這個方法必須設 self.built true,可以通過呼叫 su...