MinDiffModel को अनुकूलित करना

परिचय

ज्यादातर मामलों में, का उपयोग कर MinDiffModel सीधे रूप में वर्णित "MinDiffModel साथ MinDiff घालमेल" गाइड पर्याप्त है। हालांकि, यह संभव है कि आपको अनुकूलित व्यवहार की आवश्यकता होगी। इसके दो प्राथमिक कारण हैं:

  • 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 आसानी से के रूप में वर्णित उपवर्गीकरण के माध्यम से अनुकूलित किया जा करने के लिए डिज़ाइन किया गया है यहाँ । अपने मॉडल कार्यान्वयन है कि आप जब 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 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 अधिक जटिल उपयोग के मामलों के लिए लचीलापन की एक बड़ी राशि प्रदान करता है। हालाँकि, अभी भी कुछ किनारे के मामले हैं जो इसका समर्थन नहीं करेंगे।

पहले Preprocessing या आदानों की मान्यता call

का एक उपवर्ग के लिए सबसे बड़ी सीमा MinDiffModel है कि यह आवश्यकता है x इनपुट डेटा के घटक (यानी बैच द्वारा लौटाए में पहली या केवल तत्व tf.data.Dataset ) के माध्यम से पारित होने के लिए preprocessing या सत्यापन करने के लिए बिना 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 में वर्णित के रूप विषय पर इस गाइड

अतिरिक्त संसाधन