Keras 新增自定義Losses

2021-10-14 11:21:07 字數 2953 閱讀 9543

有時候,我們需要往模型裡面新增一些自定義的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...