【问题标题】:Where does Tensorflow Weighted Cross Entropy loss function goes in the DNN Classifier Estimator function?Tensorflow 加权交叉熵损失函数在 DNN Classifier Estimator 函数中的位置?
【发布时间】:2019-02-08 22:10:43
【问题描述】:

我目前正在使用tf.estimator.DNNClassifier 研究具有高度偏斜数据(90% 负/10% 正)的二项式分类算法。 由于我训练的所有模型都会收敛以将所有样本标记为负数,因此我需要实现加权损失函数。

我在这里查看了许多不同的问题,其中许多都很有启发性。但是,我无法获得关于如何实际实现这些功能的实际端到端答案。 Thisthis 线程是最好的。

我的问题是:我想使用tf.nn.weighted_cross_entropy_with_logits(),但我不知道应该将它插入我的代码中的什么位置。

我有一个构造特征列的函数:

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)

但这对我来说没有意义。我尝试了许多不同的方法来实现它,但都没有奏效。

【问题讨论】:

    标签: python tensorflow machine-learning classification loss-function


    【解决方案1】:

    我讨厌成为坏消息的承担者,但DNN Classifier 不支持自定义损失函数:

    使用softmax交叉熵计算损失。

    这是文档中唯一提到损失(函数)的地方,我找不到任何帖子通过直接更改 DNNClassifier 来讨论解决此问题的有效方法。相反,您似乎必须构建自己的 custom Estimator

    【讨论】:

    • 没有一个预制的估计器支持自定义损失函数?
    • 好像不像,不是。
    猜你喜欢
    • 2018-05-31
    • 2017-03-14
    • 2017-11-11
    • 1970-01-01
    • 2021-07-23
    • 2017-12-26
    • 2018-03-23
    • 2019-06-19
    • 2020-03-14
    相关资源
    最近更新 更多