为什么Tensorflow中的二进制分类头为logit_dimension = 1?

问题描述 投票:1回答:1

我很难理解二进制分类头在Tensorflow中是如何工作的。我正在尝试在Tensorflow中创建自定义多头估算器。我的代码如下所示:

def model_fn_multihead(features, labels, mode, params):
    # Create simple heads and specify head name.
    head_target_0 = tf.contrib.estimator.binary_classification_head(name=target_0)

    head_target_1 = tf.contrib.estimator.multi_class_head(n_classes=3, name=target_1)

    # Create multi-head from two simple heads.
    head = tf.contrib.estimator.multi_head([head_target_0, head_target_1])
    # Create logits for each head, and combine them into a dict.

    net = tf.feature_column.input_layer(features, params['feature_columns'])
    for idx, units in enumerate(params['hidden_units']):
        net = tf.layers.dense(net, units=units, activation=tf.nn.relu, name='fully_connected_%d' % idx)

    # Compute logits (1 per class).
    logits_0 = tf.layers.dense(net, 2, activation=None, name='logits_0')
    logits_1 = tf.layers.dense(net, 3, activation=None, name='logits_1')

    logits = {target_0: logits_0, target_1: logits_1}

    def _train_op_fn(loss):
        return tf.train.AdagradOptimizer(learning_rate=0.01).minimize(loss, global_step=tf.train.get_global_step())    

    return head.create_estimator_spec(features=features, labels=labels, mode=mode, logits=logits, train_op_fn=_train_op_fn)

[问题是,如果我按原样运行代码,Tensorflow抱怨logits_0的尺寸错误,如果我在tensorflow\contrib\estimator\python\estimator\multi_head.py处挖掘源代码,则期望logits的尺寸为“ 1”代表“ logits_0” ,但显然在二进制分类器中有两个类,这是怎么回事?如果将维度设置为“ 1”,则代码将运行,但是在训练中我总是会得到无意义的结果。即使只有一个琐碎的功能,也可以了解1/0目标之间的差异。

此代码非常适合多个,多个类的头(n_class> 2)。

我正在使用Tensorflow 1.4。我只是误解了什么吗?也许我的输入格式不正确?

更新:

我弄清楚了问题所在,即Tensorflow期望一个类型为“ bool”的张量,仅提交1、0、0、1等标签,并用tf.equal(包裹标签)是不够的。标签,1)解决了问题。现在,我知道为什么logits_dimension为1。但是,这仍然不能解决我的实际问题。这就是说,将二进制分类器包裹在multi_head中似乎不起作用。分类结果总是错误的。

[如果我们提交一个简单的例子,涉及一个名为CAT_XXX的分类变量,其中XXX是1到100之间的数字。如果我们构造两个目标变量;

  • 目标_2:如果XXX%2 == 0,则为0,如果XXX%3 == 0,则为1,否则为2
  • Target_3:如果XXX%2 == 0,则为0,否则为1
  • 我们可以构造一个琐碎的多头,多分类问题。在这种情况下,我得到如下结果:

accuracy/Target_2: 1.0
accuracy/Target_3: 0.600072
accuracy_baseline/Target_3: 0.600072
auc/Target_3: 0.497585
auc_precision_recall/Target_3: 0.399472
average_loss/Target_2: 0.000260735
average_loss/Target_3: 0.673509
global_step: 11720
label/mean/Target_3: 0.399928
loss: 21.5472
prediction/mean/Target_3: 0.399628

您可以看到已经很好地预测了多类目标,但是二元问题是胡说八道。问题是,binary_classification头可以作为DNNEstimator的独立输入正常工作。只是当它包裹在一个多头中时,事情似乎出了问题。

Kuhan

我很难理解二进制分类头在Tensorflow中是如何工作的。我正在尝试在Tensorflow中创建自定义多头估算器。我的代码如下:def ...

python machine-learning tensorflow-estimator
1个回答
0
投票

当选择binary_classification_head()时,我在模型中看到相同的行为。您是否同时解决了这个难题?

© www.soinside.com 2019 - 2024. All rights reserved.