MinDiffModel ছাড়া MinDiff সংহত করা

ভূমিকা

আপনার মডেলের বাস্তবায়নে সরাসরি MinDiff সংহত করা সম্ভব। এমনটি ব্যবহার করার সুবিধা নেই যদিও MinDiffModel এই বিকল্পটি নিয়ন্ত্রণ যখন আপনার মডেল একটি উপশ্রেণী যা বিশেষ করে উপযোগী হতে পারে সর্বোচ্চ স্তরের উপলব্ধ করা হয় tf.keras.Model

এই নির্দেশিকাটি প্রমান কিভাবে আপনি যুক্ত করে একটি কাস্টম মডেল বাস্তবায়ন মধ্যে সরাসরি MinDiff সংহত করতে পারেন train_step পদ্ধতি।

সেটআপ

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

প্রথমে ডেটা ডাউনলোড করুন। Succinctness তখন ইনপুট প্রস্তুতি যুক্তিবিজ্ঞান বর্ণনা অনুযায়ী সাহায্যকারী ফাংশন ছড়িয়ে উপাদান হয়েছে ইনপুট প্রস্তুতি গাইড । এই প্রক্রিয়ার বিস্তারিত জানার জন্য আপনি সম্পূর্ণ গাইড পড়তে পারেন।

# 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 মাধ্যমে অনুকূলিতকরণ করা ডিজাইন করা হয়েছে। সাধারণত পরিবর্তন কি কলে ঘটে জড়িত fit হিসাবে বর্ণনা এখানে

এই নির্দেশিকাটি যেখানে একটি কাস্টম বাস্তবায়ন ব্যবহার train_step ঘনিষ্ঠভাবে ডিফল্ট বর্ণনার অনুরূপ tf.keras.Model.train_step । সাধারণত, এটি করে কোন লাভ হবে না, তবে এখানে, এটি কীভাবে MinDiff সংহত করতে হয় তা প্রদর্শন করতে সহায়তা করবে।

class CustomModel(tf.keras.Model):

  def train_step(self, data):
    # Unpack the data.
    x, y, sample_weight = tf.keras.utils.unpack_x_y_sample_weight(data)

    with tf.GradientTape() as tape:
      y_pred = self(x, training=True)  # Forward pass.
      loss = self.compiled_loss(
          y, y_pred, sample_weight, regularization_losses=self.losses)
      # Compute the loss value.
      loss = self.compiled_loss(
          y, y_pred, sample_weight, regularization_losses=self.losses)

    # Compute gradients and update weights.
    self.optimizer.minimize(loss, self.trainable_variables, tape=tape)
    # Update and return metrics.
    self.compiled_metrics.update_state(y, y_pred, sample_weight)
    return {m.name: m.result() for m in self.metrics}

মডেল ট্রেন আপনি একজন সাধারণ করবে Model ক্রিয়াগত API ব্যবহার করে।

model = tutorials_utils.get_uci_model(model_class=CustomModel)  # Use CustomModel.

model.compile(optimizer='adam', loss='binary_crossentropy')

_ = model.fit(train_ds, epochs=1)
77/77 [==============================] - 3s 22ms/step - loss: 0.7273

MinDiff সরাসরি আপনার মডেলে একত্রিত করা

থেকে MinDiff যোগ করার পদ্ধতি train_step

MinDiff সংহত করার জন্য, আপনাকে কিছু লাইন যোগ করার জন্য প্রয়োজন হবে CustomModel যা এখানে নতুন নামকরণ করা হয় CustomModelWithMinDiff

স্পষ্টতার জন্য, এই সহায়িকার একটি বুলিয়ান ফ্ল্যাগে নামক ব্যবহার apply_min_diff । MinDiff প্রাসঙ্গিক কোডের সকল শুধু এটা সেট করা হয় যদি চলবে True । যদি সেট করা False তারপর মডেল ঠিক হিসাবে একই আচরণ করবে CustomModel

min_diff_loss_fn = min_diff.losses.MMDLoss()  # Hard coded for convenience.
min_diff_weight = 2  # Arbitrary number for example, hard coded for convenience.
apply_min_diff = True  # Flag to help show where the additional lines are.

class CustomModelWithMinDiff(tf.keras.Model):

  def train_step(self, data):
    # Unpack the data.
    x, y, sample_weight = tf.keras.utils.unpack_x_y_sample_weight(data)

    # Unpack the MinDiff data.
    if apply_min_diff:
      min_diff_data = min_diff.keras.utils.unpack_min_diff_data(x)
      min_diff_x, membership, min_diff_sample_weight = (
          tf.keras.utils.unpack_x_y_sample_weight(min_diff_data))
      x = min_diff.keras.utils.unpack_original_inputs(x)

    with tf.GradientTape() as tape:
      y_pred = self(x, training=True)  # Forward pass.
      loss = self.compiled_loss(
          y, y_pred, sample_weight, regularization_losses=self.losses)
      # Compute the loss value.
      loss = self.compiled_loss(
          y, y_pred, sample_weight, regularization_losses=self.losses)

      # Calculate and add the min_diff_loss. This must be done within the scope
      # of tf.GradientTape().
      if apply_min_diff:
        min_diff_predictions = self(min_diff_x, training=True)
        min_diff_loss = min_diff_weight * min_diff_loss_fn(
            min_diff_predictions, membership, min_diff_sample_weight)
        loss += min_diff_loss

    # Compute gradients and update weights.
    self.optimizer.minimize(loss, self.trainable_variables, tape=tape)
    # Update and return metrics.
    self.compiled_metrics.update_state(y, y_pred, sample_weight)
    return {m.name: m.result() for m in self.metrics}

ব্যবহৃত ডেটাসেট বাদ দিয়ে এই মডেলের প্রশিক্ষণটি আগেরটির মতোই দেখায়।

model = tutorials_utils.get_uci_model(model_class=CustomModelWithMinDiff)

model.compile(optimizer='adam', loss='binary_crossentropy')

_ = model.fit(train_with_min_diff_ds, epochs=1)
77/77 [==============================] - 4s 30ms/step - loss: 0.7799

আপনার ইনপুট পুনরায় আকার দেওয়া (ঐচ্ছিক)

প্রদত্ত যে এই পদ্ধতিটি সম্পূর্ণ নিয়ন্ত্রণ প্রদান করে, আপনি ইনপুটটিকে কিছুটা পরিষ্কার আকারে পুনরায় আকার দেওয়ার এই সুযোগটি নিতে পারেন। ব্যবহার করার সময় MinDiffModel , min_diff_data প্রতি ব্যাচে প্রথম উপাদান মধ্যে বস্তাবন্দী করা প্রয়োজন। এই সঙ্গে কেস train_with_min_diff_ds ডেটা সেটটি।

for x, y in train_with_min_diff_ds.take(1):
  print('Type of x:', type(x))  # MinDiffPackedInputs
  print('Type of y:', type(y))  # Tensor (original labels)
Type of x: <class 'tensorflow_model_remediation.min_diff.keras.utils.input_utils.MinDiffPackedInputs'>
Type of y: <class 'tensorflow.python.framework.ops.EagerTensor'>

এই প্রয়োজনীয়তা প্রত্যাহার করা হলে, আপনি মূল এবং MinDiff ডেটা পরিষ্কারভাবে আলাদা করে কিছুটা বেশি স্বজ্ঞাত কাঠামোতে ডেটা পুনর্গঠন করতে পারেন।

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)
  original_data = (original_inputs, original_labels)

  return {
      'min_diff_data': min_diff_data,
      'original_data': original_data}

customized_train_with_min_diff_ds = train_with_min_diff_ds.map(_reformat_input)

এই ধাপটি সম্পূর্ণ ঐচ্ছিক কিন্তু ডেটা আরও ভালোভাবে সংগঠিত করার জন্য উপযোগী হতে পারে। যদি আপনি তা করেন, আপনি কিভাবে বাস্তবায়ন একমাত্র পার্থক্য CustomModelWithMinDiff হবে কিভাবে আপনি প্যাকমুক্ত data শুরুতে।

class CustomModelWithMinDiff(tf.keras.Model):

  def train_step(self, data):
    # Unpack the MinDiff data from the custom structure.
    if apply_min_diff:
      min_diff_data = data['min_diff_data']
      min_diff_x, membership, min_diff_sample_weight = (
          tf.keras.utils.unpack_x_y_sample_weight(min_diff_data))
      data = data['original_data']

    ... # possible preprocessing or validation on data before unpacking.

    x, y, sample_weight = tf.keras.utils.unpack_x_y_sample_weight(data)

    ...

এই শেষ ধাপের মাধ্যমে, আপনি ইনপুট ফর্ম্যাট এবং MinDiff প্রয়োগ করার জন্য মডেলের মধ্যে কীভাবে এটি ব্যবহার করা হয় উভয়ই সম্পূর্ণরূপে নিয়ন্ত্রণ করতে পারেন।

অতিরিক্ত সম্পদ