2016-11-25 86 views
3

我想創建一個自定義目標函數來訓練Keras深層網絡。我正在研究不平衡數據的分類,我在scikit-learn中使用了很多F1分數。因此,我不得不顛倒F1度量的想法(1 - F1分)使用它作爲損失函數/目標爲Keras減少而訓練:Keras自定義目標需要張量評估

(from sklearn.metric import f1_score) 

def F1Loss(y_true, y_pred): 

    return 1. - f1_score(y_true, y_pred) 

然而,從scikit學習這種f1_score方法需要numpy的數組或列表來計算F1分數。我發現張量需要使用.eval()對他們的numpy陣列對應物進行評估,這需要一個TensorFlow會話來執行此任務。

我不知道Keras使用的會話對象。我已經嘗試使用下面的代碼,假設Keras後端在某個地方定義了自己的會話對象,但這也不起作用。

from keras import backend as K 

K.eval(y_true) 

不可否認,這是一個在黑暗中拍攝,因爲我真的不明白Keras的更深層次的運作或Tensorflow一個時刻。

我的問題是:我如何評價y_truey_pred張量到他們的numpy數組對應?

回答

2

你的問題是一個經典的問題,實現在Theano一個不連續的目標。這是兩個原因不可能怎麼一回事,因爲:

  1. F1-分數是不連續的:here您可以讀到應該在神經網絡訓練的目標函數可以預期的。 F1分數不符合這個條件 - 所以它不能用來訓練神經網絡。
  2. Tensor和Numpy數組之間沒有等價關係:這是一個基本問題。 Theano張量像x在學校方程式。你不能期望代數變量與它可以分配到的任何對象相當。另一方面 - 作爲計算圖的一部分 - 應該提供張量運算來計算目標。如果沒有 - 你不能區分它。參數是什麼使得大多數常規的神經網絡訓練方法不可能。
+0

這非常有幫助!我自己也不會想到這些問題。謝謝。我會尋找另一種解決方案。 – TBZ92

0

如果你已經預測和numpy的陣列格式實際張量那麼我想你可以使用此代碼段:

correct_prediction = tf.equal(tf.argmax(actual_tensor,1), tf.argmax(predicted_tensor,1)) 

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

而在keras,我認爲你可以使用這個:

model.fit_generator(train_generator, validation_data=val_generator, nb_val_samples=X_val.shape[0], 
         samples_per_epoch=X_train.shape[0], nb_epoch=nb_epoch, verbose=1, 
         callbacks=[model_checkpoint, reduce_lr, tb], max_q_size=1000) 

train_generator和val_generator在培訓期間生成培訓和驗證數據,同時還打印培訓時的損失和準確性。

希望這有助於...

+0

也許我誤解了你的答案,但我沒有他們在numpy數組格式。我實際上正在尋找一種將張量'y_true'和'y_pred'轉換爲numpy數組的方法。我希望它們是numpy數組格式,所以我可以將它們送入F1函數,它只是返回一個標量數字。 – TBZ92

+0

通過.eval()方法返回的對象在numpy數組中,請檢查:http:// stackoverflow。com/questions/34097281/how-can-i-convert-a-tensor-into-a-numpy-array-tensorflow – sansingh

+0

是的,我知道。這就是爲什麼我明確表示我已經在描述我的問題時嘗試了這一點。它沒有一個會話對象,但我不知道什麼會話對象Keras默認使用。但是,正如上面的答案所述,使用F1度量標準不是一種數學上有效的方法,所以我將嘗試一種不同的方法。 – TBZ92