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
获得:
解决方案适用于tensorflow==2.2.0rc2
、Keras==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 中的错误 - 'int' 对象没有属性 'shape'