Tensorflow 2.0: Optimizer.minimize (объект ‘Adam’ не имеет атрибута ‘minimize’)

#tensorflow #tensorflow2.0

#тензорный поток #tensorflow2.0

Вопрос:

Для моего приложения для обучения с подкреплением мне нужно иметь возможность применять пользовательские градиенты / минимизировать функцию изменения потерь. Согласно документации, это должно быть возможно с помощью функции Optimizer.minimize(). Однако в моей версии, установленной на pip, похоже, вообще нет этой функции.

Мой код:

 from tensorflow.python.keras.optimizers import Adam, SGD
print(tf.version.VERSION)
optim = Adam()
optim.minimize(loss, var_list=network.weights)
  

вывод:

 2.0.0-alpha0
Traceback (most recent call last):
  File "/Users/ikkamens/Library/Preferences/PyCharmCE2018.3/scratches/testo.py", line 18, in <module>
    optim.minimize(loss, var_list=network.weights)
AttributeError: 'Adam' object has no attribute 'minimize'
  

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

1. это должно быть tf.optimizers.Adam()

2. согласно документации, tf.optimizers имеет псевдоним tf.keras.optimizers: tensorflow.org/versions/r2.0/api_docs/python/tf/optimizers /…

Ответ №1:

На самом деле разница есть. Если вы напечатаете оба класса, вы увидите:

 from tensorflow.python.keras.optimizers import Adam

print(Adam)
print(tf.optimizers.Adam)

<class 'tensorflow.python.keras.optimizers.Adam'>
<class 'tensorflow.python.keras.optimizer_v2.adam.Adam'>
  

Итак, в первом случае Adam наследует от какого-либо другого класса. Он предназначен для использования внутри цикла обучения Keras, поэтому у него нет метода минимизации. Чтобы убедиться, давайте получим все методы класса

 import inspect
from tensorflow.python.keras.optimizers import Adam

print(inspect.getmembers(Adam(), predicate=inspect.ismethod))
  

Вывод показывает, что этот класс даже не имеет minimize