首页 > 解决方案 > 如何将 sample_weights 传递给 Keras 模型

问题描述

我正在开发 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 参数?

提前谢谢了!

标签: pythontensorflowkeras

解决方案


对于初学者, sample_weights 参数在它已经被初始化之后被传递给模型的 fit() 方法(你在初始化期间传递它)。

其次,这用于降低任何给定样本对损失函数的重要性,从而降低对整个学习过程的重要性。

有多种“提高公平性”最简单的方法:完全放弃“不公平特征”。更好的是,找到工程/组合/相乘特征,当与“不公平特征”组合/相乘时,可以消除“不公平特征”对偏差的贡献(单独)。第三:您可以尝试使用“不公平特征”降低示例的权重,但这可能会由于从这些示例的其他方面学习的减少而导致准确性降低。如果你有时间的话,我会说通过将它们相乘来设计特性的第二种选择是最好的,而完全放弃该特性是次优的。如果您的目标/问题是公平,我不认为加权是要走的路。但是,如果您有一个不平衡的数据集,则使用 sample_weights 或 Class_weights 可能会很不方便如何为 Keras 中的不平衡类设置类权重?


推荐阅读