บทนำ
ในกรณีส่วนใหญ่ใช้ MinDiffModel
โดยตรงตามที่อธิบายไว้ใน "การบูรณาการกับ MinDiff MinDiffModel แนะนำ" ก็เพียงพอแล้ว อย่างไรก็ตาม เป็นไปได้ว่าคุณจะต้องมีพฤติกรรมที่ปรับแต่งเอง สาเหตุหลักสองประการสำหรับสิ่งนี้คือ:
-
keras.Model
คุณกำลังใช้มีพฤติกรรมที่กำหนดเองที่คุณต้องการที่จะรักษา - คุณต้องการ
MinDiffModel
การทำงานแตกต่างจากค่าเริ่มต้น
ในทั้งสองกรณีที่คุณจะต้องซับคลาส MinDiffModel
เพื่อให้บรรลุผลที่ต้องการ
ติดตั้ง
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
ขั้นแรกให้ดาวน์โหลดข้อมูล สำหรับความกะทัดรัดตรรกะการเตรียมการป้อนข้อมูลที่ได้รับปัจจัยออกไปในฟังก์ชั่นผู้ช่วยที่อธิบายไว้ใน คู่มือการเตรียมการป้อนข้อมูล คุณสามารถอ่านคู่มือฉบับเต็มสำหรับรายละเอียดเกี่ยวกับกระบวนการนี้
# 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 ตามที่อธิบายไว้ ที่นี่ หากโมเดลของคุณได้ปรับแต่งการใช้งานที่คุณต้องการที่จะรักษาเมื่อใช้ MinDiff คุณจะต้องซับคลาส MinDiffModel
โมเดลกำหนดเองดั้งเดิม
เพื่อดูว่าคุณสามารถเก็บการปรับแต่งสร้างรูปแบบที่กำหนดเองที่กำหนดแอตทริบิวต์ True
เมื่อกำหนดเอง train_step
เรียกว่า นี่ไม่ใช่การปรับแต่งที่มีประโยชน์แต่จะใช้เพื่อแสดงพฤติกรรม
class CustomModel(tf.keras.Model):
# Customized train_step
def train_step(self, *args, **kwargs):
self.used_custom_train_step = True # Marker that we can check for.
return super(CustomModel, self).train_step(*args, **kwargs)
การฝึกอบรมรูปแบบดังกล่าวจะมีลักษณะเช่นเดียวกับปกติ Sequential
รุ่น
model = tutorials_utils.get_uci_model(model_class=CustomModel) # Use CustomModel.
model.compile(optimizer='adam', loss='binary_crossentropy')
_ = model.fit(train_ds.take(1), epochs=1, verbose=0)
# Model has used the custom train_step.
print('Model used the custom train_step:')
print(hasattr(model, 'used_custom_train_step')) # True
Model used the custom train_step: True
คลาสย่อย MinDiffModel
หากคุณกำลังจะลองและใช้ MinDiffModel
โดยตรงรูปแบบจะไม่ใช้กำหนดเอง train_step
model = tutorials_utils.get_uci_model(model_class=CustomModel)
model = min_diff.keras.MinDiffModel(model, min_diff.losses.MMDLoss())
model.compile(optimizer='adam', loss='binary_crossentropy')
_ = model.fit(train_with_min_diff_ds.take(1), epochs=1, verbose=0)
# Model has not used the custom train_step.
print('Model used the custom train_step:')
print(hasattr(model, 'used_custom_train_step')) # False
Model used the custom train_step: False
เพื่อที่จะใช้ที่ถูกต้อง train_step
วิธีคุณต้องมีระดับที่กำหนดเองที่คลาสย่อยทั้ง MinDiffModel
และ CustomModel
class CustomMinDiffModel(min_diff.keras.MinDiffModel, CustomModel):
pass # No need for any further implementation.
การฝึกอบรมรุ่นนี้จะใช้ train_step
จาก CustomModel
model = tutorials_utils.get_uci_model(model_class=CustomModel)
model = CustomMinDiffModel(model, min_diff.losses.MMDLoss())
model.compile(optimizer='adam', loss='binary_crossentropy')
_ = model.fit(train_with_min_diff_ds.take(1), epochs=1, verbose=0)
# Model has used the custom train_step.
print('Model used the custom train_step:')
print(hasattr(model, 'used_custom_train_step')) # True
Model used the custom train_step: True
พฤติกรรมการปรับแต่งค่าเริ่มต้นของ MinDiffModel
ในกรณีอื่น ๆ ที่คุณอาจต้องการที่จะเปลี่ยนพฤติกรรมการเริ่มต้นที่เฉพาะเจาะจงของ MinDiffModel
ส่วนใหญ่กรณีการใช้งานทั่วไปของนี้มีการเปลี่ยนแปลงเริ่มต้นการเปิดออกพฤติกรรมที่จะต้องจัดการกับข้อมูลของคุณถ้าคุณไม่ได้ใช้ pack_min_diff_data
เมื่อบรรจุข้อมูลในรูปแบบที่กำหนดเอง อาจปรากฏขึ้นดังนี้
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)
return ({
'min_diff_data': min_diff_data,
'original_inputs': original_inputs}, original_labels)
customized_train_with_min_diff_ds = train_with_min_diff_ds.map(_reformat_input)
customized_train_with_min_diff_ds
ชุดแบทช์ผลตอบแทนประกอบด้วยสิ่งอันดับ (x, y)
ที่ x
เป็น Dict ที่มี min_diff_data
และ original_inputs
และ y
เป็น original_labels
for x, _ in customized_train_with_min_diff_ds.take(1):
print('Type of x:', type(x)) # dict
print('Keys of x:', x.keys()) # 'min_diff_data', 'original_inputs'
Type of x: <class 'dict'> Keys of x: dict_keys(['min_diff_data', 'original_inputs'])
รูปแบบข้อมูลนี้ไม่ได้เป็นสิ่งที่ MinDiffModel
คาดว่าโดยค่าเริ่มต้นและผ่าน customized_train_with_min_diff_ds
มันจะส่งผลให้พฤติกรรมที่ไม่คาดคิด ในการแก้ไขปัญหานี้ คุณจะต้องสร้างคลาสย่อยของคุณเอง
class CustomUnpackingMinDiffModel(min_diff.keras.MinDiffModel):
def unpack_min_diff_data(self, inputs):
return inputs['min_diff_data']
def unpack_original_inputs(self, inputs):
return inputs['original_inputs']
ด้วยคลาสย่อยนี้ คุณสามารถฝึกได้เหมือนกับตัวอย่างอื่นๆ
model = tutorials_utils.get_uci_model()
model = CustomUnpackingMinDiffModel(model, min_diff.losses.MMDLoss())
model.compile(optimizer='adam', loss='binary_crossentropy')
_ = model.fit(customized_train_with_min_diff_ds, epochs=1)
77/77 [==============================] - 4s 30ms/step - loss: 0.6690 - min_diff_loss: 0.0395
ข้อ จำกัด ของการปรับแต่ง MinDiffModel
การสร้างที่กำหนดเอง MinDiffModel
ยังมีจำนวนมากของความยืดหยุ่นสำหรับกรณีการใช้งานที่ซับซ้อนมากขึ้น อย่างไรก็ตาม ยังมีบางกรณีที่จะไม่รองรับ
กระบวนการเตรียมการผลิตหรือการตรวจสอบของปัจจัยการผลิตก่อนที่จะ call
ข้อ จำกัด ที่ใหญ่ที่สุดสำหรับ subclass ของ MinDiffModel
ก็คือว่ามันต้องใช้ x
ส่วนประกอบของการป้อนข้อมูล (เช่นองค์ประกอบแรกหรือเฉพาะในชุดส่งกลับโดย tf.data.Dataset
) ที่จะผ่านได้โดยไม่ต้อง preprocessing หรือการตรวจสอบเพื่อ call
นี้เป็นเพียงเพราะ min_diff_data
ถูกบรรจุลงใน x
ส่วนประกอบของการป้อนข้อมูล preprocessing ใด ๆ หรือการตรวจสอบจะไม่ได้คาดหวังว่าโครงสร้างเพิ่มเติมที่มี min_diff_data
และมีแนวโน้มที่จะทำลาย
หากการประมวลผลล่วงหน้าหรือการตรวจสอบความถูกต้องนั้นปรับแต่งได้ง่าย (เช่น แยกตัวประกอบในวิธีการของตนเอง) ปัญหานี้สามารถแก้ไขได้ง่ายโดยการแทนที่เพื่อให้แน่ใจว่าจัดการโครงสร้างเพิ่มเติมได้อย่างถูกต้อง
ตัวอย่างที่มีการตรวจสอบความถูกต้องอาจมีลักษณะดังนี้:
class CustomMinDiffModel(min_diff.keras.MinDiffModel, CustomModel):
# Override so that it correctly handles additional `min_diff_data`.
def validate_inputs(self, inputs):
original_inputs = self.unpack_original_inputs(inputs)
... # Optionally also validate min_diff_data
# Call original validate method with correct inputs
return super(CustomMinDiffModel, self).validate(original_inputs)
หากประมวลผลเบื้องต้นการตรวจสอบหรือไม่ได้ปรับแต่งได้ง่ายแล้วใช้ MinDiffModel
อาจไม่ทำงานสำหรับคุณและคุณจะต้องบูรณาการ MinDiff โดยไม่ได้อธิบายไว้ใน คู่มือนี้
ชื่อเมธอดชนกัน
เป็นไปได้ว่ารูปแบบของคุณมีวิธีการที่มีชื่อปะทะกับผู้ดำเนินการใน MinDiffModel
(ดูรายการเต็มรูปแบบของวิธีการของประชาชนใน เอกสาร API )
นี่เป็นปัญหาก็ต่อเมื่อสิ่งเหล่านี้จะถูกเรียกใช้บนอินสแตนซ์ของโมเดล (แทนที่จะเป็นวิธีอื่นภายใน) ในขณะที่ไม่น่าจะสูงถ้าคุณอยู่ในสถานการณ์นี้คุณจะต้องแทนที่และเปลี่ยนชื่อทั้งวิธีการบางอย่างหรือถ้าไม่ได้คุณอาจต้องพิจารณาการบูรณาการโดยไม่ต้อง MinDiff MinDiffModel
ที่อธิบายไว้ใน คู่มือนี้ในเรื่อง
แหล่งข้อมูลเพิ่มเติม
- สำหรับในการอภิปรายเชิงลึกเกี่ยวกับการประเมินผลความเป็นธรรมดู คำแนะนำความเป็นธรรมชี้วัด
- สำหรับข้อมูลทั่วไปเกี่ยวกับการฟื้นฟูและ MinDiff ดูที่ ภาพรวมของการฟื้นฟู
- สำหรับรายละเอียดเกี่ยวกับข้อกำหนดโดยรอบ MinDiff ดู คำแนะนำนี้
- หากต้องการดูแบบ end-to-end กวดวิชาเกี่ยวกับการใช้ MinDiff ใน Keras ดู การกวดวิชานี้