Keras新优化器中decay参数已弃用,如何解决该报错?
问题
运行辛普森角色识别代码时遇到Keras优化器相关报错,代码及报错信息如下:
代码
import os import caer import canaro import numpy as np import cv2 as cv import gc import matplotlib.pyplot as plt from tensorflow.keras.utils import to_categorical from tensorflow.keras.callbacks import LearningRateScheduler IMG_SIZE = (80,80) channels = 1 char_path = r"simpsons_dataset" char_dict = {} for char in os.listdir(char_path): char_dict[char] = len(os.listdir(os.path.join(char_path,char))) # sort in descending order char_dict = caer.sort_dict(char_dict, descending=True) # print(char_dict) characters = [] count = 0 for i in char_dict: characters.append(i[0]) count += 1 if count >= 10: break print(characters) # create the training data train = caer.preprocess_from_dir(char_path, characters, channels=channels, IMG_SIZE=IMG_SIZE, isShuffle=True) len(train) plt.figure(figsize=(30,30)) plt.imshow(train[0][0], cmap='gray') plt.show() featureSet, labels = caer.sep_train(train, IMG_SIZE=IMG_SIZE) # Normalize the featureSet ==> (0,1) featureSet = caer.normalize(featureSet) labels = to_categorical(labels, len(characters)) x_train, x_val, y_train, y_val = caer.train_val_split(featureSet, labels, val_ratio=.2) del train del featureSet del labels gc.collect() BATCH_SIZE = 32 EPOCHS = 10 # Image data generator datagen = canaro.generators.imageDataGenerator() train_gen = datagen.flow(x_train, y_train, batch_size=BATCH_SIZE) # Creating the model. returns the compiled model model = canaro.models.createSimpsonsModel(IMG_SIZE=IMG_SIZE, channels=channels, output_dim=len(characters),loss='binary_crossentropy', decay=1e-6, learning_rate=0.001, momentum=0.9, nesterov=None) model.summary() callbacks_list = [LearningRateScheduler(canaro.lr_schedule())] training = model.fit(train_gen, steps_per_epoch = len(x_train)//BATCH_SIZE, epochs=EPOCHS, validation_data = (x_val, y_val), validation_steps=len(y_val)//BATCH_SIZE, callbacks = callbacks_list)
报错信息
WARNING:absl:`lr` is deprecated in Keras optimizer, please use `learning_rate` or use the legacy optimizer, e.g.,tf.keras.optimizers.legacy.SGD. Traceback (most recent call last): model = canaro.models.createSimpsonsModel(IMG_SIZE=IMG_SIZE, channels=channels, output_dim=len(characters), optimizer = SGD(lr=learning_rate, decay=decay, momentum=momentum, nesterov=nesterov) ValueError: decay is deprecated in the new Keras optimizer, please check the docstring for valid arguments, or use the legacy optimizer
解决方案
报错核心原因:TensorFlow 2.10+版本的Keras优化器移除了decay参数,同时将lr参数重命名为learning_rate,但canaro库的createSimpsonsModel内部默认使用旧参数格式,导致兼容性冲突。
方法1:使用旧版兼容优化器
- 导入TensorFlow提供的旧版SGD优化器(保留
decay参数支持):
from tensorflow.keras.optimizers.legacy import SGD
- 创建符合要求的优化器实例:
optimizer = SGD(learning_rate=0.001, decay=1e-6, momentum=0.9, nesterov=False)
注:原代码中
nesterov=None改为False,Keras优化器不接受None值
- 修改
createSimpsonsModel调用,移除原有的decay、learning_rate、momentum、nesterov参数,传入自定义优化器:
model = canaro.models.createSimpsonsModel( IMG_SIZE=IMG_SIZE, channels=channels, output_dim=len(characters), loss='binary_crossentropy', optimizer=optimizer )
方法2:完全使用新版优化器(无legacy依赖)
如果不想依赖旧版组件,可以去掉decay参数,完全依靠你已有的LearningRateScheduler实现学习率衰减:
- 导入新版SGD优化器:
from tensorflow.keras.optimizers import SGD
- 创建优化器:
optimizer = SGD(learning_rate=0.001, momentum=0.9, nesterov=False)
- 调用
createSimpsonsModel时不传decay参数,传入该优化器即可。
内容的提问来源于stack exchange,提问作者Yiğit Yılmaz
相关产品推荐
相关产品推荐

