pengantar
Ada dua langkah untuk mengintegrasikan MinDiff ke dalam model Anda:
Menyiapkan data (tercakup dalam panduan persiapan masukan ).
Ubah atau buat model yang akan mengintegrasikan MinDiff selama pelatihan.
Panduan ini akan mencakup cara paling sederhana untuk menyelesaikan langkah kedua: menggunakan MinDiffModel .
Mempersiapkan
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
Pertama, unduh datanya. Untuk kekompakan, logika persiapan input telah diperhitungkan keluar ke fungsi pembantu seperti yang dijelaskan dalam panduan persiapan masukan . Anda dapat membaca panduan lengkap untuk detail tentang proses ini.
# 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))
Model Asli
Panduan ini menggunakan dasar, yg tak disetel keras.Model menggunakan API Fungsional untuk menyorot menggunakan MinDiff. Dalam aplikasi dunia nyata, Anda akan dengan hati-hati memilih arsitektur model dan menggunakan penyetelan untuk meningkatkan kualitas model sebelum mencoba mengatasi masalah keadilan apa pun.
Sejak MinDiffModel dirancang untuk bekerja dengan sebagian Keras Model kelas, kami telah keluar faktor logika membangun model ke fungsi pembantu: get_uci_model .
Pelatihan dengan Pandas DataFrame
Panduan ini melatih lebih dari satu zaman untuk kecepatan, tetapi dapat dengan mudah meningkatkan kinerja model dengan meningkatkan jumlah zaman.
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
Pelatihan dengan tf.data.Dataset
Setara pelatihan dengan tf.data.Dataset akan terlihat sangat mirip (meskipun inisialisasi dan masukan keacakan dapat menghasilkan hasil yang sedikit berbeda).
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
Mengintegrasikan MinDiff untuk pelatihan
Setelah data disiapkan, terapkan MinDiff ke model Anda dengan langkah-langkah berikut:
- Buat model asli seperti yang Anda lakukan tanpa MinDiff.
original_model = tutorials_utils.get_uci_model()
- Bungkus dalam
MinDiffModel.
min_diff_model = min_diff.keras.MinDiffModel(
original_model=original_model,
loss=min_diff.losses.MMDLoss(),
loss_weight=1)
- Kompilasi seperti yang Anda lakukan tanpa MinDiff.
min_diff_model.compile(optimizer='adam', loss='binary_crossentropy')
- Melatihnya dengan dataset MinDiff (
train_with_min_diff_dsdalam hal ini).
_ = min_diff_model.fit(train_with_min_diff_ds, epochs=1)
77/77 [==============================] - 6s 31ms/step - loss: 0.7883 - min_diff_loss: 0.0379
Evaluasi dan Prediksi dengan MinDiffModel
Kedua mengevaluasi dan memprediksi dengan MinDiffModel mirip dengan melakukannya dengan model asli.
Saat memanggil evaluate Anda dapat lulus baik dalam dataset asli atau yang berisi data MinDiff. Jika Anda memilih yang terakhir, Anda juga akan mendapatkan min_diff_loss metrik tambahan dari setiap metrik lainnya yang diukur loss juga akan mencakup min_diff_loss .
Saat memanggil evaluate Anda dapat lulus baik dalam dataset asli atau yang berisi data MinDiff. Jika Anda menyertakan MinDiff dalam panggilan untuk mengevaluasi, dua hal akan berbeda:
- Metrik tambahan yang disebut
min_diff_lossakan hadir di output. - Nilai
lossmetrik akan menjadi jumlah aslilossmetrik (tidak ditampilkan dalam output) danmin_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
Saat memanggil predict Anda secara teknis bisa juga lulus dalam dataset dengan data MinDiff tetapi akan diabaikan dan tidak mempengaruhi output.
_ = 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.
Keterbatasan menggunakan MinDiffModel langsung
Bila menggunakan MinDiffModel seperti dijelaskan di atas, metode yang paling akan menggunakan implementasi default tf.keras.Model (pengecualian tercantum dalam dokumentasi 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
Untuk keras.Sequential atau keras.Model , ini baik-baik saja karena mereka menggunakan fungsi yang sama.
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
Namun, jika model Anda adalah subclass dari keras.Model , membungkusnya dengan MinDiffModel efektif akan kehilangan kustomisasi.
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
Jika ini adalah kasus penggunaan Anda, Anda tidak harus menggunakan MinDiffModel langsung. Sebaliknya, Anda akan perlu subclass itu seperti yang dijelaskan dalam panduan kustomisasi .
Sumber daya tambahan
- Untuk dalam diskusi mendalam mengenai evaluasi kewajaran melihat bimbingan Keadilan Indikator
- Untuk informasi umum tentang Remediasi dan MinDiff, melihat remediasi gambaran .
- Untuk rincian tentang persyaratan sekitarnya MinDiff melihat panduan ini .
- Untuk melihat tutorial end-to-end menggunakan MinDiff di Keras, lihat tutorial ini .
Lihat di TensorFlow.org
Jalankan di Google Colab
Lihat sumber di GitHub
Unduh buku catatan