繁体   English   中英

Keras 中的“无法解释优化器标识符”错误

[英]“Could not interpret optimizer identifier” error in Keras

当我尝试在 Keras 中修改 SGD 优化器的学习率参数时出现此错误。 我是否遗漏了代码中的某些内容,或者我的 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'])*

这是错误消息:

回溯(最近一次调用):文件“C:\\TensorFlow\\Keras\\ResNet-50\\test_sgd.py”,第 10 行,在 model.compile(loss='mean_squared_error', optimizer=SGD(lr=0.01), metrics =['accuracy']) 文件“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(optimizer) 文件“C:\\Users\\nsugiant\\AppData\\Local\\Programs\\Python\\Python35\\lib\\site-packages\\tensorflow\\python\\keras_impl\\keras\\optimizers.py”,第 788 行,在 get raise ValueError('Could not interpret optimizer identifier:', identifier) ValueError: ('Could not interpret optimizer identifier:', )

我最近遇到了类似的问题。

原因是您对模型和层使用 tensorflow.python.keras api,对 SGD 使用 keras.optimizers。 它们是 tensorflow 和纯 keras 的两个不同 keras 版本。 他们不能一起工作。 您必须将所有内容更改为一个版本。 那么它应该工作。 :)

希望这可以帮助。

我来晚了,您的问题是您的代码中混合了 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']
)

我在这个例子中使用了 adam。 请按照上面的代码使用您的相关优化器。

希望这可以帮助。

这个问题主要是由于版本不同造成的。 tensorflow.keras 版本可能与 keras 不同。 从而导致@Priyanka 提到的错误。

对我来说,每当出现此错误时,我都会将优化器的名称作为字符串传入,后端会计算出来。 例如代替

tf.keras.optimizers.Adam

或者

keras.optimizers.Adam

我愿意

model.compile(optimizer= 'adam' , loss= keras.losses.binary_crossentropy, metrics=['accuracy'])
from tensorflow.keras.optimizers import SGD

这很好用。

从 Tensorflow 2.0 开始,有一个新的 API 可以直接通过tensorflow

解决方案适用于tensorflow==2.2.0rc2tensorflow==2.2.0rc2 Keras==2.2.4 (在 Win10 上)

另请注意,上述版本使用learning_rate作为参数,不再使用lr

对于某些库(例如keras_radam ),您需要在导入之前设置一个环境变量:

import os
os.environ['TF_KERAS'] = '1'

import tensorflow
import your_library

运行 Keras 文档示例https://keras.io/examples/cifar10_cnn/并安装最新的 keras 和张量流版本

(在撰写本文时 tensorflow 2.0.0a0 和 Keras 版本 2.2.4 )

我必须明确导入示例使用的 keras 优化器,特别是示例顶部的行:

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 变成了 tensorflow.keras.stuff。

我尝试了以下方法,它对我有用:

从 keras 导入优化器

sgd = 优化器.SGD(lr=0.01)

model.compile(loss='mean_squared_error', 优化器=sgd)

就我而言,这是因为我错过了括号。 我正在使用 tensorflow_addons 所以我的代码就像

model.compile(optimizer=tfa.optimizers.LAMB, loss='binary_crossentropy',
              metrics=['binary_accuracy'])

它给

ValueError: ('Could not interpret optimizer identifier:', <class tensorflow_addons.optimizers.lamb.LAMB'>)

然后我将代码更改为:

model.compile(optimizer=tfa.optimizers.LAMB(), loss='binary_crossentropy',
              metrics=['binary_accuracy'])

它有效。

一个内核使用一种样式,尽量不要混用

from keras.optimizers import sth

from tensorflow.keras.optimizers import sth

从 tensorflow.keras 导入优化器

代替

从 keras 导入优化器

最近,在 Keras API 2.5.0 的最新更新中,导入 Adam 优化器显示以下错误:

from keras.optimizers import Adam
ImportError: cannot import name 'Adam' from 'keras.optimizers' 

而是使用以下导入优化器(即 Adam):

from keras.optimizers import adam_v2
optimizer = adam_v2.Adam(learning_rate=lr, decay=lr/epochs)
Model.compile(loss='--',  optimizer=optimizer  , metrics=['--'])

尝试将导入行更改为

from keras.models import Sequential
from keras.layers import Dense, ...

你的进口对我来说似乎有点奇怪。 也许你可以更详细地说明这一点。

就给

optimizer = 'sgd' / 'RMSprop'

我放错了括号并得到这个错误,

最初是

x=Conv2D(filters[0],(3,3),use_bias=False,padding="same",kernel_regularizer=l2(reg),x))

修正后的版本是

x=Conv2D(filters[0],(3,3),use_bias=False,padding="same",kernel_regularizer=l2(reg))(x)

我收到了相同的错误消息并解决了这个问题,就我而言,通过替换优化器的分配:

optimizer=keras.optimizers.Adam

使用它的实例而不是类本身:

optimizer=keras.optimizers.Adam()

我尝试了这个线程中的所有方法来修复它,但它们没有用。 但是,我设法为我修复了它。 对我来说,问题是调用优化器类,即。 tensorflow.keras.optimizers.Adam导致错误,但将优化器作为函数调用,即。 tensorflow.keras.optimizers.Adam()工作。 所以我的代码看起来像:

model.compile(
    loss=tensorflow.keras.losses.categorical_crossentropy(),
    optimizer=tensorflow.keras.optimizers.Adam()
)

查看 tensorflow github, 我不是唯一一个出现此错误的人,其中调用函数而不是类来修复错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM