מבוא
ישנם שני שלבים לשילוב 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, לראות במדריך זה .