을 계산하는 방법 F1 매크로에서 Keras?

나는've 도를 사용하여 코드정에서 Keras 기 전에 그들은 그'다시 제거됩니다. 여기's 코드:

def precision(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
    precision = true_positives / (predicted_positives + K.epsilon())
    return precision

def recall(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
    recall = true_positives / (possible_positives + K.epsilon())
    return recall

def fbeta_score(y_true, y_pred, beta=1):
    if beta < 0:
        raise ValueError('The lowest choosable beta is zero (only precision).')

    # If there are no true positives, fix the F score at 0 like sklearn.
    if K.sum(K.round(K.clip(y_true, 0, 1))) == 0:
        return 0

    p = precision(y_true, y_pred)
    r = recall(y_true, y_pred)
    bb = beta ** 2
    fbeta_score = (1 + bb) * (p * r) / (bb * p + r + K.epsilon())
    return fbeta_score

def fmeasure(y_true, y_pred):
    return fbeta_score(y_true, y_pred, beta=1)

에서 무엇을 보았(i'm 는 아마추어에서),인들과 사용하여 올바른 공식입니다. 하지만 가려고 했으로 그것을 사용하는 메트릭 교육 과정에서,나는 정확히 동일한 출력 val_accuracy,val_precision,val_recall 및 val_fmeasure. 나는 그것을 믿는 그 일이 일어날 수 있는 경우에도 공식 정확하지만,저는 그것을 믿지 않습니다. 어떤 설명은 이 문제에 대한? 감사

질문에 대한 의견 (7)
해결책

이후 Keras2.0 메트릭 f1,정밀도,기억이 제거되었습니다. 이 솔루션은 사용하는 사용자 지정 메트릭 기능:

from keras import backend as K

def f1(y_true, y_pred):
    def recall(y_true, y_pred):
        """Recall metric.

        Only computes a batch-wise average of recall.

        Computes the recall, a metric for multi-label classification of
        how many relevant items are selected.
        """
        true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
        possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
        recall = true_positives / (possible_positives + K.epsilon())
        return recall

    def precision(y_true, y_pred):
        """Precision metric.

        Only computes a batch-wise average of precision.

        Computes the precision, a metric for multi-label classification of
        how many selected items are relevant.
        """
        true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
        predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
        precision = true_positives / (predicted_positives + K.epsilon())
        return precision
    precision = precision(y_true, y_pred)
    recall = recall(y_true, y_pred)
    return 2*((precision*recall)/(precision+recall+K.epsilon()))

model.compile(loss='binary_crossentropy',
          optimizer= "adam",
          metrics=[f1])

반인의 이 기능

return 2*((precision*recall)/(precision+recall+K.epsilon()))

수정된 추가 일정한 엡실론,을 피하기 위해서는 0 으로 나누. 따라서 할머니는 것이 되지 않을 계산됩니다.

해설 (12)

를 사용하여 Keras 메트릭 기능하지 않은 오른쪽을 계산하는 방법 F1 또는 AUC 또는 무언가 다음과 같다.

그 이유는 메트릭 함수가 호출에 각 배치 단계에 유효성 검사를 수행합니다. 는 방법 Keras 시스템을 계산한 평균에 배치의 결과입니다. 과하지 않는 다른 F1 점수입니다.

그 이유는 F1 점수를 얻었에서 제거 메트릭 기능에 keras. 는 여기를 참조하십시오:

-https://github.com/keras-team/keras/commit/a56b1a55182acf061b1eb2e2c86b48193a0e88f7 -https://github.com/keras-team/keras/issues/5794

을 할 올바른 방법으로 이 사용하는 사용자 정의 콜백 함수에서 방법은 다음과 같다:

-https://github.com/PhilipMay/mltb#module-keras -https://medium.com/@thongonary/how-to-compute-f1-score-for-each-epoch-in-keras-a1acd17715a2

해설 (0)

또한 건 이력

-설치keras_metrics패키지 ybubnov -화 모델입니다.맞(nb_epoch=1,...)`안에 대한 반복을 활용하는 정밀도/회수 통계 출력된 후의 모든 시대

무언가 이것을 좋아한다:

    for mini_batch in range(epochs):
        model_hist = model.fit(X_train, Y_train, batch_size=batch_size, epochs=1,
                            verbose=2, validation_data=(X_val, Y_val))

        precision = model_hist.history['val_precision'][0]
        recall = model_hist.history['val_recall'][0]
        f_score = (2.0 * precision * recall) / (precision + recall)
        print 'F1-SCORE {}'.format(f_score)
해설 (0)

무엇으로@Pedia 에서 말씀하신,위의 댓글on_epoch_end서에 명시된 바와 같이github.com/fchollet/keras/issues/5400하는 가장 좋은 방법입니다.

해설 (0)

이 스트리밍 사용자 지정 f1_score 메트릭터들을 사용하여 하위 클래스. 그것은 작품에 대한 TensorFlow2.0 베타나지 않았't 에 다른 버전입니다. 그것이 무엇's 이 그 일을 추적을 유지의 진정한 양성,예측 판정,그리고 가능한 모든 반응을 통해 전체 시대하고 다음 계산 f1 점수의 끝에서 epoch. 나는 생각한 다른 응답만을 주는 f1 대한 점수를 각각의 일괄 처리는't 이 정말 최고의 측정할 때 우리가 정말 원하 f1 점수의 모든 데이터입니다.

내가 원의 수정되지 않은 복사본을 Aurélien Geron 새로운 책을 손에서는 기계와 함께 학습 은 학&Tensorflow2.0 고 그것을 권장합니다. 이것은 어떻게 배웠는 방법을 이 f1 사용자 지정 메트릭을 사용하여 서브 클래스입니다. It's 손을 아래로 가장 포괄적인 TensorFlow 책've 이제까지 볼 수 있습니다. TensorFlow 심각하게 고통에서 엉덩이를 배우고 이 사람을 낳는 코딩 기초하여 많은 것을 배울 수 있습니다.

참고:에서 메트릭을 넣어 괄호 안에서 f1_score()또는 다른 것't work.

pip 설치 tensorflow==2.0.0beta1

from sklearn.model_selection import train_test_split
import tensorflow as tf
from tensorflow import keras
import numpy as np

def create_f1():
    def f1_function(y_true, y_pred):
        y_pred_binary = tf.where(y_pred>=0.5, 1., 0.)
        tp = tf.reduce_sum(y_true * y_pred_binary)
        predicted_positives = tf.reduce_sum(y_pred_binary)
        possible_positives = tf.reduce_sum(y_true)
        return tp, predicted_positives, possible_positives
    return f1_function

class F1_score(keras.metrics.Metric):
    def __init__(self, **kwargs):
        super().__init__(**kwargs) # handles base args (e.g., dtype)
        self.f1_function = create_f1()
        self.tp_count = self.add_weight("tp_count", initializer="zeros")
        self.all_predicted_positives = self.add_weight('all_predicted_positives', initializer='zeros')
        self.all_possible_positives = self.add_weight('all_possible_positives', initializer='zeros')

    def update_state(self, y_true, y_pred,sample_weight=None):
        tp, predicted_positives, possible_positives = self.f1_function(y_true, y_pred)
        self.tp_count.assign_add(tp)
        self.all_predicted_positives.assign_add(predicted_positives)
        self.all_possible_positives.assign_add(possible_positives)

    def result(self):
        precision = self.tp_count / self.all_predicted_positives
        recall = self.tp_count / self.all_possible_positives
        f1 = 2*(precision*recall)/(precision+recall)
        return f1

X = np.random.random(size=(1000, 10))     
Y = np.random.randint(0, 2, size=(1000,))
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)

model = keras.models.Sequential([
    keras.layers.Dense(5, input_shape=[X.shape[1], ]),
    keras.layers.Dense(1, activation='sigmoid')
])

model.compile(loss='binary_crossentropy', optimizer='SGD', metrics=[F1_score()])

history = model.fit(X_train, y_train, epochs=5, validation_data=(X_test, y_test))
해설 (0)

로@Diesche 언급하는 주요 문제에서 구현 f1_score 이 방법이라고에서 모든 일괄 처리 단계에 이르게 결과가 있습니다.더 보기

나는've 고는 약간의 시간과 함께 이 문제지만 결국 내 주위에 방법을 사용하여 문제는 callback:의 끝에서 획기적인 콜백을 예측 데이터에 대한(이 경우에는 선택을 적용하는 유효성 검사 데이터는)새로운 모델을 매개 변수와 당신에게 일관성 지표에 대한 평가의 모든 시대.

나는'm 를 사용하여 tensorflow-gpu(1.14.0)에 python3

from tensorflow.python.keras.models import Sequential, Model
from sklearn.metrics import  f1_score
from tensorflow.keras.callbacks import Callback
from tensorflow.python.keras import optimizers

optimizer = optimizers.SGD(lr=0.0001, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(optimizer=optimizer, loss="binary_crossentropy", metrics=['accuracy'])
model.summary()

class Metrics(Callback):
    def __init__(self, model, valid_data, true_outputs):
        super(Callback, self).__init__()
        self.model=model
        self.valid_data=valid_data    #the validation data I'm getting metrics on
        self.true_outputs=true_outputs    #the ground truth of my validation data
        self.steps=len(self.valid_data)

    def on_epoch_end(self, args,*kwargs):
        gen=generator(self.valid_data)     #generator yielding the validation data
        val_predict = (np.asarray(self.model.predict(gen, batch_size=1, verbose=0, steps=self.steps)))

        """
        The function from_proba_to_output is used to transform probabilities  
        into an understandable format by sklearn's f1_score function
        """
        val_predict=from_proba_to_output(val_predict, 0.5)
        _val_f1 = f1_score(self.true_outputs, val_predict)
        print ("val_f1: ", _val_f1, "   val_precision: ", _val_precision, "   _val_recall: ", _val_recall)

기능from_proba_to_output는 다음과 같습니다:

def from_proba_to_output(probabilities, threshold):
    outputs = np.copy(probabilities)
    for i in range(len(outputs)):

        if (float(outputs[i])) > threshold:
            outputs[i] = int(1)
        else:
            outputs[i] = int(0)
    return np.array(outputs)

그때 나는 기차 나 모델 참조하여 이 메트릭스에서 콜백의 일부 fit_generator. 하지 않았 세부 사항의 구현은 내 train_generator 및 valid_generator 으로 이러한 데이터는 발전기는 특정한 분류의 문제를 손에 게시하는 것만 가지고 혼란이 있습니다.

    model.fit_generator(
train_generator, epochs=nbr_epochs, verbose=1, validation_data=valid_generator, callbacks=[Metrics(model, valid_data)])
해설 (0)