You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:使用旧版兼容优化器

  1. 导入TensorFlow提供的旧版SGD优化器(保留decay参数支持):
from tensorflow.keras.optimizers.legacy import SGD
  1. 创建符合要求的优化器实例:
optimizer = SGD(learning_rate=0.001, decay=1e-6, momentum=0.9, nesterov=False)

注:原代码中nesterov=None改为False,Keras优化器不接受None值

  1. 修改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实现学习率衰减:

  1. 导入新版SGD优化器:
from tensorflow.keras.optimizers import SGD
  1. 创建优化器:
optimizer = SGD(learning_rate=0.001, momentum=0.9, nesterov=False)
  1. 调用createSimpsonsModel时不传decay参数,传入该优化器即可。

内容的提问来源于stack exchange,提问作者Yiğit Yılmaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 00:35:19