簡體   English   中英

如何將 sample_weights 傳遞給 Keras 模型

[英]How to pass sample_weights into a Keras Model

我正在 TFX 中開發加權 Keras 模型,以減輕模型中導致公平性問題的一個特征的權重。 如果我沒記錯的話,我相信使用 sample_weights 是我根據本文檔尋找的內容,請在此處輸入鏈接描述

def _keras_model_builder():
  """Build a keras model for COMPAS dataset classification."""
  feature_columns = []
  feature_layer_inputs = {}

  for key in transformed_names(INT_FEATURE_KEYS):
    feature_columns.append(tf.feature_column.numeric_column(key))
    feature_layer_inputs[key] = tf.keras.Input(shape=(1,), name=key)

  for key, num_buckets in zip(transformed_names(CATEGORICAL_FEATURE_KEYS),
                              MAX_CATEGORICAL_FEATURE_VALUES):
    categorical_column = tf.feature_column.categorical_column_with_identity(
                key, num_buckets=num_buckets)
    feature_columns.append(
        tf.feature_column.indicator_column(categorical_column))
    feature_layer_inputs[key] = tf.keras.Input(
        shape=(1,), name=key, dtype=tf.dtypes.int32)

  feature_columns_input = tf.keras.layers.DenseFeatures(feature_columns)
  feature_layer_outputs = feature_columns_input(feature_layer_inputs)

  dense_layers = tf.keras.layers.Dense(
      20, activation=tf.nn.relu, name='dense_1')(feature_layer_outputs)
  dense_layers = tf.keras.layers.Dense(
      10, activation=tf.nn.relu, name='dense_2')(dense_layers)
  dense_layers = tf.keras.layers.Dense(
      5, activation=tf.nn.relu, name='dense_3')(dense_layers)
  dense_layers = tf.keras.layers.BatchNormalization()(dense_layers)
  output = tf.keras.layers.Dense(
      1, name='predictions')(dense_layers)

  inputs = [v for v in feature_layer_inputs.values()]
  sample_weights = tf.keras.layers.Input(
      shape=[1], dtype=tf.float32, name='race_xf')

  model = tf.keras.Model(inputs=inputs,
                         sample_weights=sample_weights,
                         outputs=output)    
  model.compile(
      loss=tf.keras.losses.MeanAbsoluteError(),
      optimizer=tf.optimizers.Adamax(learning_rate=_LEARNING_RATE))
  return model

但是,此代碼產生以下錯誤:

TypeError: ('Functional models may only specify `name` and `trainable` keyword arguments during initialization. Got an unexpected argument:', 'sample_weights')

這是一個由兩部分組成的問題,但是

  1. 我是否在考慮正確減重? 我見過的大多數文檔都在 tf.estimator 中使用了 weight_column 參數,這與 Keras 不同。 例如
  2. 如果這是考慮此問題的正確方法,我該如何正確傳入 sample_weights 參數?

提前謝謝了!

對於初學者來說,sample_weights 參數在模型已經初始化(您在初始化期間傳遞它)之后被傳遞給模型的 fit() 方法。

其次,這用於降低任何給定樣本對損失函數以及整個學習過程的重要性。

有多種方法可以“提高公平性”,最簡單的是:完全放棄“不公平的特征”。 更好的是,找到工程/組合/相乘的特征,當與“不公平特征”組合/相乘時,消除“不公平特征”對偏差的貢獻(單獨)。 第三:您可以嘗試使用“不公平特征”降低示例的權重,但這可能會由於從這些示例的其他方面的學習減少而導致准確性降低。 如果你有時間,我會說通過將它們相乘來設計功能的第二個選項是最好的,並且完全刪除該功能是第二好的。 如果您的目標/問題是公平,我不認為加權是可行的方法。 但是,如果您有一個不平衡的數據集,那么使用 sample_weights 或 Class_weights 可能是有用的如何在Keras 中為不平衡的類設置類權重?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM