簡介
整合 MinDiff 到模型中有兩個步驟
準備資料 (涵蓋於輸入準備指南中)。
修改或建立將在訓練期間整合 MinDiff 的模型。
本指南將涵蓋完成第二個步驟的最簡單方法:使用 MinDiffModel
。
設定
pip install --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 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))
原始模型
本指南使用基本的未調整 keras.Model
,並使用Functional API 來重點說明 MinDiff 的用法。在實際應用中,您會先仔細選擇模型架構並使用調整來改善模型品質,然後再嘗試解決任何公平性問題。
由於 MinDiffModel
的設計目的是與大多數 Keras Model
類別搭配使用,因此我們已將建構模型的邏輯分解為輔助函式:get_uci_model
。
使用 Pandas DataFrame 進行訓練
本指南訓練單一週期以求快速,但可以透過增加週期數來輕鬆改善模型的效能。
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)
使用 tf.data.Dataset
進行訓練
使用 tf.data.Dataset
的對等訓練看起來會非常相似 (雖然初始化和輸入隨機性可能會產生稍微不同的結果)。
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)
整合 MinDiff 以進行訓練
資料準備完成後,請按照下列步驟將 MinDiff 套用至您的模型
- 建立原始模型,就像您在沒有 MinDiff 的情況下所做的一樣。
original_model = tutorials_utils.get_uci_model()
- 將其包裝在
MinDiffModel
中。
min_diff_model = min_diff.keras.MinDiffModel(
original_model=original_model,
loss=min_diff.losses.MMDLoss(),
loss_weight=1)
- 編譯它,就像您在沒有 MinDiff 的情況下所做的一樣。
min_diff_model.compile(optimizer='adam', loss='binary_crossentropy')
- 使用 MinDiff 資料集 (在本例中為
train_with_min_diff_ds
) 訓練它。
_ = min_diff_model.fit(train_with_min_diff_ds, epochs=1)
使用 MinDiffModel
進行評估和預測
使用 MinDiffModel
進行評估和預測與使用原始模型非常相似。
在呼叫 evaluate
時,您可以傳入原始資料集或包含 MinDiff 資料的資料集。如果您選擇後者,除了測量的任何其他指標外,您還會取得 min_diff_loss
指標,loss
也會包含 min_diff_loss
。
在呼叫 evaluate
時,您可以傳入原始資料集或包含 MinDiff 資料的資料集。如果您在呼叫評估時包含 MinDiff,則會有兩件事不同
- 輸出中會出現一個名為
min_diff_loss
的額外指標。 loss
指標的值將是原始loss
指標 (未在輸出中顯示) 和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)
在呼叫 predict
時,您也可以在技術上傳入包含 MinDiff 資料的資料集,但系統會忽略它,且不會影響輸出。
_ = 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.
直接使用 MinDiffModel
的限制
當如上所述使用 MinDiffModel
時,大多數方法都會使用 tf.keras.Model
的預設實作 (例外情況列於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)
對於 keras.Sequential
或 keras.Model
,這完全沒問題,因為它們使用相同的函式。
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)
但是,如果您的模型是 keras.Model
的子類別,則使用 MinDiffModel
包裝它會有效地失去自訂功能。
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)
如果這是您的使用案例,則不應直接使用 MinDiffModel
。相反地,您需要對其進行子類別化,如自訂指南中所述。