Я использую классификатор 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
Любая помощь приветствуется. Большое спасибо!