Как получить имя тензора из модели оценки керас, которая может быть распознана LoggingTensorHook? - PullRequest
0 голосов
/ 23 сентября 2019

Я построил модель keras и преобразовал ее в модель оценки.В процессе обучения он печатает только потери.Я также хочу напечатать значение метрики, например accuracy, поэтому я хочу добавить LoggingTensorHook в train_spec.Но LoggingTensorHook принимает имя тензора в качестве параметра.Я попробовал несколько имен, а также проверил имя с тензорной доски.Но это не работает, ошибка показана ниже.Что мне делать, чтобы получить правильное тензорное имя, чтобы оно работало?

Произошла ошибка

KeyError: "The name 'dense_1_loss:0' refers to a Tensor which does not exist. The operation, 'dense_1_loss', does not exist in the graph."

Вот пример кода, который я пробовал:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import sys

import numpy as np
import tensorflow as tf


def input_fn():
    x = np.random.random((1024, 10))
    y = np.random.randint(2, size=(1024, 1))
    x = tf.cast(x, tf.float32)
    dataset = tf.data.Dataset.from_tensor_slices((x, y))
    dataset = dataset.repeat(100)
    dataset = dataset.batch(32)
    return dataset


def main(args):
    if len(args) < 2:
        print('You must specify model_dir for checkpoints such as'
              ' /tmp/tfkeras_example/.')
        return

    model_dir = args[1]
    print('Using %s to store checkpoints.' % model_dir)

    # Define a Keras Model.
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Dense(
        16, activation='relu', input_shape=(10,)))
    model.add(tf.keras.layers.Dense(1, activation='sigmoid'))

    # Compile the model.
    optimizer = tf.train.GradientDescentOptimizer(0.2)
    model.compile(loss='binary_crossentropy',
                  optimizer=optimizer, metrics=['accuracy'])

    model.summary()
    tf.keras.backend.set_learning_phase(True)

    # Define DistributionStrategies and convert the Keras Model to an
    # Estimator that utilizes these DistributionStrateges.
    # Evaluator is a single worker, so using MirroredStrategy.
    config = tf.estimator.RunConfig(
        experimental_distribute=tf.contrib.distribute.DistributeConfig(
            train_distribute=tf.contrib.distribute.CollectiveAllReduceStrategy(),
            eval_distribute=tf.contrib.distribute.MirroredStrategy()))
    keras_estimator = tf.keras.estimator.model_to_estimator(
        keras_model=model, config=config, model_dir=model_dir)

    # Train and evaluate the model. Evaluation will be skipped if there is not an
    # "evaluator" job in the cluster.

    logging_hook = tf.estimator.LoggingTensorHook(
        ['dense_1_loss'], every_n_iter=10)

    tf.estimator.train_and_evaluate(
        keras_estimator,
        train_spec=tf.estimator.TrainSpec(
            input_fn=input_fn, hooks=[logging_hook]),
        eval_spec=tf.estimator.EvalSpec(input_fn=input_fn))


if __name__ == '__main__':
    tf.logging.set_verbosity(tf.logging.INFO)
    tf.app.run(argv=sys.argv)

Здесь представлен подграф всей модели

enter image description here

Добавить метрику к оценке

def my_auc(labels, predictions):
    auc_metric = tf.keras.metrics.AUC(name="my_auc")
    auc_metric.update_state(
        y_true=labels, y_pred=predictions['classes'])
    return {'auc': auc_metric}
# add metric to estimator
tf.estimator.add_metrics(keras_estimator, my_auc)
...