Могу ли я получить сеанс тензорного потока из оценщика?

#tensorflow #tensorflow-estimator

#тензорный поток #тензорный поток-оценщик

Вопрос:

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

Я попытался tf.get_default_session() получить сеанс, созданный оценщиком, но этот сеанс имеет другой график, который используется оценщиком.

 
    def my_decay(learning_rate, global_step, decay_step, loss, decay_rate):
      # If loss is not reduced, than decay with decay_rate.

    loss = tf.placeholder(tf.float32)
    estimator = tf.estimator.LinearRegressor(
    feature_columns=feature_columns,
    optimizer==lambda: tf.train.FtrlOptimizer(
        learning_rate=my_decay(learning_rate=0.1,
        global_step=tf.get_global_step(), decay_step=10000,
        loss=loss, decay_rate=0.96)),
      config=sess_config
    )

    for _ in range(n_epoches):
      metrics = tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
      session.run(loss.assign(metrics['loss']))
  

С помощью приведенного выше кода мне нужно получить session из оценщика.
Есть ли какой-либо способ получить это?

Заранее благодарю вас!

Комментарии:

1. Короткий ответ — вы не можете. Если вам абсолютно необходим доступ к сеансу, используйте отслеживаемый сеанс. Но я почти уверен, что вы можете определить пользовательское затухание потерь без сеанса, если только вы будете более конкретными

2. @Sharky , спасибо за ваш ответ. Похоже, что использование отслеживаемого сеанса вообще не рекомендуется. Но возможно ли, что извлечение потерь из оценщика и передача их my_decay ?

3. Я думаю, вы можете использовать estimator.get_variable_value , передать ему имя

Ответ №1:

Предполагаемое решение для чего-то подобного — это подкласс tf.train.SessionRunHook и переопределение before_run метода для возврата подходящего tf.train.SessionRunArgs . Это позволит вам передавать значения во время подготовки и добавлять выборки к session.run вызову. Ваш класс должен будет содержать ссылку на заполнитель и loss состояние между вызовами.

Затем вы просто создаете экземпляр класса и добавляете перехват к hooks параметру в вашем estimator.train вызове или, в данном случае, в вашем train_spec . Если вы хотите использовать потерю оценки вместо потери обучения, то этого можно достичь, добавив еще один хук к eval_spec , который считывает значения в after_run методе.

Комментарии:

1. не понял вас ясно, можете ли вы привести какой-нибудь пример кода?