اذهب إلى المحتوى
  • 0

حساب ال precision وال recall للنموذج في كيراس Keras

Chollet ML

السؤال

Recommended Posts

  • 1

إذا كنت تستخدم واجهة  Keras المنفصلة، يجب عليك تحميل الحزمة التالية وذلك في حال كانت النسخة الخاصة بك أقل من 2.3:

pip install keras-metrics

ثم بعد ذلك يمكنك استخدام هذه المعايير من هذه الحزمة كالتالي:

import keras_metrics
model.compile(
      ...
      metrics=[keras_metrics.precision(), keras_metrics.recall()])

إذا كنت تستخدم نسخة كيراس الأحدث فيمكنك القيام بذلك من خلال الموديول keras.metrics:

model.compile(
		 ...
         metrics=[keras.metrics.Precision(), keras.metrics.Recall()])

أما إذا كنت تستخدم النسخة المدمجة مع تنسرفلو، فيمكنك القيام بذلك بشكل مباشر من خلال الموديول tf.keras.metrics:

import tensorflow as tf
model.compile(
      ...
      metrics=[tf.keras.metrics.Precision(), tf.keras.metrics.Recall()])

أمثلة:

m = tf.keras.metrics.Precision()
m.update_state([0, 1, 1, 1], [1, 0, 1, 1])
m.result().numpy()
#0.6667
m.reset_state()
m.update_state([0, 1, 1, 1], [0, 1, 1, 1])
m.result().numpy()
#1.0
m = tf.keras.metrics.Recall()
m.reset_state()
m.update_state([0, 1, 1, 1], [0, 1, 1, 1])
m.result().numpy()
#1.0

التطبيق على نموذج:

from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
from keras.datasets import mnist
import keras
import tensorflow as tf
from tensorflow.keras.utils import to_categorical
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
model.compile(optimizer='rmsprop',
loss="CategoricalCrossentropy",
metrics=[tf.keras.metrics.Precision(), tf.keras.metrics.Recall()])
model.fit(train_images, train_labels, epochs=2, batch_size=512)
----------------------------------------------------------------------------------------
Epoch 1/2
118/118 [==============================] - 46s 374ms/step - loss: 0.9313 - precision_5: 0.7849 - recall_4: 0.3362
Epoch 2/2
118/118 [==============================] - 44s 375ms/step - loss: 0.1283 - precision_5: 0.9423 - recall_4: 0.8137

<keras.callbacks.History at 0x7f5e17641950>

ولحسابهم على بيانات الاختبار:

from keras import backend as K
def recall(y_true, y_pred):
    tp = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    p = K.sum(K.round(K.clip(y_true, 0, 1)))
    result = tp / (p + K.epsilon())
    return result.numpy()
def precision(y_true, y_pred):
    tp = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    p = K.sum(K.round(K.clip(y_pred, 0, 1)))
    result = tp / (p + K.epsilon())
    return result.numpy()

e=precision_m(train_labels,model.predict(train_images))

 

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

في نسخ keras 2 او اقل، لا توجد تلك الدوال بداخل keras ، لذا اذا اردت استخدمها عليك تعريفها بنفسك كالتالي:

from keras import backend as K

def recall_m(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 precision_m(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 f1_m(y_true, y_pred):
    precision = precision_m(y_true, y_pred)
    recall = recall_m(y_true, y_pred)
    return 2*((precision*recall)/(precision+recall+K.epsilon()))

# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc',f1_m,precision_m, recall_m])

# fit the model
history = model.fit(Xtrain, ytrain, validation_split=0.3, epochs=10, verbose=0)

# evaluate the model
loss, accuracy, f1_score, precision, recall = model.evaluate(Xtest, ytest, verbose=0)

اما في النسخ الحديثة، يمكنك استدعائها مباشرة من keras، اما  باظهار كافة طرق التقييم في report كالتالي:

from sklearn.metrics import classification_report

y_pred = model.predict(x_test, batch_size=64, verbose=1)
y_pred_bool = np.argmax(y_pred, axis=1)

print(classification_report(y_test, y_pred_bool))

وتكون النتيجة كالتالي:

             precision  recall   f1-score    support

 class 0       0.50      1.00      0.67         1
 class 1       0.00      0.00      0.00         1
 class 2       1.00      0.67      0.80         3

أو استخدام بعض القياسات التي تريدها فقط كالتالي:

import tensorflow as tf
model.compile(
      ...
      metrics=[tf.keras.metrics.Precision(), tf.keras.metrics.Recall()])

ويمكنك استخدامها اثناء التدريب كالتالي:

model.compile(optimizer='rmsprop',
loss="CategoricalCrossentropy",
metrics=[tf.keras.metrics.Precision(), tf.keras.metrics.Recall()])
model.fit(train_x, train_y, epochs=100, batch_size=128)

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...