tf.estimator.add_metrics заканчивается в Shapes (Нет, 12) и (Нет,) несовместимы - PullRequest
0 голосов
/ 21 марта 2020

Я использую классификатор DNN в качестве моей оценки и хотел добавить некоторые дополнительные метрики в оценку. код, который я использую, в основном тот из документации tf.estimator.add_metrics (https://www.tensorflow.org/api_docs/python/tf/estimator/add_metrics).

def my_auc(labels, predictions):
    auc_metric = tf.keras.metrics.AUC(name="my_auc")
    auc_metric.update_state(y_true=labels, y_pred=predictions['logits'])
    return {'auc': auc_metric}


hidden_layers = len(training_data.__call__().element_spec[0])
    final_layer = len(labels)
    est = tf.estimator.DNNClassifier(feature_columns=features,
                                     hidden_units=[hidden_layers, (hidden_layers / 2), (hidden_layers / 4),
                                                   final_layer],
                                     n_classes=final_layer, label_vocabulary=labels)
    est = tf.estimator.add_metrics(est, my_auc)

# Training
    est.train(training_data, max_steps=100)

# Validation
    result = est.evaluate(validation_data)

Модель отлично работает без оператора add_metrics. Но возникает ошибка ValueError: «Формы (None, 12) и (None,) несовместимы» при их включении. Ошибка возникает в строке:

auc_metric.update_state(y_true=labels, y_pred=predictions['logits'])

Строка вызывается est.evaluate (validation_data).

Мне не понятно, почему это происходит, но похоже, что y_true Параметр заполнен неправильно. Следовательно, столбец метки не обрабатывается правильно для функции. Это кажется странным, так как модель работает корректно без дополнительных показателей c. Данные обучения и проверки создаются с помощью следующей функции:

def get_dataset_from_tensor_slices(data_input, label_column, n_epochs=None, shuffle=True):
    def get_dataset():
        dataset = tf.data.Dataset.from_tensor_slices((dict(data_input), label_column))
        if shuffle:
            dataset = dataset.shuffle(len(label_column))

        # For training, cycle through dataset as many times as need (n_epochs=None).
        dataset = dataset.repeat(n_epochs)
        # In memory training doesn't use batching.
        dataset = dataset.batch(len(label_column))
        return dataset
    return get_dataset

Любая помощь приветствуется. Большое спасибо!

...