Tích hợp MinDiff với MinDiffModel

Giới thiệu

Có hai bước để tích hợp MinDiff vào mô hình của bạn:

  1. Chuẩn bị dữ liệu (được nêu trong các hướng dẫn chuẩn bị đầu vào ).

  2. Thay đổi hoặc tạo một mô hình sẽ tích hợp MinDiff trong quá trình đào tạo.

Hướng dẫn này sẽ giới thiệu cách đơn giản nhất để hoàn thành bước thứ hai: sử dụng MinDiffModel .

Thành lập

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

Đầu tiên, tải xuống dữ liệu. Đối với tính cô đọng, logic chuẩn bị đầu vào đã được yếu tố ra thành các hàm helper như mô tả trong hướng dẫn chuẩn bị đầu vào . Bạn có thể đọc hướng dẫn đầy đủ để biết chi tiết về quy trình này.

# Original DataFrame for training, sampled at 0.3 for reduced runtimes.
train_df = tutorials_utils.get_uci_data(split='train', sample=0.3)

# Dataset needed to train with MinDiff.
train_with_min_diff_ds = (
    tutorials_utils.get_uci_with_min_diff_dataset(split='train', sample=0.3))

Mô hình ban đầu

Hướng dẫn này sử dụng một cơ bản, untuned keras.Model sử dụng API chức năng để làm nổi bật bằng MinDiff. Trong một ứng dụng thế giới thực, bạn sẽ cẩn thận chọn kiến ​​trúc mô hình và sử dụng điều chỉnh để cải thiện chất lượng mô hình trước khi cố gắng giải quyết bất kỳ vấn đề công bằng nào.

Kể từ MinDiffModel được thiết kế để làm việc với hầu hết các Keras Model lớp học, chúng tôi đã yếu tố ra logic của việc xây dựng mô hình thành một hàm helper: get_uci_model .

Đào tạo với Pandas DataFrame

Hướng dẫn này đào tạo qua một kỷ nguyên duy nhất để biết tốc độ, nhưng có thể dễ dàng cải thiện hiệu suất của mô hình bằng cách tăng số kỷ nguyên.

model = tutorials_utils.get_uci_model()

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

df_without_target = train_df.drop(['target'], axis=1)  # Drop 'target' for x.
_ = model.fit(
    x=dict(df_without_target),  # The model expects a dictionary of features.
    y=train_df['target'],
    batch_size=128,
    epochs=1)
77/77 [==============================] - 3s 23ms/step - loss: 0.8589

Đào tạo với một tf.data.Dataset

Việc đào tạo tương đương với một tf.data.Dataset sẽ trông rất giống nhau (mặc dù khởi và tính ngẫu nhiên đầu vào có thể mang lại kết quả hơi khác nhau).

model = tutorials_utils.get_uci_model()

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

_ = model.fit(
    tutorials_utils.df_to_dataset(train_df, batch_size=128),  # Converted to Dataset.
    epochs=1)
77/77 [==============================] - 3s 23ms/step - loss: 0.6416

Tích hợp MinDiff để đào tạo

Khi dữ liệu đã được chuẩn bị xong, hãy áp dụng MinDiff cho mô hình của bạn theo các bước sau:

  1. Tạo mô hình ban đầu như bạn làm mà không có MinDiff.
original_model = tutorials_utils.get_uci_model()
  1. Bọc nó trong một MinDiffModel .
min_diff_model = min_diff.keras.MinDiffModel(
    original_model=original_model,
    loss=min_diff.losses.MMDLoss(),
    loss_weight=1)
  1. Biên dịch nó như bạn làm mà không có MinDiff.
min_diff_model.compile(optimizer='adam', loss='binary_crossentropy')
  1. Đào tạo nó với các bộ dữ liệu MinDiff ( train_with_min_diff_ds trong trường hợp này).
_ = min_diff_model.fit(train_with_min_diff_ds, epochs=1)
77/77 [==============================] - 6s 31ms/step - loss: 0.7883 - min_diff_loss: 0.0379

Đánh giá và dự báo với MinDiffModel

Cả hai đánh giá và dự đoán với một MinDiffModel cũng tương tự như làm như vậy với mô hình ban đầu.

Khi gọi evaluate bạn có thể vượt qua trong một trong hai tập dữ liệu ban đầu hoặc một chứa dữ liệu MinDiff. Nếu bạn chọn sau này, bạn cũng sẽ nhận được min_diff_loss metric ngoài bất kỳ số liệu khác được đo loss cũng sẽ bao gồm các min_diff_loss .

Khi gọi evaluate bạn có thể vượt qua trong một trong hai tập dữ liệu ban đầu hoặc một chứa dữ liệu MinDiff. Nếu bạn bao gồm MinDiff trong cuộc gọi để đánh giá, hai điều sẽ khác nhau:

  • Một số liệu bổ sung được gọi min_diff_loss sẽ có mặt tại đầu ra.
  • Giá trị của loss số liệu sẽ là tổng của bản gốc loss số liệu (không hiển thị trong kết quả) và min_diff_loss .
_ = min_diff_model.evaluate(
    tutorials_utils.df_to_dataset(train_df, batch_size=128))
# Calling with MinDiff data will include min_diff_loss in metrics.
_ = min_diff_model.evaluate(train_with_min_diff_ds)
77/77 [==============================] - 2s 22ms/step - loss: 0.4638
77/77 [==============================] - 3s 32ms/step - loss: 0.5087 - min_diff_loss: 0.0451

Khi gọi predict bạn có thể về mặt kỹ thuật cũng vượt qua trong các tập dữ liệu với dữ liệu MinDiff nhưng nó sẽ bị bỏ qua và không ảnh hưởng đến đầu ra.

_ = min_diff_model.predict(
    tutorials_utils.df_to_dataset(train_df, batch_size=128))
_ = min_diff_model.predict(train_with_min_diff_ds)  # Identical to results above.

Hạn chế của việc sử dụng MinDiffModel trực tiếp

Khi sử dụng MinDiffModel như mô tả ở trên, hầu hết các phương pháp này sẽ sử dụng các cài đặt mặc định của tf.keras.Model (trường hợp ngoại lệ được liệt kê trong tài liệu API ).

print('MinDiffModel.fit == keras.Model.fit')
print(min_diff.keras.MinDiffModel.fit == tf.keras.Model.fit)
print('MinDiffModel.train_step == keras.Model.train_step')
print(min_diff.keras.MinDiffModel.train_step == tf.keras.Model.train_step)
MinDiffModel.fit == keras.Model.fit
True
MinDiffModel.train_step == keras.Model.train_step
True

Đối với keras.Sequential hoặc keras.Model , đây là hoàn toàn tốt đẹp kể từ khi họ sử dụng các chức năng tương tự.

print('Sequential.fit == keras.Model.fit')
print(tf.keras.Sequential.fit == tf.keras.Model.fit)
print('tf.keras.Sequential.train_step == keras.Model.train_step')
print(tf.keras.Sequential.train_step == tf.keras.Model.train_step)
Sequential.fit == keras.Model.fit
True
tf.keras.Sequential.train_step == keras.Model.train_step
True

Tuy nhiên, nếu mô hình của bạn là một lớp con của keras.Model , gói nó với MinDiffModel hiệu quả sẽ mất khách hàng.

class CustomModel(tf.keras.Model):

  def train_step(self, **kwargs):
    pass  # Custom implementation.

print('CustomModel.train_step == keras.Model.train_step')
print(CustomModel.train_step == tf.keras.Model.train_step)
CustomModel.train_step == keras.Model.train_step
False

Nếu đây là trường hợp sử dụng của bạn, bạn không nên sử dụng MinDiffModel trực tiếp. Thay vào đó, bạn sẽ cần phải phân lớp nó như mô tả trong hướng dẫn tùy biến .

Tài nguyên bổ sung