• 0

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

قمت ببناء نموذج، وأريد حساب precision وال recall خلال عملية التدريب، كيف يمكنني القيام بذلك؟
 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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
1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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)

 

انشر على الشّبكات الاجتماعية


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

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن