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

ال Poisson loss في Kears وكيف يتم استخدامها مع مسألة تصنيف

Meezo ML

السؤال

Recommended Posts

  • 1

هي دالة خسارة تحسب خسارة بواسون بين القيم الحقيقية والمتوقعة.
له الصيغة التالية مع مسائل التصنيف:

loss = y_pred - y_true * log(y_pred)
  • توزيع بواسون: هو توزيع احتمالي منفصل، ويعبر عن احتمالية حدوث مجموعة من الأحداث P ضمن فترة زمنية محددة عندما تحدث هذه الأحداث بمعدل وسطي v شرط أن لا تكون متعلقة بزمن حدوث آخر حدث.
  • يكون استخدامها مع مسائل التصنيف (المتعدد) اعتماداً على الصيغة السابقة، وفي كيراس لم يتضمن التوثيق استخدام لها مع مسائل التوقع رغم أنه من الممكن استخدامه مع هذه المسائل عندما تتبع البيانات توزيع بواسون (لكن في هذه الحالة لايتم استخدامها بنفس الصيغة قي الأعلى).
  • يجب أن تقوم بترميز بيانات ال target  ترميزاً فئوياً One-Hot.

مثال:

import tensorflow as tf
y_true = [[0, 1, 0], [1, 0, 0]] #تمثل القيم الحقيقية One-Hot مصفوفة من ال
y_pred = [[0.01, 0.9, 0], [0.99, 0.0, 0.0]] # مصفوفة القيم المتوقعة
p = tf.keras.losses.Poisson() 
p(y_true, y_pred).numpy()#0.33590174

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

model.compile(
    loss=tf.keras.losses.Poisson(),
)
# أو
model.compile(
    loss='poisson',
)

مثال على مجموعة بيانات راوترز (تصنيف متعدد 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)
#أي الفئات 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.Poisson(),
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 25ms/step - loss: 0.0900 - accuracy: 0.3860 - val_loss: 0.0635 - val_accuracy: 0.5704
Epoch 2/8
15/15 [==============================] - 0s 14ms/step - loss: 0.0608 - accuracy: 0.6000 - val_loss: 0.0558 - val_accuracy: 0.6589
Epoch 3/8
15/15 [==============================] - 0s 15ms/step - loss: 0.0544 - accuracy: 0.6672 - val_loss: 0.0536 - val_accuracy: 0.6667
Epoch 4/8
15/15 [==============================] - 0s 14ms/step - loss: 0.0511 - accuracy: 0.6971 - val_loss: 0.0505 - val_accuracy: 0.7134
Epoch 5/8
15/15 [==============================] - 0s 20ms/step - loss: 0.0481 - accuracy: 0.7221 - val_loss: 0.0487 - val_accuracy: 0.7234
Epoch 6/8
15/15 [==============================] - 0s 19ms/step - loss: 0.0457 - accuracy: 0.7484 - val_loss: 0.0475 - val_accuracy: 0.7529
Epoch 7/8
15/15 [==============================] - 0s 20ms/step - loss: 0.0435 - accuracy: 0.7724 - val_loss: 0.0470 - val_accuracy: 0.7513
Epoch 8/8
15/15 [==============================] - 0s 14ms/step - loss: 0.0421 - accuracy: 0.7906 - val_loss: 0.0465 - val_accuracy: 0.7663

 

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

  • 0

هي الدالة التي تقوم بحساب نسبة الخطأ أو الفقد Loss للبيانات بإستخدام طريقة بواسون وهو موجود ب tensorflow.keras.losses و يقوم بإستقبال القيم المتوقعة من النموذج و القيم الحقيقية لحساب الخطأ. لاحظ المثال البسيط المطبق على الدالة:

import tensorflow as tf

y_true = [[0., 1.], [0., 0.]]
y_pred = [[1., 1.], [0., 0.]]
p = tf.keras.losses.Poisson()
p(y_true, y_pred).numpy()

بعد أن عرفنا tensorflow قمنا بإنشاء قيم لتمثل البيانات الحقيقية و البيانات المتوقعة من قبل النموذج، و بإستخدام دالة الفقد Poisson قمنا بحساب نسبة الخطأ والتي تعتمد على توزيع البيانات.

قام @Ali Haidar Ahmad بتطبيق مثال على عملية التصنيف، سأقوم بتطبيق مثال اخر على عملية الregression:

from keras import models, layers
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
X, y = load_boston(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.4)
print(X_train.shape, y_train.shape,X_test.shape, y_test.shape)
model = models.Sequential()
model.add(layers.Dense(13, activation='linear', input_shape=(13,)))
model.add(layers.Dense(26, activation='sigmoid'))
model.add(layers.Dense(1, activation='tanh'))
model.compile(optimizer='rmsprop',loss=tf.keras.losses.Poisson(),metrics=['mse'])
model.fit(X_train, y_train, epochs=3, batch_size=200)

في المثال السابق قمنا بإستيراد الدوال التي سنتعامل معها، بالإضافة لتحميل dataset وهي خاصة بإسعار المنازل في بوسطن (regression dataset). بعد ذلك قسمنا البيانات و تعريف النموذج و من ثم تجميع البيانات و تدريب النموذج، لاحظ أن دالة حساب الخطأ او الفقد المستخدمة هي Poisson.

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...