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

السؤال

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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...