簡體   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