Использование tf.summary.create_file_writer с обратным вызовом Keras - PullRequest
0 голосов
/ 24 апреля 2019

Используя TF2.0-nightly, я реализую класс, который уменьшает необходимость явной записи эксперимента с гиперпараметрами (параметров и метрик) для тензорной доски, заполняя внешние значения для быстрой генерации этих тестов.

Использование tf.summary.experimental.write_raw_pb () в tf file_writer по умолчанию позволяет мне регистрировать гиперпараметры и точность в конце каждого прогона, однако я также хотел бы регистрировать информацию в конце каждой эпохимодели.

Использование tennsflow.keras.callbacks.Tensorboard, чтобы сделать последнее, вызывает проблемы, когда тензорная доска пытается обновиться в реальном времени, предупреждая, что обновляются различные файлы журнала по сравнению с «текущим»,где текущим является файл на основе обратного вызова, а обновляемыми являются журналы эксперимента.

Т.е. я могу показывать HParams или гистограммы (для каждой эпохи), но не могу их кратко обновить.Кто-нибудь знает о том, как использовать как обратный вызов keras, так и tf filewriter одновременно?

ПРИМЕЧАНИЕ. Если я оставляю операцию для запуска и открытия тензорной доски задним числом, все данные отображаются без проблем, это происходит только тогда, когдапроведение экспериментов.

Пробовали обе панели инструментов Hyperparameters и Histogram / Scalars по отдельности, которые работают нормально.

Я также пытался вернуть историю каждой модели ..fit (), но могу найти только способы построения скаляров, а не векторов, которые возвращаются в history.history, которая заставляет скалярные графы перепрыгивать всев нескольких экспериментах.

Поэтому я инициализирую эксперименты с помощью self.create_experiment_summary () и создаю программу записи, которая передает ее в журналы.

exp_summary, paramNames, paramValues = self.create_experiment_summary()
root_logdir_writer = tf.summary.create_file_writer("logs/" + self.folderName)
with root_logdir_writer.as_default():
tf.summary.experimental.write_raw_pb(exp_summary.SerializeToString(), step=1)

где self.create_experiment_summary () возвращает следующее

...
return hparams_summary.experiment_pb(
    hparam_infos=
        [api_pb2.HParamInfo(name=w, display_name=x, type=y, domain_discrete=z) for
            w, x, y, z in zip(hparamNames, hparamDesc, hparamDtype, hparamSum)],
    metric_infos=[
        api_pb2.MetricInfo(
            name=api_pb2.MetricName(tag='Eval Accuracy'), display_name='Accuracy')
    ])

Затем я перехожу к передаче параметров моей модели, которая проходит через

    def run(self, run_dir, hparams, session_num):
        writer = tf.summary.create_file_writer(run_dir)
        summary_start = hparams_summary.session_start_pb(hparams=hparams)

        with writer.as_default():
            accuracy, history = self.model_function(hparams, self.x_train, 
                                            self.y_train, self.x_test, self.y_test, run_dir)
            summary_end = hparams_summary.session_end_pb(api_pb2.STATUS_SUCCESS)

            tf.summary.scalar('Eval Accuracy', accuracy, step=1, description="The Evaluation Accuracy")
            tf.summary.experimental.write_raw_pb(summary_start.SerializeToString(), step=1)
            tf.summary.experimental.write_raw_pb(summary_end.SerializeToString(), step=1)

, где model_function представлена ​​ниже, и настраивает толькоимя журнала, добавив текущий прогон в путь к каталогу.

def train_test_model(hparams, x_train, y_train, x_test, y_test, dire):
    model = tf.keras.models.Sequential([
        tf.keras.layers.Conv1D(32, int(hparams['c1_kernel']), 1,padding='same'),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(hparams['num_units_list'], activation=hparams['activation_list']),
        tf.keras.layers.Dropout(hparams['dropout_rate_list']),
        tf.keras.layers.Dense(10, activation=tf.nn.softmax)
    ])
    model.compile(optimizer=hparams['optimizer_list'],
                loss='sparse_categorical_crossentropy',
                metrics=['accuracy'])

    tensorLog = TensorBoard(log_dir=dire, histogram_freq=1, 
                            write_graph=True, update_freq='epoch')

    history = model.fit(x_train, y_train, epochs=2, callbacks=[tensorlog])

    print("--- Evaluating")
    _, accuracy = model.evaluate(x_test, y_test)
    return accuracy, history

Если я закомментирую обратный вызов и удаляю его из .fit, то тензорная доска перезагружает hparams после завершения прогона и т. Д., Однако у меня больше нет гистограмм или потерь в каждой эпохе за эксперимент.

...