2016-11-25 3 views
3

Keras 딥넷을 교육하기 위해 사용자 지정 목적 함수를 만들고 싶습니다. 저는 불균형 한 데이터의 분류를 연구하고 있으며, scikit-learn에서 F1 점수를 많이 사용합니다. 그러나Keras 사용자 지정 목표는 Tensor 평가가 필요합니다.

(from sklearn.metric import f1_score) 

def F1Loss(y_true, y_pred): 

    return 1. - f1_score(y_true, y_pred) 

, scikit 배우기에서이 f1_score 방법 NumPy와이 필요합니다 Keras는 동안 훈련을 최소화하기 위해 손실 함수/목적으로 사용하기 - (F1 점수 1) 그래서 저는 F1 메트릭을 반전의 생각을했다 배열 또는 목록을 사용하여 F1 점수를 계산합니다. 나는 Tensors가 .eval()을 사용하여 그들의 numpy 배열 대응 물에 평가 될 필요가 있다는 것을 발견했다.이 작업을 수행하려면 TensorFlow 세션이 필요하다.

Keras에서 사용하는 세션 개체를 알 수 없습니다. 나는 Keras 백엔드가 어딘가에 정의 된 자체 세션 객체를 가지고 있다고 가정하고 아래의 코드를 사용해 보았지만 이것도 작동하지 않았다. 정말 깊은 Keras의 동작 또는 Tensorflow 상기 순간을 이해하지 않기 때문에

from keras import backend as K 

K.eval(y_true) 

가 인정 하듯이,이 어둠 속에서 촬영했다.

내 질문은 : numpy 배열 대응 물에 y_truey_pred 텐서를 어떻게 평가합니까?

답변

2

귀하의 문제는 Theano에서 discontinous 목표를 구현하는 고전적인 문제이다. 그것은 두 가지 이유가 불가 beacuse이다 :

  1. F1-점수는 discontinous입니다 :here 당신이 신경망 훈련의 목적 함수에서 기대해야 무엇을 읽을 수 있습니다. F1 점수는이 조건을 충족시키지 않으므로 신경망을 학습하는 데 사용할 수 없습니다.
  2. Tensor와 Numpy 배열 간에는 동일한 내용이 없습니다. 그것은 근본적인 문제입니다. Theano tensor는 012 방정식에서 x과 같습니다. 대수 변수를 할당 할 수있는 객체는 대수 변수에서 기대할 수 없습니다. 반면에 - 전산 그래프의 일부로 - 목적을 계산하기 위해 텐서 연산이 제공되어야합니다. 그렇지 않다면 당신은 그것을 차별화 할 수 없습니다. 매개 변수는 신경 네트워크의 일반적인 훈련 방법의 대부분을 불가능하게합니다.
+0

이것은 매우 도움이되었습니다! 나는이 점들을 나 자신으로 생각하지 않았을 것이다. 고맙습니다. 나는 또 다른 해결책을 모색 할 것이다. – TBZ92

0

당신은 예측하고 NumPy와 배열 형식으로 실제 텐서는 당신이 코드를 사용할 수있는 것 같아요 경우

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) 
:
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에서

, 나는 당신이 사용할 수 있다고 생각합니다

train_generator 및 val_generator는 교육하는 동안 교육 및 유효성 검사 데이터를 생성하며 교육 도중 손실 및 정확성을 인쇄합니다. 이 도움이

희망 ...

+0

어쩌면 당신의 대답을 오해하고 있습니다. 그러나 나는 그들을 numpy 배열 형식으로 가지고 있지 않습니다. 나는 실제로 텐서'y_true'와'y_pred'를 numpy 배열로 변환하는 방법을 찾고 있습니다. 난 numpy 배열 형식으로 그들을 원할 수 있도록 F1 함수로, 단순히 스칼라 숫자를 반환 할 수 있습니다. – TBZ92

+0

.eval() 메서드로 반환되는 객체는 numpy 배열로되어 있습니다. http : // stackoverflow를 확인하십시오.질문/34097281/변환 할 수있는 방법 - tensor - into - numpy - 배열 in - tensorflow – sansingh

+0

네, 알아요. 그래서 나는 분명히 내 질문에 대한 설명에서 이것을 시도했다. 세션 객체 없이는 작동하지 않으며 Keras가 기본적으로 사용하는 세션 객체를 모르겠습니다. 그러나 위의 대답에서 설명한 것처럼 F1 측정 항목을 사용하는 것은 수학적으로 유효한 방법이 아닙니다. 따라서 다른 방법을 시도 할 것입니다. – TBZ92