Мне трудно понять, как работает двоичная классификационная головка в 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 (label, 1), решил проблемуе.Теперь я понимаю, почему logits_dimension равно 1. Однако это все еще не решает мою актуальную проблему.Который состоит в том, что бинарный классификатор просто не работает, когда обернут в multi_head.Результаты классификации всегда неверны.
Если мы представим простой тривиальный пример, включим одну категориальную переменную с именем: CAT_XXX, где XXX - число от 1 до 100. Если мы создаем две целевые переменные;
- Target_2: 0, если XXX% 2 == 0, 1, если XXX% 3 == 0, иначе 2
- Target_3: 0, если XXX% 2 == 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.Просто, когда он завернут в многоголовку, кажется, что все идет не так.
Кухан