我很难理解二进制分类头在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之间的数字。如果我们构造两个目标变量;
我们可以构造一个琐碎的多头,多分类问题。在这种情况下,我得到如下结果:
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 ...
当选择binary_classification_head()时,我在模型中看到相同的行为。您是否同时解决了这个难题?