ВНИМАНИЕ: тензорный поток:AutoGraph не смог преобразовать <функцию <lambda> в 0x7fca141a6d08> и запустит ее как есть

Реализую код TFF классификации изображений. TFF версии 0.18.0, пишу так:

      iterative_process = tff.learning.build_federated_averaging_process(model_fn, server_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=1.0), client_optimizer_fn=lambda: tf.keras.optimizers.SGD(learning_rate=0.001))

state = iterative_process.initialize()

Но я нахожу это предупреждение:

      WARNING:tensorflow:AutoGraph could not transform <function <lambda> at 0x7fca141a6d08> and will run it as-is.
Cause: could not parse the source code of <function <lambda> at 0x7fca141a6d08>: found multiple definitions with identical signatures at the location. This error may be avoided by defining each lambda on a single line and with unique argument names.
Match 0:
(lambda : tf.keras.optimizers.SGD(learning_rate=1.0))

Match 1:
(lambda : tf.keras.optimizers.SGD(learning_rate=0.001))

To silence this warning, decorate the function with @tf.autograph.experimental.do_not_convert

Итак, пожалуйста, как мне избежать этого предупреждения? Спасибо

1 ответ

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

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

      
def server_optimizer_fn():
  return tf.keras.optimizers.SGD(learning_rate=1.)

def client_optimizer_fn():
  return tf.keras.optimizers.SGD(learning_rate=0.001)

iterative_process = tff.learning.build_federated_averaging_process(
    model_fn,
    server_optimizer_fn=server_optimizer_fn,
    client_optimizer_fn=client_optimizer_fn)

Автограф больше не должен жаловаться.

Другие вопросы по тегам