מבוא
ישנם שני שלבים לשילוב 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))
דגם מקורי
מדריך זה משתמש בסיסי, לא מכוון 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, לראות במדריך זה .
הצג באתר TensorFlow.org
הפעל בגוגל קולאב
צפה במקור ב-GitHub
הורד מחברת