התאמה אישית של MinDiffModel

מבוא

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

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