مقدمة
هناك خطوتان لدمج MinDiff في نموذجك:
إعداد البيانات (المشمولة في دليل إعداد المدخلات ).
قم بتعديل أو إنشاء نموذج يقوم بدمج MinDiff أثناء التدريب.
سيغطي هذا الدليل أبسط طريقة لإكمال الخطوة الثانية: استخدام MinDiffModel
.
يثبت
pip install -q --upgrade tensorflow-model-remediation
import tensorflow as tf
tf.get_logger().setLevel('ERROR') # Avoid TF warnings.
from tensorflow_model_remediation import min_diff
from tensorflow_model_remediation.tools.tutorials_utils import uci as tutorials_utils
أولاً ، قم بتنزيل البيانات. للإيجاز، وقد روعي منطق إعداد مدخلات للخروج الى وظائف المساعد كما هو موضح في دليل إعداد المدخلات . يمكنك قراءة الدليل الكامل للحصول على تفاصيل حول هذه العملية.
# Original DataFrame for training, sampled at 0.3 for reduced runtimes.
train_df = tutorials_utils.get_uci_data(split='train', sample=0.3)
# Dataset needed to train with MinDiff.
train_with_min_diff_ds = (
tutorials_utils.get_uci_with_min_diff_dataset(split='train', sample=0.3))
النموذج الأصلي
يستخدم هذا دليل أساسي، untuned keras.Model
باستخدام API الوظيفي لتسليط الضوء على استخدام MinDiff. في تطبيق العالم الحقيقي ، ستختار بنية النموذج بعناية وتستخدم الضبط لتحسين جودة النموذج قبل محاولة معالجة أي مشكلات تتعلق بالإنصاف.
منذ MinDiffModel
تم تصميمه للعمل مع معظم Keras Model
الطبقات، ونحن قد يؤخذ من منطق بناء النموذج في وظيفة مساعد: get_uci_model
.
التدريب مع Pandas DataFrame
يتدرب هذا الدليل على فترة زمنية واحدة للسرعة ، ولكن يمكنه بسهولة تحسين أداء النموذج عن طريق زيادة عدد الحقب.
model = tutorials_utils.get_uci_model()
model.compile(optimizer='adam', loss='binary_crossentropy')
df_without_target = train_df.drop(['target'], axis=1) # Drop 'target' for x.
_ = model.fit(
x=dict(df_without_target), # The model expects a dictionary of features.
y=train_df['target'],
batch_size=128,
epochs=1)
77/77 [==============================] - 3s 23ms/step - loss: 0.8589
تدريب مع tf.data.Dataset
التدريب يعادل مع tf.data.Dataset
تبدو مشابهة جدا (على الرغم من التهيئة والعشوائية المدخلات قد يسفر عن نتائج مختلفة قليلا).
model = tutorials_utils.get_uci_model()
model.compile(optimizer='adam', loss='binary_crossentropy')
_ = model.fit(
tutorials_utils.df_to_dataset(train_df, batch_size=128), # Converted to Dataset.
epochs=1)
77/77 [==============================] - 3s 23ms/step - loss: 0.6416
دمج MinDiff للتدريب
بمجرد إعداد البيانات ، قم بتطبيق MinDiff على نموذجك من خلال الخطوات التالية:
- قم بإنشاء النموذج الأصلي كما تفعل بدون MinDiff.
original_model = tutorials_utils.get_uci_model()
- التفاف عليه في
MinDiffModel
.
min_diff_model = min_diff.keras.MinDiffModel(
original_model=original_model,
loss=min_diff.losses.MMDLoss(),
loss_weight=1)
- قم بتجميعها كما تفعل بدون MinDiff.
min_diff_model.compile(optimizer='adam', loss='binary_crossentropy')
- تدريب مع مجموعة البيانات MinDiff (
train_with_min_diff_ds
في هذه الحالة).
_ = min_diff_model.fit(train_with_min_diff_ds, epochs=1)
77/77 [==============================] - 6s 31ms/step - loss: 0.7883 - min_diff_loss: 0.0379
التقييم والتنبؤ مع MinDiffModel
كلا تقييم وتوقع مع MinDiffModel
تشبه بذلك مع النموذج الأصلي.
عندما يدعو evaluate
يمكنك تمرير إما في مجموعة البيانات الأصلي أو واحدة تحتوي على بيانات MinDiff. إذا اخترت هذا الأخير، سوف يمكنك أيضا الحصول على min_diff_loss
متري بالإضافة إلى أي مقاييس أخرى يجري قياسه loss
ستشمل أيضا min_diff_loss
.
عندما يدعو evaluate
يمكنك تمرير إما في مجموعة البيانات الأصلي أو واحدة تحتوي على بيانات MinDiff. إذا قمت بتضمين MinDiff في الاستدعاء للتقييم ، فسيختلف شيئين:
- ومتري إضافي يسمى
min_diff_loss
ستكون حاضرة في الإخراج. - قيمة
loss
سوف متري يكون مجموع الأصليةloss
متري (لا يظهر في إخراج) وmin_diff_loss
.
_ = min_diff_model.evaluate(
tutorials_utils.df_to_dataset(train_df, batch_size=128))
# Calling with MinDiff data will include min_diff_loss in metrics.
_ = min_diff_model.evaluate(train_with_min_diff_ds)
77/77 [==============================] - 2s 22ms/step - loss: 0.4638 77/77 [==============================] - 3s 32ms/step - loss: 0.5087 - min_diff_loss: 0.0451
عندما يدعو predict
يمكنك من الناحية الفنية يمر أيضا في مجموعة البيانات مع البيانات MinDiff لكن سيتم تجاهله ولا يؤثر على الانتاج.
_ = min_diff_model.predict(
tutorials_utils.df_to_dataset(train_df, batch_size=128))
_ = min_diff_model.predict(train_with_min_diff_ds) # Identical to results above.
القيود المفروضة على استخدام MinDiffModel
مباشرة
عند استخدام MinDiffModel
كما هو موضح أعلاه، فإن معظم طرق استخدام تطبيقات الافتراضية tf.keras.Model
(الاستثناءات الواردة في وثائق API ).
print('MinDiffModel.fit == keras.Model.fit')
print(min_diff.keras.MinDiffModel.fit == tf.keras.Model.fit)
print('MinDiffModel.train_step == keras.Model.train_step')
print(min_diff.keras.MinDiffModel.train_step == tf.keras.Model.train_step)
MinDiffModel.fit == keras.Model.fit True MinDiffModel.train_step == keras.Model.train_step True
ل keras.Sequential
أو keras.Model
، وهذا هو تماما ما يرام لأنها تستخدم نفس الوظائف.
print('Sequential.fit == keras.Model.fit')
print(tf.keras.Sequential.fit == tf.keras.Model.fit)
print('tf.keras.Sequential.train_step == keras.Model.train_step')
print(tf.keras.Sequential.train_step == tf.keras.Model.train_step)
Sequential.fit == keras.Model.fit True tf.keras.Sequential.train_step == keras.Model.train_step True
ومع ذلك، إذا النموذج الخاص بك هو فئة فرعية من keras.Model
، التفاف مع MinDiffModel
سوف تفقد بفعالية التخصيص.
class CustomModel(tf.keras.Model):
def train_step(self, **kwargs):
pass # Custom implementation.
print('CustomModel.train_step == keras.Model.train_step')
print(CustomModel.train_step == tf.keras.Model.train_step)
CustomModel.train_step == keras.Model.train_step False
إذا كان هذا هو حال استخدامك، يجب عدم استخدام MinDiffModel
مباشرة. بدلا من ذلك، سوف تحتاج إلى فئة فرعية كما هو موضح في دليل التخصيص .
مصادر إضافية
- لفي مناقشة شاملة حول تقييم نزاهة رؤية التوجيه مؤشرات الإنصاف
- للحصول على معلومات عامة عن علاج وMinDiff، راجع نظرة عامة المعالجة .
- للحصول على تفاصيل حول متطلبات المحيطة MinDiff نرى هذا الدليل .
- للاطلاع على البرنامج التعليمي نهاية إلى نهاية على استخدام MinDiff في Keras، انظر هذا البرنامج التعليمي .