دمج MinDiff مع MinDiffModel

مقدمة

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

  1. إعداد البيانات (المشمولة في دليل إعداد المدخلات ).

  2. قم بتعديل أو إنشاء نموذج يقوم بدمج 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 على نموذجك من خلال الخطوات التالية:

  1. قم بإنشاء النموذج الأصلي كما تفعل بدون MinDiff.
original_model = tutorials_utils.get_uci_model()
  1. التفاف عليه في MinDiffModel .
min_diff_model = min_diff.keras.MinDiffModel(
    original_model=original_model,
    loss=min_diff.losses.MMDLoss(),
    loss_weight=1)
  1. قم بتجميعها كما تفعل بدون MinDiff.
min_diff_model.compile(optimizer='adam', loss='binary_crossentropy')
  1. تدريب مع مجموعة البيانات 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 مباشرة. بدلا من ذلك، سوف تحتاج إلى فئة فرعية كما هو موضح في دليل التخصيص .

مصادر إضافية