Ошибка "Не удалось интерпретировать идентификатор оптимизатора" в Keras
Я получил эту ошибку, когда попытался изменить параметр скорости обучения оптимизатора SGD в Keras. Я что-то пропустил в своих кодах, или мой Keras был установлен неправильно?
Вот мой код:
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, Flatten, GlobalAveragePooling2D, Activation
import keras
from keras.optimizers import SGD
model = Sequential()
model.add(Dense(64, kernel_initializer='uniform', input_shape=(10,)))
model.add(Activation('softmax'))
model.compile(loss='mean_squared_error', optimizer=SGD(lr=0.01), metrics= ['accuracy'])*
и вот сообщение об ошибке:
Traceback (последний последний вызов): файл "C:\TensorFlow\Keras\ResNet-50\test_sgd.py", строка 10, в model.compile(loss = 'mean_squared_error', оптимизатор = SGD (lr = 0.01), показатели = ['precision']) Файл "C:\Users\nsugiant\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\keras_impl\keras\models.py", строка 787, в компиляции ** kwargs) Файл "C:\Users\nsugiant\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\keras_impl\keras\engine\training.py", строка 632, в компиляции.optimizer = optimizers.get (оптимизатор) Файл "C:\Users\nsugiant\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\keras_impl\keras\optimizers.py", строка 788, в get raise ValueError ('Невозможно интерпретировать идентификатор оптимизатора:', идентификатор) ValueError: ('Не удалось интерпретировать идентификатор оптимизатора:',)
Ответы
Ответ 1
Недавно я столкнулся с подобной проблемой.
Причина в том, что вы используете tensorflow.python.keras api для модели и слоев и keras.optimizers для SGD. Это две разные версии keras тензорного потока и чистого кера. Они не могли работать вместе. Вы должны изменить все на одну версию. Тогда это должно сработать. :)
Надеюсь это поможет.
Ответ 2
Я немного опоздал, ваша проблема в том, что вы смешали Tensorflow keras и keras API в своем коде. Оптимизатор и модель должны исходить из одного и того же определения слоя. Используйте Keras API для всего, как показано ниже:
from keras.models import Sequential
from keras.layers import Dense, Dropout, LSTM, BatchNormalization
from keras.callbacks import TensorBoard
from keras.callbacks import ModelCheckpoint
from keras.optimizers import adam
# Set Model
model = Sequential()
model.add(LSTM(128, input_shape=(train_x.shape[1:]), return_sequences=True))
model.add(Dropout(0.2))
model.add(BatchNormalization())
# Set Optimizer
opt = adam(lr=0.001, decay=1e-6)
# Compile model
model.compile(
loss='sparse_categorical_crossentropy',
optimizer=opt,
metrics=['accuracy']
)
Я использовал Адама в этом примере. Пожалуйста, используйте соответствующий оптимизатор в соответствии с приведенным выше кодом.
Надеюсь это поможет.
Ответ 3
Эта проблема в основном вызвана из-за разных версий. Версия tenorflow.keras может не совпадать с версией keras. Таким образом вызывая ошибку, упомянутую @Priyanka.
Для меня всякий раз, когда возникает эта ошибка, я передаю имя оптимизатора в виде строки, а бэкэнд вычисляет это. Например, вместо
tf.keras.optimizers.Adam
или же
keras.optimizers.Adam
я делаю
model.compile(optimizer= 'adam' , loss= keras.losses.binary_crossentropy, metrics=['accuracy'])
Ответ 4
Запуск примера документации Keras https://keras.io/examples/cifar10_cnn/ и установка последних версий Keras и Tenor Flow
(на момент написания этой статьи тензор потока 2.0.0a0 и версия Keras 2.2.4)
Мне пришлось явно импортировать оптимизатор керас, который использует пример, в частности строку в верхней части примера:
opt = tensorflow.keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)
был заменен
from tensorflow.keras.optimizers import RMSprop
opt = RMSprop(lr=0.0001, decay=1e-6)
В последней версии API "сломался", а keras.stuff во многих случаях стал tenorflow.keras.stuff.
Ответ 5
Попробуйте изменить строки импорта на
from keras.models import Sequential
from keras.layers import Dense, ...
Импорт кажется мне немного странным. Может быть, вы могли бы подробнее рассказать об этом.
Ответ 6
Просто дайте
optimizer = 'sgd' / 'RMSprop'