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

ال Categorical Crossentropy في Kears وكيف يتم استخدامها

Meezo ML

السؤال

Recommended Posts

  • 1

هي دالة تكلفة (loss) في كيراس وتنسرفلو ويتم استخدامها مع مسائل التصنيف المتعدد أي عندما يكون لدينا أكثر من فئة (Class label)
الصيغة الرياضية:

60dc80db0c959_crossentropy.png.70d9982d48aafd760d7f1ec55d9144ef.png
تعتمد هذه الدالة على المفهوم الشهير في نظرية المعلومات والمعروف ب Cross Entropy أو الإنتروبيا المتقطعة، وهي مقياس لمدى تشابه توزعين احتماليين مختلفين لنفس الحدث وفي ال ML نستخدم هذا التعريف وقانونه لكي نقوم بحساب ال Loss (التكلفة Cost). حيث يكون الخرج الخاص بالشبكة العصبية هو توزيع احتمالي لعدة فئات classes.
تابع التنشيط هنا إما Sigmoid أو Softmax فهما تابعي التنشيط الوحيدين المتوافقين مع دالة التكلفة CCE.
كنصيحة لنتائج أفضل دوماً اعتمد على ال Softmax.
عند استخدامك لهذه الوظيفة يجب عليك أن تقوم أولاً بترميز فئات البيانات لديك باستخدام الترميز One-Hot.
يتم استيرادها من الموديول:

tensorflow.keras.losses

مثال:

from tensorflow.keras.losses import CategoricalCrossentropy
# إنشاء داتا مزيفة لنجرب عليها
# قمنا بتشكيل عينتين ولدينا 3 فئات
y_true = [[0, 1, 0], [1, 0, 1]] #تمثل القيم الحقيقية One-Hot مصفوفة من ال
y_pred = [[0.01, 0.9, 0], [0.77, 0.6, 0.8]] # مصفوفة القيم المتوقعة
# CategoricalCrossentropy إنشاء غرض 
cce =CategoricalCrossentropy() 
# حساب الخسارة
cce(y_true, y_pred).numpy() # 1.0225062

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

# كالتالي compile لاستخدامه مع النموذج نقوم بتمريره إلى
# نقوم أولاً باستيرادها
model.compile(
  loss=tf.keras.losses.CategoricalCrossentropy(),
  ...
)
# أو يمكن تمريرها بسهولة بالشكل التالي
model.compile(
     loss='categorical_crossentropy',
     ...
)

سأقوم بتطبيقها مع مجموعة بيانات routers، حيث أن هذه البيانات لديها 46 فئة (صنف) مختلف:

# تحميل الداتا
from keras.datasets import reuters
(train_data, train_labels), (test_data, test_labels) = reuters.load_data(
num_words=1000)
#ترميز الفئات المختلفة للبيانات
#كما أشرنا One-Hot-Enoding طبعاً يجب أن نستخدم الترميز 
from keras.utils.np_utils import to_categorical  # One-Hot-Enoding
one_hot_train_labels = to_categorical(train_labels)
one_hot_test_labels = to_categorical(test_labels)
# قمنا بعرض فئة أول عينة من بيانات التدريب
print('one_hot_train_labels[0]:\n',one_hot_train_labels[0])
'''
one_hot_train_labels[0]:
 [0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
'''
# قمنا بعرض فئة أول عينة من بيانات الاختبار
print('one_hot_test_labels[0]:\n',one_hot_test_labels[0])
'''
one_hot_test_labels[0]:
 [0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
'''
#أي الفئات target انتهينا من ترميز قيم ال 
# الآن لنقم بترميز بيانات التدريب 
import numpy as np
#One-Hot قمت بإنشاء تابع يقوم بتحويل بياناتي إلى الترميز 
#  بإمكانك أيضاً استخدام تابع تحويل جاهز
def vectorize_sequences(sequences, dimension=1000):
    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 import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=(1000,)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(46, activation='softmax'))
# تجميع النموذج 
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy']) # لاحظ كيف قمنا بتمرير دالة التكلفة إلى النموذج
# التدريب
history = model.fit(x_train,
one_hot_train_labels,
epochs=8,
batch_size=512,
validation_split=0.2)
# الخرج
'''
one_hot_train_labels[0]:
 [0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
one_hot_test_labels[0]:
 [0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
Epoch 1/8
15/15 [==============================] - 1s 26ms/step - loss: 3.3072 - accuracy: 0.2687 - val_loss: 2.0882 - val_accuracy: 0.5598
Epoch 2/8
15/15 [==============================] - 0s 14ms/step - loss: 1.9363 - accuracy: 0.5923 - val_loss: 1.6561 - val_accuracy: 0.6689
Epoch 3/8
15/15 [==============================] - 0s 14ms/step - loss: 1.5366 - accuracy: 0.6684 - val_loss: 1.4629 - val_accuracy: 0.6789
Epoch 4/8
15/15 [==============================] - 0s 13ms/step - loss: 1.3725 - accuracy: 0.7010 - val_loss: 1.3563 - val_accuracy: 0.7067
Epoch 5/8
15/15 [==============================] - 0s 13ms/step - loss: 1.1850 - accuracy: 0.7418 - val_loss: 1.2387 - val_accuracy: 0.7329
Epoch 6/8
15/15 [==============================] - 0s 13ms/step - loss: 1.1154 - accuracy: 0.7538 - val_loss: 1.1835 - val_accuracy: 0.7390
Epoch 7/8
15/15 [==============================] - 0s 12ms/step - loss: 1.0090 - accuracy: 0.7659 - val_loss: 1.1342 - val_accuracy: 0.7524
Epoch 8/8
15/15 [==============================] - 0s 26ms/step - loss: 0.9243 - accuracy: 0.7887 - val_loss: 1.0994 - val_accuracy: 0.7618
'''

 

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

  • 0

دالة Categorical Cross Entropy موجودة في مكتبة tensorflow.keras.losses وهي التي تقوم بحساب قيمة الفقد loss بين البيانات المتوقعة من قبل نموذج التصنيف و أصناف العينات الحقيقية. وال cross entropy هو عملية حساب الإختلاف بين توزيع إحتمالات probability distribution لمجموعتين تحتوى على مجموعة من البيانات.

تعرف دالة ال CategoricalCrossentropy كالأتي:

tf.keras.metrics.CategoricalCrossentropy(
    name='categorical_crossentropy', dtype=None, from_logits=False,
    label_smoothing=0
)

حيث أن:

name: عبارة عن إسم الدالة التي سيتم النداء بها لاحقاً.

dtype: تشير لنوع النتائج التي ستخرجها الدالة.

from_logits: وهي تشير لنوع العملية التي ستتم في البيانات وتعني أن مجموع البيانات الداخلة قد لا يساوي 1 و بالتالي هو ليس بإحتمال.

label_smoothing: عبارة عن قيمة رقمية بين 0 و 1 و إذا كانت القيمة أكبر من 0 تعني أن البيانات تمت فيها عملية smoothing.

يمكن تطبيق الدالة CategoricalCrossentropy كالتالي:

import tensorflow as tf

m = tf.keras.metrics.CategoricalCrossentropy()
m.update_state([[0, 1, 0], [0, 0, 1]],
               [[0.05, 0.95, 0], [0.1, 0.8, 0.1]])
m.result().numpy()

الدالة تتوقع القيم أن تكون مكررة بعد تطبيق one hot encoding عليها. الدالة update_state هي التي تقوم بإستقبال القيم الحقيقية و المتوقعة ويمكنها ايضا أن تقوم بإستقبال sampe_weight لحساب النتائج (sample_weight هي الدالة التي تعطي الأصناف أوزان مختلفة في حال كانت البيانات تحتوي على صنف واحد أكثر من البقية). و أخيراً result هي التي تطبع النتائج.

أما إن كنا نريد تطبيق Categorical Cross Entropy على نتائج النماذج المختلفة فيمكن ذلك بإستخدام model.compile:

model.compile(
  optimizer='sgd',
  loss='mse',
  metrics=[tf.keras.metrics.CategoricalCrossentropy()])

في المثال السابق بعد أن حددنا نوع optimizer و loss function قمنا بتحديد دالة حساب الخطأ وهي ()CategoricalCrossentropy.

 

 

 

 

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...