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

السؤال

Recommended Posts

  • 1
نشر (معدل)

في الاحصاء الرياضي، فإن تباعد كولباك - ليبلير ‏ هو مقياس لمدى اختلاف توزيع احتمالي p عن توزيع احتمالي مرجعي آخر q، وهو مجرد تعديل طفيف لمعادلة  الإنتروبيا، ويستخدم في تعلم الآلة كمقياس لأداء نموذج، عن طريق مقارنة اختلاف y_pred (التوزيع الاحتمالي الذي أنتجته الخوارزمية) ب y_true (توزيع احتمالي مرجعي).
يمكنك استخدامه عبر الموديول:tf.keras.losses

tensorflow.keras.losses

مثال:

import tensorflow as tf
y_true = [[0, 1], [1, 0]]
y_pred = [[0.2, 0.8], [0.9, 0.1]]
kl = tf.keras.losses.KLDivergence()
kl(y_true, y_pred).numpy() #0.16425064

لاستخدامه في نموذجك، قم بتمريره إلى دالة compile كالتالي:

model.compile(
	loss=tf.keras.losses.KLDivergence()
	...
)
# أو 
model.compile(
	loss='KLDivergence'
	...
)

مثال على مجموعة بيانات راوترز (تصنيف متعدد 46 فئة):
للتنويه: لاستخدامه يجب أن تقوم بترميز بيانات ال target لديك بترميز فئوي One-Hot، ويمكنك استخدام الدالة to_categorical كما في المثال للقيام بالأمر.

# تحميل الداتا
from keras.datasets import reuters
import tensorflow as tf
(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)
#أي الفئات 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=tf.keras.losses.KLDivergence(),
metrics=['accuracy']) # لاحظ كيف قمنا بتمرير دالة التكلفة إلى النموذج
# التدريب
history = model.fit(x_train,
one_hot_train_labels,
epochs=8,
batch_size=512,
validation_split=0.2)
--------------------------------------------------------------------------
Epoch 1/8
15/15 [==============================] - 1s 31ms/step - loss: 3.2545 - accuracy: 0.2897 - val_loss: 2.0523 - val_accuracy: 0.5704
Epoch 2/8
15/15 [==============================] - 0s 14ms/step - loss: 1.9090 - accuracy: 0.5904 - val_loss: 1.6599 - val_accuracy: 0.6210
Epoch 3/8
15/15 [==============================] - 0s 14ms/step - loss: 1.5475 - accuracy: 0.6557 - val_loss: 1.4534 - val_accuracy: 0.6772
Epoch 4/8
15/15 [==============================] - 0s 20ms/step - loss: 1.3430 - accuracy: 0.7036 - val_loss: 1.3452 - val_accuracy: 0.6962
Epoch 5/8
15/15 [==============================] - 0s 34ms/step - loss: 1.2310 - accuracy: 0.7298 - val_loss: 1.2695 - val_accuracy: 0.7151
Epoch 6/8
15/15 [==============================] - 0s 14ms/step - loss: 1.1037 - accuracy: 0.7569 - val_loss: 1.1704 - val_accuracy: 0.7446
Epoch 7/8
15/15 [==============================] - 0s 17ms/step - loss: 1.0003 - accuracy: 0.7809 - val_loss: 1.1225 - val_accuracy: 0.7607
Epoch 8/8
15/15 [==============================] - 0s 15ms/step - loss: 0.9435 - accuracy: 0.7911 - val_loss: 1.0866 - val_accuracy: 0.7590

 

تم التعديل في بواسطة Ali Haidar Ahmad
  • 0
نشر

KL-Divergence هي طريقة لحساب نسبة الفقد او الخطأ بين البيانات الحقيقية و الناتجة من النموذج، والتي تعتمد في القياس على Kullback-Leibler divergence والتي تقوم بحساب الخطأ بالطريقة التالية:

loss = y_true * log(y_true / y_pred)

يتم تعريف KL-Divergence في tensorflow بالطريقة التالية:

tf.keras.losses.KLDivergence(
    reduction=losses_utils.ReductionV2.AUTO, name='kl_divergence'
)

مثال لطريقة تطبيق الKL-Divergence:

import tensorflow as tf

y_true = [[0, 1], [0, 0]]
y_pred = [[0.6, 0.4], [0.4, 0.6]]

kl = tf.keras.losses.KLDivergence()
kl(y_true, y_pred).numpy()

والناتج عبارة عن 0.45814306 وهي قيمة الخطأ بين y_true و y_pred والتي يتم حسابها بالعلاقة في الشرح أعلاه.

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...