מבוא
ברוב המקרים, באמצעות MinDiffModel
ישירות כמתואר "שילוב MinDiff עם MinDiffModel" מדריך מספיק. עם זאת, ייתכן שתזדקק להתנהגות מותאמת אישית. שתי הסיבות העיקריות לכך הן:
-
keras.Model
אתה משתמש יש התנהגות אישית שאתה רוצה לשמר. - אתה רוצה את
MinDiffModel
להתנהג אחרת מברירת המחדל.
בכל מקרה, תצטרך מכל מחלקה 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 Dataset for training, sampled at 0.3 for reduced runtimes.
train_df = tutorials_utils.get_uci_data(split='train', sample=0.3)
train_ds = tutorials_utils.df_to_dataset(train_df, batch_size=128)
# Dataset needed to train with MinDiff.
train_with_min_diff_ds = (
tutorials_utils.get_uci_with_min_diff_dataset(split='train', sample=0.3))
שימור התאמות אישיות של דגם מקורי
tf.keras.Model
נועד להיות מותאם אישית בקלות באמצעות subclassing כמתואר כאן . אם הדגם שלך אישית מימושים שאתם רוצים לשמר בעת החלת MinDiff, תצטרך מכל מחלקה MinDiffModel
.
דגם מקורי בהתאמה אישית
כדי לראות כיצד ניתן לשמר את התאמות, ליצור מודל מותאם אישית, אשר מפרט להם מאפיין True
כאשר המנהג שלה train_step
נקראת. זו אינה התאמה אישית שימושית אך תשמש להמחשת התנהגות.
class CustomModel(tf.keras.Model):
# Customized train_step
def train_step(self, *args, **kwargs):
self.used_custom_train_step = True # Marker that we can check for.
return super(CustomModel, self).train_step(*args, **kwargs)
אימון מודל כזה ייראה זהה נורמלי Sequential
מודל.
model = tutorials_utils.get_uci_model(model_class=CustomModel) # Use CustomModel.
model.compile(optimizer='adam', loss='binary_crossentropy')
_ = model.fit(train_ds.take(1), epochs=1, verbose=0)
# Model has used the custom train_step.
print('Model used the custom train_step:')
print(hasattr(model, 'used_custom_train_step')) # True
Model used the custom train_step: True
תת-סיווג MinDiffModel
אם היית מנסה ולהשתמש MinDiffModel
ישירות, המודל לא להשתמש מנהג train_step
.
model = tutorials_utils.get_uci_model(model_class=CustomModel)
model = min_diff.keras.MinDiffModel(model, min_diff.losses.MMDLoss())
model.compile(optimizer='adam', loss='binary_crossentropy')
_ = model.fit(train_with_min_diff_ds.take(1), epochs=1, verbose=0)
# Model has not used the custom train_step.
print('Model used the custom train_step:')
print(hasattr(model, 'used_custom_train_step')) # False
Model used the custom train_step: False
על מנת להשתמש נכון train_step
השיטה, אתה צריך בכיתת מנהג זה subclasses הוא MinDiffModel
ו CustomModel
.
class CustomMinDiffModel(min_diff.keras.MinDiffModel, CustomModel):
pass # No need for any further implementation.
אימון מודל זה ישתמש train_step
מן CustomModel
.
model = tutorials_utils.get_uci_model(model_class=CustomModel)
model = CustomMinDiffModel(model, min_diff.losses.MMDLoss())
model.compile(optimizer='adam', loss='binary_crossentropy')
_ = model.fit(train_with_min_diff_ds.take(1), epochs=1, verbose=0)
# Model has used the custom train_step.
print('Model used the custom train_step:')
print(hasattr(model, 'used_custom_train_step')) # True
Model used the custom train_step: True
התנהגויות מחדל התאמה אישית של MinDiffModel
במקרים אחרים, ייתכן שתרצה לשנות התנהגויות מחדל ספציפיות של MinDiffModel
. השימוש הנפוץ ביותר של זה משנה את ההתנהגות פורקת מחדל כראוי לטיפול בנתונים שלך אם אינך משתמש pack_min_diff_data
.
כאשר אורזים את הנתונים בפורמט מותאם אישית, זה עשוי להופיע כדלקמן.
def _reformat_input(inputs, original_labels):
min_diff_data = min_diff.keras.utils.unpack_min_diff_data(inputs)
original_inputs = min_diff.keras.utils.unpack_original_inputs(inputs)
return ({
'min_diff_data': min_diff_data,
'original_inputs': original_inputs}, original_labels)
customized_train_with_min_diff_ds = train_with_min_diff_ds.map(_reformat_input)
customized_train_with_min_diff_ds
במערך אצוות מחזיר מורכב tuples (x, y)
שבו x
הוא dict המכיל min_diff_data
ו original_inputs
ו y
הוא original_labels
.
for x, _ in customized_train_with_min_diff_ds.take(1):
print('Type of x:', type(x)) # dict
print('Keys of x:', x.keys()) # 'min_diff_data', 'original_inputs'
Type of x: <class 'dict'> Keys of x: dict_keys(['min_diff_data', 'original_inputs'])
פורמט נתונים זה לא מה MinDiffModel
מצפה כברירת מחדל והעברת customized_train_with_min_diff_ds
אליו היה לגרום להתנהגות בלתי צפויה. כדי לתקן זאת תצטרך ליצור תת מחלקה משלך.
class CustomUnpackingMinDiffModel(min_diff.keras.MinDiffModel):
def unpack_min_diff_data(self, inputs):
return inputs['min_diff_data']
def unpack_original_inputs(self, inputs):
return inputs['original_inputs']
עם תת מחלקה זו, אתה יכול להתאמן כמו עם הדוגמאות האחרות.
model = tutorials_utils.get_uci_model()
model = CustomUnpackingMinDiffModel(model, min_diff.losses.MMDLoss())
model.compile(optimizer='adam', loss='binary_crossentropy')
_ = model.fit(customized_train_with_min_diff_ds, epochs=1)
77/77 [==============================] - 4s 30ms/step - loss: 0.6690 - min_diff_loss: 0.0395
מגבלות דפדפן מותאם אישית MinDiffModel
יצירת מנהג MinDiffModel
מספק כמות עצומה של גמישות במקרים שימוש מורכב יותר. עם זאת, יש עדיין כמה מקרי קצה שהוא לא יתמוך בהם.
עיבוד מקדים או אימות של תשומות לפני call
המגבלה הגדולה ביותר עבור תת מחלקה של MinDiffModel
היא שזה דורש x
רכיב של נתוני הקלט (כלומר האלמנט הראשון או היחיד אצווה חזר ידי tf.data.Dataset
) יועברו דרך ללא עיבוד מקדים או אימות כדי call
.
זה פשוט משום min_diff_data
ארוז לתוך x
רכיב של נתוני קלט. כול מקדים או אימות לא מצפה למבנה הנוסף המכיל min_diff_data
ו ישבש.
אם העיבוד המקדים או האימות ניתנים להתאמה אישית בקלות (למשל, נכללים בשיטה משלו), אז זה מטופל בקלות על ידי דריסה שלו כדי להבטיח שהוא מטפל בצורה נכונה במבנה הנוסף.
דוגמה עם אימות עשויה להיראות כך:
class CustomMinDiffModel(min_diff.keras.MinDiffModel, CustomModel):
# Override so that it correctly handles additional `min_diff_data`.
def validate_inputs(self, inputs):
original_inputs = self.unpack_original_inputs(inputs)
... # Optionally also validate min_diff_data
# Call original validate method with correct inputs
return super(CustomMinDiffModel, self).validate(original_inputs)
אם החלו בעיבוד או האימות אינו בקלות להתאמה אישית, ולאחר מכן באמצעות MinDiffModel
לא יפעל עבורך ועבור תצטרכו לשלב MinDiff בלעדיו כמתואר במדריך זה .
התנגשויות שמות השיטה
יתכן כי המודל שלך יש שיטות ששמותיהם מתנגשים עם אלה מיושמים MinDiffModel
(ראו רשימה מלאה של שיטות ציבור תיעוד API ).
זה בעייתי רק אם אלה ייקראו על מופע של המודל (ולא באופן פנימי בשיטה אחרת). בעוד מאוד לא סביר, אם אתם נמצאים במצב זה תצטרך גם לעקוף ושנה כמה שיטות או, אם לא אפשרי, ייתכן שיהיה צורך לשקול שילוב MinDiff ללא MinDiffModel
כמתואר במדריך זה בנושא .
משאבים נוספים
- לקבלת דיון מעמיק על הערכת הגינות לראות את הדרכת מחווני גינות
- לקבלת מידע כללי על הוראת מתקנת ו MinDiff, לראות את סקירת התיקון .
- לפרטים על דרישות שמסביב MinDiff לראות את המדריך הזה .
- כדי לראות הדרכה מקצה לקצה על שימוש MinDiff ב Keras, לראות במדריך זה .