#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, они пока не работают для оценщиков.