ভূমিকা
আপনার মডেলের বাস্তবায়নে সরাসরি 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 প্রয়োগ করার জন্য মডেলের মধ্যে কীভাবে এটি ব্যবহার করা হয় উভয়ই সম্পূর্ণরূপে নিয়ন্ত্রণ করতে পারেন।
অতিরিক্ত সম্পদ
- সততা মূল্যায়ন উপর গভীরতা আলোচনায় একটি দেখুন ফর্সা সূচক নির্দেশিকা
- উপসম এবং MinDiff বিষয়ে সাধারণ তথ্যের জন্য, দেখুন উপসম ওভারভিউ ।
- MinDiff পার্শ্ববর্তী প্রয়োজনীয়তা উপর বিস্তারিত জানার জন্য দেখুন এই সহায়িকার ।
- Keras মধ্যে MinDiff ব্যবহার করে একটি এন্ড-টু-এন্ড টিউটোরিয়াল দেখার জন্য, দেখুন এই টিউটোরিয়াল ।