שילוב 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))

דגם מקורי

מדריך זה משתמש בסיסי, לא מכוון 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 ישירות. במקום זאת, תצטרך מכל מחלקה שהיא כמתואר מדריך התאמה אישית .

משאבים נוספים