سفارشی سازی 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 روش، شما نیاز به یک کلاس سفارشی که زیر کلاس هر دو 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 مجموعه داده را دسته متشکل از تاپل (x, y) که در آن x بینی حاوی 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 همان طور که در این راهنمای در مورد این موضوع .

منابع اضافی