Где функция взвешенной перекрестной энтропии Tensorflow входит в функцию оценки классификатора DNN? - PullRequest
0 голосов
/ 04 сентября 2018

В настоящее время я работаю над алгоритмом биномиальной классификации с сильно искаженными данными (90% отрицательных / 10% положительных), используя tf.estimator.DNNClassifier. Поскольку все модели, которые я обучаю, сходятся, чтобы пометить все выборки как негативы, мне нужно реализовать функцию взвешенных потерь.

Я посмотрел здесь много разных вопросов, и многие из них освещают. Однако я не мог получить практический исчерпывающий ответ о том, как на самом деле реализовать функции. Эта и эта темы были лучшими.

Моя проблема: я хочу использовать tf.nn.weighted_cross_entropy_with_logits(), но я не знаю, куда мне вставить его в мой код.

У меня есть функция для конструирования Feature Colums:

def construct_feature_columns(input_features):
  return set([tf.feature_column.numeric_column(my_feature)
              for my_feature in input_features])

Функция, которая определяет tf.estimator.DNNClassifier, а также другие параметры, такие как оптимизатор и функция ввода:

def train_nn_classifier_model(
    learning_rate,
    steps,
    batch_size,
    hidden_units,
    training_examples,
    training_targets,
    validation_examples,
    validation_targets):

    dnn_classifier = tf.estimator.DNNClassifier(
        feature_columns=construct_feature_columns(training_examples),
        hidden_units=hidden_units,
        optimizer=my_optimizer)

Функция обучения:

dnn_classifier.train(input_fn=training_input_fn, steps=steps_per_period)

Функция прогнозирования для расчета ошибки во время тренировки:

training_probabilities = dnn_classifier.predict(input_fn=predict_training_input_fn)

Оптимизатор:

  my_optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
  my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0)

Функции ввода (для входных данных обучения, прогнозирования входных данных для обучения и входных данных для проверки):

  training_input_fn = lambda: my_input_fn(
      training_examples, 
      training_targets['True/False'], 
      batch_size=batch_size)

Куда мне вставить tf.nn.weighted_cross_entropy_with_logits, поэтому моя модель рассчитывает потери, используя эту функцию?

Кроме того, как мне вызвать targets (A Tensor of the same type and shape as logits) внутри функции кросс-энтропии? Это training_targets DataFrame, это выход input function с training_targets в качестве ввода?

А какие конкретно логиты? Потому что для меня они должны быть предсказаниями, которые исходят от функции:

training_probabilities = dnn_classifier.predict(input_fn=predict_training_input_fn)

Но это не имеет смысла для меня. Я пробовал много разных способов реализовать это, но ни один из них не сработал.

1 Ответ

0 голосов
/ 04 сентября 2018

Я ненавижу быть носителем плохих новостей, но Классификатор DNN не поддерживает пользовательские функции потерь:

Потери рассчитываются с использованием кросс-энтропии softmax.

Это единственное упоминание о потере (функциях) в документации, и я не смог найти ни одного поста, в котором говорилось бы о работающем решении этой проблемы путем прямого изменения DNNClassifier. Вместо этого, похоже, вам придется создать свой собственный пользовательский оценщик .

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