如何将sample_weights传递给Keras模型

时间:2020-03-05 22:42:02

标签: python tensorflow keras

我正在开发TFX中的加权Keras模型,以减轻模型中存在公平性问题的一个功能。如果我没记错的话,我相信根据此文档enter link description here,我正在寻找使用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不同。 For example
  2. 如果这是考虑此问题的正确方法,那么如何正确传递sample_weights参数?

非常感谢!

1 个答案:

答案 0 :(得分:0)

对于初学者来说,sample_weights参数已被初始化(在初始化过程中传递给它),然后传递给Model的fit()方法。

第二,这用于降低任何给定样本对损失函数以及整个学习过程的重要性。

有多种方法可以最简单地“改善公平性”:完全放弃“不公平特征”。 更好的是,找到经过工程设计/组合/相乘的特征,当它们与“不公平特征”组合/相乘时,消除了“不公平特征”对偏差的影响(自行)。 第三:您可以尝试减少带有“不公平功能”的示例的权重,但是由于减少了从这些示例的其他方面的学习,因此可能会导致准确性下降。 我想说,如果有时间的话,通过乘以特征来选择工程特征的第二种选择是最好的,而完全放弃特征是第二好的选择。 我认为,如果您的目标/问题是公平的,那么加权并不是要走的路。但是,如果数据集不平衡,则使用sample_weights或Class_weights How to set class weights for imbalanced classes in Keras?