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

المعيار CategoricalAccuracy في كيراس Keras

Chollet ML

السؤال

Recommended Posts

  • 1

تقوم هذه الدالة بحساب مدى دقة النموذج، وتستخدم مع مهام التصنيف، عندما يكون الترميز الخاص بال label هو One-Hot وترد هذه الدالة قيمة عشرية بين 0 و 1 بحيث كلما اقتربت القيمة من 1 كانت دقة النموذج أعلى. وتقوم هذه الدالة بحساب عدد المرات التي قام فيها نموذجنا بتوقع القيم بشكل صحيح (عدد مرات الإصابة في التنبؤ أو بمعنى آخر عدد مرات التطابق) وتقسمها على عدد التوقعات الكلية (الصحيحة والخاطئة أي حالات التطابق وعدم التطابق). والمثال التالي سيوضح كل شيء، حيث قمت في البداية بكتابة كود بشكل يدوي لتحقيق هذا التابع ثم استخدمت كيراس:

# تحميل المكتبات
import numpy
import tensorflow as tf
#One-Hot تشكيل مصفوفتين واحدة للقيم الحقيقية مرمزة بترميز 
label = numpy.array([[0,0,0,1,0],[0,0,1,0,0],[0,0,1,0,0],[0,1,0,0,0]]) 
# الثانية تمثل القيم المتوقعة
Pred = numpy.array([[0,0.2,0,1,0],[0,0.3,0,1,0],[0.12,0.2,0.6,0.7,0.1],
                  [0.6,0.9,0,0,0]]) 
#argmax() استخدام تابع لامدا لتحديد الفهرس الذي يملك أعلى قيمة باستخدام التابع 
max = lambda x : numpy.argmax(x)
# باستخدام التابع الذي قمنا بتعريفه سنقوم بتشكيل قائمتين لكل من القيم المتوقعة والحقيقية، تحوي فهارس القيم (الفهرس الذي يقابل أعلى قيمة) لكي نستخدمها في عملية المقارنة
# مثال: [0,0,0,1,0]-->3
labelMax = numpy.array([max(n) for n in label])
print("labelMax: ",labelMax,sep="\n") # [3 2 2 1]
PredMax = numpy.array([max(n) for n in Pred])
print("PredMax: ",PredMax,sep="\n") # [3 3 3 1]
# عدد التوقعات الصحيحة
print("accurately predicted: ",sum(labelMax == PredMax))
# Categorical Accuracy: عدد حالات التطابق على العدد الكلي للتوقعات
CAccuracy = sum(PredMax == labelMax)/len(PredMax)
print("Categorical Accuracy: ",CAccuracy)
# حسابها باستخدام كيراس
metric = tf.keras.metrics.CategoricalAccuracy()
metric.update_state(label,Pred)
metric.result().numpy()
"""
labelMax: 
[3 2 2 1]
PredMax: 
[3 3 3 1]
accurately predicted:  2
Categorical Accuracy:  0.5  <==>50%
0.5 <==>50%
"""

هذه الدالة لها الشكل التالي في كيراس:

tf.keras.metrics.CategoricalAccuracy(name="categorical_accuracy", dtype=None)

ويمكننا استخدامها في نماذجنا مع الدالة compile كالتالي:

model.compile(
  ...
  metrics=[tf.keras.metrics.CategoricalAccuracy()])
# أو من واجهة كيراس مباشرةً
import keras
model.compile(
  ...
  metrics=[keras.metrics.CategoricalAccuracy()])
# أو بالشكل التالي
model.compile(
  ...
  metrics=["CategoricalAccuracy"])

انظر للمثال التالي، حيث سأستخدمها مع مسألة تصنيف متعدد:

from keras.datasets import reuters
(train_data, train_labels), (test_data, test_labels) = reuters.load_data(
num_words=10000)
import numpy as np
def vectorize_sequences(sequences, dimension=10000):
  results = np.zeros((len(sequences), dimension))
  for i, sequence in enumerate(sequences):
   results[i, sequence] = 1.
  return results
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)
from keras.utils.np_utils import to_categorical
one_hot_train_labels = to_categorical(train_labels)
one_hot_test_labels = to_categorical(test_labels)
x_val = x_train[:1000]
partial_x_train = x_train[1000:]
y_val = one_hot_train_labels[:1000]
partial_y_train = one_hot_train_labels[1000:]
# بناءالنموذج
from keras.datasets import reuters
(train_data, train_labels), (test_data, test_labels) = reuters.load_data(
num_words=10000)
# تررميز البيانات
import numpy as np
def vectorize_sequences(sequences, dimension=10000):
  results = np.zeros((len(sequences), dimension))
  for i, sequence in enumerate(sequences):
   results[i, sequence] = 1.
  return results
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)
from keras.utils.np_utils import to_categorical
one_hot_train_labels = to_categorical(train_labels)
one_hot_test_labels = to_categorical(test_labels)
x_val = x_train[:1000]
partial_x_train = x_train[1000:]
y_val = one_hot_train_labels[:1000]
partial_y_train = one_hot_train_labels[1000:]
# بناء النموذج
from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(46, activation='softmax'))
# التجميع
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['CategoricalAccuracy'])
# التدريب
history = model.fit(partial_x_train,
partial_y_train,
epochs=6,
batch_size=512,
validation_data=(x_val, y_val))
"""
Epoch 1/6
16/16 [==============================] - 2s 75ms/step - loss: 3.0325 - categorical_accuracy: 0.4249 - val_loss: 1.6946 - val_categorical_accuracy: 0.6590
Epoch 2/6
16/16 [==============================] - 1s 51ms/step - loss: 1.4645 - categorical_accuracy: 0.6999 - val_loss: 1.3093 - val_categorical_accuracy: 0.7150
Epoch 3/6
16/16 [==============================] - 1s 53ms/step - loss: 1.0611 - categorical_accuracy: 0.7740 - val_loss: 1.1516 - val_categorical_accuracy: 0.7480
Epoch 4/6
16/16 [==============================] - 1s 53ms/step - loss: 0.8315 - categorical_accuracy: 0.8172 - val_loss: 1.0494 - val_categorical_accuracy: 0.7790
Epoch 5/6
16/16 [==============================] - 1s 53ms/step - loss: 0.6774 - categorical_accuracy: 0.8535 - val_loss: 0.9816 - val_categorical_accuracy: 0.7860
Epoch 6/6
16/16 [==============================] - 1s 51ms/step - loss: 0.5694 - categorical_accuracy: 0.8753 - val_loss: 0.9275 - val_categorical_accuracy: 0.8000


"""

 

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

  • 1

CategoricalAccuracy تعني أنها تقوم بحساب الدقة الخاصة بالتصنيفات category لكل عنصر.بمعني أوضح أنه لو ان البيانات تحتوي على قطط وكلاب، فستقوم بحساب الدقة عن حساب عدد المرات الصائبة في تخمين صور الكلاب وعدد المرات الصائبة في تخمين صور القطط.

لكن من أجل فعل ذلك، يجب أن تكون العلامات الخاصة بالصور labels أما 0 أو 1، أي يعني انه اما ان تكون كلبا او قطة، ولعمل ذلك يجب أن نستخدم one hot encoder >

ولحساب النسبة فتقوم بقسمة علدد المرات الصواب على العدد الكلي للبيانات.

وتوجد في keras على الصورة التالية:

tf.keras.metrics.categorical_accuracy(
    y_true, y_pred
)

ويمكن توضيح استخدامها كالتالي:

y_true = [[0, 0, 1], [0, 1, 0]]
y_pred = [[0.1, 0.9, 0.8], [0.05, 0.95, 0]]
m = tf.keras.metrics.categorical_accuracy(y_true, y_pred)
assert m.shape == (2,)
m.numpy()

ولاستخدامها في عملية التعلم يجب اولا تحويل شكل البيانات ل one hot

from keras.utils.np_utils import to_categorical
one_hot_train_labels = to_categorical(train_labels)
one_hot_test_labels = to_categorical(test_labels)

ثم تحديدها في اخر خطوة كالتالي:

model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['CategoricalAccuracy'])

 

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...