【问题标题】:"Could not interpret optimizer identifier" error in KerasKeras 中的“无法解释优化器标识符”错误
【发布时间】: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:('无法解释优化器标识符:', )

【问题讨论】:

    标签: python python-3.x tensorflow keras


    【解决方案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.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.

                        【讨论】:

                          猜你喜欢
                          • 2021-09-21
                          • 1970-01-01
                          • 1970-01-01
                          • 2022-12-13
                          • 2019-09-16
                          • 1970-01-01
                          • 2019-10-16
                          • 2018-10-06
                          • 2015-08-21
                          相关资源
                          最近更新 更多