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

السؤال

Recommended Posts

  • 1
نشر

هي دالة تكلفة (loss) في كيراس وتنسرفلو ويتم استخدامها مع مسائل التصنيف المتعدد أي عندما يكون لدينا أكثر من فئة (Class label).
تتوقع منك مصفوفتين كدخل، واحدة تعبر عن القيم الحقيقية (مصفوفة من الأعداد integer)، والأخرى تعبر عن القيم المتوقعة (float).
تعتمد هذه الدالة على المفهوم الشهير في نظرية المعلومات والمعروف ب Cross Entropy أو الإنتروبيا المتقطعة، وهي مقياس لمدى تشابه توزعين احتماليين مختلفين لنفس الحدث وفي ال ML نستخدم هذا التعريف وقانونه لكي نقوم بحساب ال Loss (التكلفة Cost). حيث يكون الخرج الخاص بالشبكة العصبية هو توزيع احتمالي لعدة فئات classes.
تابع التنشيط هنا إما Sigmoid أو Softmax فهما تابعي التنشيط الوحيدين المتوافقين مع دالة التكلفة SCCE.
الفرق الوحيد بينها وبين CategoricalCrossentropy هو في طريقة تمثيل القيم الحقيقية أو label classes (فئات البيانات)، فهناك نمثلها بأشعة Spare باستخدام الترميز One-Hot أما هنا فلسنا بحاجة للقيام بذلك (ويعتبر هذا الترميز أفضل من ناحية التعقيد الزماني والمكاني كونه لايستهلك دفقات معالجة لافائدة منها كما في ال CCE).
أبعاد المدخلات:

y_true [batch_size]
y_pred [batch_size, num_classes]

يتم استيرادها من الموديول:

tensorflow.keras.losses

مثال:

# استيرادها
from tensorflow.keras.losses import SparseCategoricalCrossentropy
# تشكيل داتامزيفة تعبر عن قيم حقيقية وقيم متوقعة
y_true = [2,1,0] # تم تحديد ثلاث أصناف و3 عينات
y_pred1 = [[0.1, 0.0,0.9], [0.2, 0.8, 0.0],[0.8, 0.2, 0.0]] # مصفوفة تعبر عن القيم المتوقعة
y_pred2 = [[0.0, 0.01,0.99], [0.01, 0.99, 0.0],[0.99, 0.01, 0.0]] # مصفوفة ثانية تعبر عن القيم المتوقعة
#SparseCategoricalCrossentropy إنشاء غرض من الكلاس
scce = SparseCategoricalCrossentropy()
# تمرير القيم الحقيقية والمتوقعة إلى الغرض ليحسب لنا التكلفة
scce(y_true, y_pred1).numpy() # 0.18388261
scce(y_true, y_pred2).numpy() # 0.010050405

لاستخدامها ضمن نموذجك كدالة خسارة، نقوم بتمريرها إلى الدالة compile بإحدى الشكلين التاليين، ويمكنك استخدامها ممعيار لنموذجك (لكن في الواقع لا أحد يقوم بذلك):

model.compile(
  loss=tf.keras.losses.SparseCategoricalCrossentropy(),
  ...
)
# أو يمكن تمريرها بسهولة بالشكل التالي
model.compile(
     loss='sparse_categorical_crossentropy',
     ...
)
# لاستخدامها كمعيار
model.compile(
     metrics=['sparse_categorical_accuracy'],
     ...
)

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

# تحميل الداتا
from keras.datasets import reuters
(train_data, train_labels), (test_data, test_labels) = reuters.load_data(
num_words=1000)
#integer فئات البيانات يجب أن تكون 
print(train_labels[0:5]) # [3 4 3 4 4]
# الآن لنقم بترميز بيانات التدريب 
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='sparse_categorical_crossentropy',
metrics=['accuracy']) # لاحظ كيف قمنا بتمرير دالة التكلفة إلى النموذج
# التدريب
history = model.fit(x_train,
train_labels,
epochs=8,
batch_size=512,
validation_split=0.2)
# الخرج
'''
Epoch 1/8
15/15 [==============================] - 3s 53ms/step - loss: 3.3317 - accuracy: 0.2863 - val_loss: 2.0840 - val_accuracy: 0.5687
Epoch 2/8
15/15 [==============================] - 0s 14ms/step - loss: 1.9193 - accuracy: 0.5986 - val_loss: 1.6421 - val_accuracy: 0.6221
Epoch 3/8
15/15 [==============================] - 0s 14ms/step - loss: 1.4877 - accuracy: 0.6641 - val_loss: 1.3978 - val_accuracy: 0.6956
Epoch 4/8
15/15 [==============================] - 0s 14ms/step - loss: 1.3094 - accuracy: 0.7072 - val_loss: 1.3088 - val_accuracy: 0.7040
Epoch 5/8
15/15 [==============================] - 0s 14ms/step - loss: 1.1608 - accuracy: 0.7329 - val_loss: 1.2279 - val_accuracy: 0.7234
Epoch 6/8
15/15 [==============================] - 0s 13ms/step - loss: 1.0447 - accuracy: 0.7597 - val_loss: 1.2365 - val_accuracy: 0.7067
Epoch 7/8
15/15 [==============================] - 0s 21ms/step - loss: 0.9647 - accuracy: 0.7750 - val_loss: 1.2022 - val_accuracy: 0.7179
Epoch 8/8
15/15 [==============================] - 0s 12ms/step - loss: 0.9104 - accuracy: 0.7882 - val_loss: 1.1006 - val_accuracy: 0.7390
'''

 

  • 1
نشر

دالة Sparse Categorical Cross Entropy موجودة في مكتبة tensorflow.keras.losses وهي التي تقوم بحساب قيمة الفقد loss بين البيانات المتوقعة من قبل نموذج التصنيف و أصناف العينات الحقيقية. وهي تقوم بنفس ما تقوم به Categorical Cross Entropy المشروحة هنا وذلك حسب البرنامج المعرف في TensorFlow لكن الفرق الوحيد هو ان Sparse Categorical Cross Entropy تقوم بإستقبال القيم المدخلة للنموذج في شكل أرقام عكس Categorical Cross Entropy  التي تستقبلها بعد عملية التحويل بإستخدام one hot encoding. لاحظ المثال التالي:

import tensorflow as tf

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

لاحظ ان القيم الحقيقية الداخلة للنموذج عبارة عن [1, 2] وليست معرفة كترميز [0, 1, 0], [0, 0, 1] كما حصل مع Categorical Cross Entropy.

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

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

كما يمكن تعريف الدالة خارج model.compile وندائها لاحقاً كما ذكر @Ali Haidar Ahmad.

 

 

 

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...