1. 程式人生 > 程式設計 >keras 多工多loss例項

keras 多工多loss例項

記錄一下:

# Three loss functions
category_predict1 = Dense(100,activation='softmax',name='ctg_out_1')(
  Dropout(0.5)(feature1)
)
category_predict2 = Dense(100,name='ctg_out_2')(
  Dropout(0.5)(feature2)
)
dis = Lambda(eucl_dist,name='square')([feature1,feature2])
judge = Dense(2,name='bin_out')(dis)
model = Model(inputs=[img1,img2],outputs=[category_predict1,category_predict2,judge])
model.compile(optimizer=SGD(lr=0.0001,momentum=0.9),loss={
         'ctg_out_1': 'categorical_crossentropy','ctg_out_2': 'categorical_crossentropy','bin_out': 'categorical_crossentropy'},loss_weights={
         'ctg_out_1': 1.,'ctg_out_2': 1.,'bin_out': 0.5
       },metrics=['accuracy'])

補充知識:多分類loss函式本質理解

一、面對一個多分類問題,如何設計合理的損失函式呢?

1、損失函式的本質在數學上稱為目標函式;這個目標函式的目標值符合最完美的需求;損失函式的目標值肯定是0,完美分類的損失必然為0 ;

2、損失函式分為兩部分,一部分為正確的分類,一部分為錯誤的分類;保留其中任何一個部分都可以達到目標;就好比兩條路都可以通向羅馬;都可以通過轉化均可以令損失函式的最小值為0時,為目標值;(當然最小值不一定要為0 );最關鍵是最小化方向是通向目標值的;

3、多分類問題涉及概率問題,目標函式中設計只保留正確的部分(為什麼不保留錯誤部分,我想都可以達到目的,這裡保留正確部分,計算更方便);用極值思維想象完美分類情況下,輸出的正確類別的概率必然是1,所以損失函式loss=-1/n(Px1+Px2+Px3+……);Px1代表樣本x為x1的情況下,輸出樣本類別相同的概率;最好的情況就是p值都為1;損失值為0 ,可loss函式為-1;如何設計才能等效呢?答案就是加log函式;Loss=-1/n(logPx1+logPx2+logPx3+……);目標函式最小值就是0;

二、 如何在損失函式中只保留正確的部分呢?

1、從逆向的角度而言,錯誤部分的前面加個係數0,正確部分為1;從簡單開始做起,比如說01分類,y*(logPy=1)+(1-y)*(logPy=0); y為樣本真實分類;這個就能儲存了;y=1時,就保留了第一部分,y=0時就保留了第二部分;但當將01分類擴充套件成三分類甚至多分類時,這種情況就不能夠適應了;這是因為沒有明白本質問題;

2、可以將真實樣本標籤輸出轉化成概率值;只是正確的概率值為1,其他類別概率為0;這樣就可以完美解決多分類的問題;就是說每一個模型輸出類別Log概率前乘以一個概率值; keras 多工多loss例項 這個公式裡面的P值全為1;為0的忽略掉了;

三、如何優化呢?

1、模型輸出的概率值轉化為一個h(x)的函式;通過改變函式內部的w值來達到最小值;也許達不到0值;這個跟函式的Power(擬合能力)有關;

四、cross-entropy loss公式怎麼寫呢?

keras 多工多loss例項 Y代表樣本的one-hot向量;yhat代表softmax輸出的向量

以上這篇keras 多工多loss例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。