Настройка гиперпараметра с использованием API tenorsboard.plugins.hparams с пользовательской функцией потерь - PullRequest
0 голосов
/ 02 июля 2019

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

Я пытаюсь использовать API tenorsboard.plugins.hparams для настройки гиперпараметра и не знаю, как включить в него мою собственную функцию потерь. Я пытаюсь следовать коду, предложенному на сайте Tensorflow 2.0 .

Вот что предлагает сайт:

    HP_NUM_UNITS = hp.HParam('num_units', hp.Discrete([16, 32]))
    HP_DROPOUT = hp.HParam('dropout', hp.RealInterval(0.1, 0.2))
    HP_OPTIMIZER = hp.HParam('optimizer', hp.Discrete(['adam', 'sgd']))

    METRIC_ACCURACY = 'accuracy'

    with tf.summary.create_file_writer('logs/hparam_tuning').as_default():
      hp.hparams_config(
        hparams=[HP_NUM_UNITS, HP_DROPOUT, HP_OPTIMIZER],
        metrics=[hp.Metric(METRIC_ACCURACY, display_name='Accuracy')],
          )

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

    model.compile(optimizer=adam,loss=dl_tf_loss, metrics=[dl_tf_loss])

Поэтому я попытался изменить предложенный код на следующий код, но я получаю сообщение об ошибке, и мне интересно, как мне его изменить, чтобы он соответствовал моим потребностям. Вот что я попробовал:

    HP_NUM_UNITS = hp.HParam('num_units', hp.Discrete([16, 32]))
    HP_OPTIMIZER = hp.HParam('optimizer', hp.Discrete(['adam', 'sgd']))

    #METRIC_LOSS = dl_tf_loss

    with tf.summary.create_file_writer('logs/hparam_tuning').as_default():
      hp.hparams_config(hparams=[HP_NUM_UNITS, HP_OPTIMIZER],metrics= 
       [hp.Metric(dl_tf_loss, display_name='Loss')])

Это дает мне следующую ошибку:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-26-27d079c6be49> in <module>()
      5 
      6 with tf.summary.create_file_writer('logs/hparam_tuning').as_default():
----> 7   hp.hparams_config(hparams=[HP_NUM_UNITS, HP_OPTIMIZER],metrics=[hp.Metric(dl_tf_loss, display_name='Loss')])
      8 

3 frames
/usr/local/lib/python3.6/dist-packages/tensorboard/plugins/hparams/summary_v2.py in hparams_config(hparams, metrics, time_created_secs)
    127       hparams=hparams,
    128       metrics=metrics,
--> 129       time_created_secs=time_created_secs,
    130   )
    131   return _write_summary("hparams_config", pb)

/usr/local/lib/python3.6/dist-packages/tensorboard/plugins/hparams/summary_v2.py in hparams_config_pb(hparams, metrics, time_created_secs)
    161       domain.update_hparam_info(info)
    162     hparam_infos.append(info)
--> 163   metric_infos = [metric.as_proto() for metric in metrics]
    164   experiment = api_pb2.Experiment(
    165       hparam_infos=hparam_infos,

/usr/local/lib/python3.6/dist-packages/tensorboard/plugins/hparams/summary_v2.py in <listcomp>(.0)
    161       domain.update_hparam_info(info)
    162     hparam_infos.append(info)
--> 163   metric_infos = [metric.as_proto() for metric in metrics]
    164   experiment = api_pb2.Experiment(
    165       hparam_infos=hparam_infos,

/usr/local/lib/python3.6/dist-packages/tensorboard/plugins/hparams/summary_v2.py in as_proto(self)
    532         name=api_pb2.MetricName(
    533             group=self._group,
--> 534             tag=self._tag,
    535         ),
    536         display_name=self._display_name,

TypeError: <tensorflow.python.eager.def_function.Function object at 0x7f9f3a78e5c0> has type Function, but expected one of: bytes, unicode

Я также попытался запустить следующий код:

    with tf.summary.create_file_writer('logs/hparam_tuning').as_default():
      hp.hparams_config(hparams=[HP_NUM_UNITS, HP_OPTIMIZER],metrics= 
      [dl_tf_loss])

но получил следующую ошибку:

AttributeError                            Traceback (most recent call last)
<ipython-input-28-6778bdf7f1b1> in <module>()
      8 
      9 with tf.summary.create_file_writer('logs/hparam_tuning').as_default():
---> 10   hp.hparams_config(hparams=[HP_NUM_UNITS, HP_OPTIMIZER],metrics=[dl_tf_loss])

2 frames
/usr/local/lib/python3.6/dist-packages/tensorboard/plugins/hparams/summary_v2.py in <listcomp>(.0)
    161       domain.update_hparam_info(info)
    162     hparam_infos.append(info)
--> 163   metric_infos = [metric.as_proto() for metric in metrics]
    164   experiment = api_pb2.Experiment(
    165       hparam_infos=hparam_infos,

AttributeError: 'Function' object has no attribute 'as_proto'

Буду очень признателен за любую помощь. Заранее спасибо!

1 Ответ

0 голосов
/ 02 июля 2019

Я понял это.

Первоначальный METRIC_ACCURACY, который я изменил на METRIC_LOSS, по-видимому, просто имя, мне нужно было написать 'tf_dl_loss' в виде строки, а не функции.

В последующих частях настройки мне нужно было в любом случае написать свою команду подгонки, там я вставил фактическую функцию потерь, как я показал в моем примере с функцией обычной подгонки.

Настоятельно рекомендую это как способ настройкигиперпараметры.

...