Как передать sample_weights в модель Keras - PullRequest
0 голосов
/ 06 марта 2020

Я работаю над созданием взвешенной модели Keras в TFX, чтобы уменьшить вес одной функции в моей модели, которая создает проблемы справедливости. Если я не ошибаюсь, я думаю, что использование 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. Правильно ли я думаю о понижении веса? Большинство документов, которые я видел, используют параметр weight_column в tf.estimator, который отличается от Keras. Например, .
  2. Если это правильный способ думать об этом, как я могу правильно передать параметр sample_weights?

Большое спасибо заранее!

1 Ответ

0 голосов
/ 06 марта 2020

Для начала аргументы sample_weights передаются методу fit () модели после того, как он уже был инициализирован (вы передаете его во время инициализации).

Во-вторых, это используется для снижения значимости любой конкретной выборки для функции потерь и, следовательно, для процесса обучения в целом.

Существует несколько способов "улучшения справедливости". "самое простое: отбросьте" несправедливую функцию в целом ". Еще лучше найти инженерные / комбинированные / умноженные функции, которые при объединении / умножении с «недобросовестным признаком» устраняют вклад «несправедливого признака» в смещение (само по себе). третье: вы можете попытаться уменьшить количество примеров с помощью «несправедливой функции», но это может привести к снижению точности из-за сокращения обучения другим аспектам этих примеров. Я бы сказал, что второй вариант инженерных функций путем их умножения является наилучшим, если у вас есть время, а удаление функции в целом является вторым лучшим. Я не думаю, что взвешивание - это путь к go, если ваша цель / проблема - справедливость. Однако, если у вас есть несбалансированный набор данных, может быть нецелесообразно использовать sample_weights или Class_weights Как установить веса классов для несбалансированных классов в Keras?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...