การปรับแต่ง MinDiffModel

บทนำ

ในกรณีส่วนใหญ่ใช้ 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 ที่อธิบายไว้ใน คู่มือนี้ในเรื่อง

แหล่งข้อมูลเพิ่มเติม