나는'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. 나는 그것을 믿는 그 일이 일어날 수 있는 경우에도 공식 정확하지만,저는 그것을 믿지 않습니다. 어떤 설명은 이 문제에 대한? 감사
이후 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 으로 나누. 따라서 할머니는 것이 되지 않을 계산됩니다.
를 사용하여 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
또한 건 이력
-설치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)
무엇으로@Pedia 에서 말씀하신,위의 댓글on_epoch_end
서에 명시된 바와 같이github.com/fchollet/keras/issues/5400하는 가장 좋은 방법입니다.
이 스트리밍 사용자 지정 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))
로@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)])