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

Posted

技术标签:

【中文标题】Keras 中的“无法解释优化器标识符”错误【英文标题】:"Could not interpret optimizer identifier" error in Keras 【发布时间】:2018-10-07 22:37:03 【问题描述】:

我在 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'])*

这是错误信息:

Traceback(最近一次调用最后一次):文件 “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 行,在编译中 self.optimizer = optimizers.get(optimizer) 文件 "C:\Users\nsugiant\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\keras_impl\keras\optimizers.py", 第 788 行,在获取 raise ValueError('无法解释优化器标识符:',标识符) ValueError:('无法解释优化器标识符:', )

【问题讨论】:

【参考方案1】:

原因是您将tensorflow.python.keras API 用于模型和层,而keras.optimizers 用于SGD。它们是 TensorFlow 和纯 Keras 的两个不同 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']
)

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

希望这会有所帮助。

【讨论】:

或者,如果您想使用 tensorflow.keras 而不是 keras,请尝试以下link中的示例【参考方案3】:

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

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

tf.keras.optimizers.Adam

keras.optimizers.Adam

我愿意

model.compile(optimizer= 'adam' , loss= keras.losses.binary_crossentropy, metrics=['accuracy'])

【讨论】:

是的,您可以将优化器的字符串名称作为优化器参数的值传递,但是当您想调整优化器设置(例如学习率)时,使用 tf.keras.optimizers.Adam 函数更灵活。 只是补充一点,在当前的 TF 版本(2.4.1)中,优化器必须作为函数调用,而不是参数。所以确切的代码将是“tf.keras.optimizers.Adam()” 那我怎样才能用这种语法添加 lr 呢?我在下面尝试过,但没有用 model.compile(optimizer= 'adam'(lr=0.0001); loss= keras.losses.binary_crossentropy, metrics=['accuracy'])【参考方案4】:
from tensorflow.keras.optimizers import SGD

这很好用。

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

https://www.pyimagesearch.com/2019/10/21/keras-vs-tf-keras-whats-the-difference-in-tensorflow-2-0/

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

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

【讨论】:

欢迎来到 Stack Overflow!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案添加解释并说明适用的限制和假设。【参考方案5】:

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

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

import tensorflow
import your_library

【讨论】:

【参考方案6】:

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

(在撰写本文时 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。

【讨论】:

【参考方案7】:

就我而言,这是因为我错过了括号。我正在使用 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'])

它有效。

【讨论】:

【参考方案8】:

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

from keras.optimizers import sth

from tensorflow.keras.optimizers import sth

【讨论】:

【参考方案9】:

最近在 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=['--'])

【讨论】:

【参考方案10】:

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

从 keras 导入优化器

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

model.compile(loss='mean_squared_error', optimizer=sgd)

【讨论】:

【参考方案11】:

使用

从 tensorflow.keras 导入优化器

而不是

从 keras 导入优化器

【讨论】:

【参考方案12】:

尝试将您的导入行更改为

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

您的导入对我来说似乎有点奇怪。也许你可以详细说明一下。

【讨论】:

【参考方案13】:

只要给

optimizer = 'sgd' / 'RMSprop'

【讨论】:

欢迎来到 Stack Overflow!您能否添加一点解释,说明您为什么认为这可以解决问题中所述的问题?【参考方案14】:

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

一开始是

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)

【讨论】:

【参考方案15】:

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

optimizer=keras.optimizers.Adam

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

optimizer=keras.optimizers.Adam()

【讨论】:

【参考方案16】:

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

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

看tensorflow github,I am not the only one with this error where calling the function rather than the class fixed the error.

【讨论】:

以上是关于Keras 中的“无法解释优化器标识符”错误的主要内容,如果未能解决你的问题,请参考以下文章

keras中的lossoptimizermetrics

Keras 中的错误 - 'int' 对象没有属性 'shape'

如何解决 tensorflow.keras 中的值错误?

Keras中的卷积自动编码器解码器错误

如何从 wine 数据集中解决 Keras 神经网络实现中的错误

带有变压器的分类模型的 keras 模型中的错误