Как исправить «Данный объект не является экземпляром оптимизатора» при использовании Tensorflow-2.0 tf.optimizers?

#python #tensorflow #tensorflow-estimator

#python #tensorflow #tensorflow-оценщик

Вопрос:

Я использую Tensorflow 2.0 со стандартной оценкой DNNClassifier. Похоже, что оптимизаторы в tf.optimizers не являются экземплярами оптимизатора, ожидаемого классификатором.

Я уже использовал tf.optimizers и новую реализацию keras в tf.keras.optimizers и получаю ту же ошибку. Даже использование вызова оценщика в качестве лямбда-функции по-прежнему возвращает то же сообщение.

 
lr = tf.optimizers.schedules.ExponentialDecay(
    initial_learning_rate=0.1,
    decay_steps=10000,
    decay_rate=0.96)

optimizer = tf.optimizers.Adam(learning_rate=lr)

classifier = tf.estimator.DNNClassifier([20, 45, 15],
                                        feature_columns,
                                        n_classes=df.target.nunique(),
                                        optimizer=optimizer)

classifier.train(input_fn=lambda: df_to_dataset(
    train, batch_size=batch_size), steps=10000)

 

Каждый раз, когда я выполняю, я получаю одно и то же сообщение, не имеет значения, какой оптимизатор я выбираю:

The given object is not an Optimizer instance. Given: <tensorflow.python.keras.optimizer_v2.adam.Adam object at 0x7f7f186dada0>

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

1. Используйте tf.compat.v1.train.AdamOptimizer() вместо tf.optimizers.Adam()

2. Спасибо за предложение @Vlad, но это работает до определенного момента. Есть проблема которая возникает позже со встроенной функцией /opt/anaconda3/lib/python3.6/site-packages/tensorflow/python/training/optimizer.py in _call_if_callable(self, param) 1220 def _call_if_callable(self, param): 1221 """Call the function if param is callable.""" -> 1222 return param() if callable(param) else param TypeError: __call__() missing 1 required positional argument: 'step'

3. Похоже, что проблема кроется где-то в вашем коде. Мне нужно увидеть полную обратную трассировку, чтобы помочь вам.

4. @Vlad, ты можешь отправить свой ответ, чтобы я его принял. В итоге я создал свои оптимизаторы с compat v1 и model с v2. Таким образом, мы можем решить эту проблему. Согласно моему ответу ниже, это известная проблема для следующего выпуска.

5. Отлично, рад слышать!

Ответ №1:

Используйте tf.compat.v1.train.AdamOptimizer() вместо tf.optimizers.Adam() .

Ответ №2:

Хорошо, для тех, кто найдет это:

Эта проблема блокирует будущую версию Tensorflow 2.0. Сегодня я обнаружил аналогичную проблему в репозитории github:

https://github.com/tensorflow/tensorflow/issues/20812

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

Редактировать: я нашел обходной путь благодаря @Vlad. Он предложил использовать compat для построения оценки, что я и сделал. Вот как выглядел код:

 optimizer = tf.compat.v1.train.AdamOptimizer(
    learning_rate=tf.compat.v1.train.exponential_decay(
        global_step=0,
        learning_rate=0.1,
        decay_steps=10000,
        decay_rate=0.96, staircase=True))
 

Ответ №3:

Причина в том, что вы используете tensorflow.python.keras api для модели и слоев и keras.optimizers для SGD. Это две разные версии keras для tensorflow и pure keras. Они не могли работать вместе. Вы должны изменить все на одну версию.

После этого мой код работает хорошо: P

Надеюсь, это поможет.

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

1. Я пытался использовать как реализацию оптимизаторов tensorflow, так и оптимизаторы tf.keras, они пока не работают для оценщиков.