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

从零训练VGG16时编译及训练阶段出现类型错误求助

VGG16训练时学习率调度器报错解决

报错原因分析

  • 第一个报错 TypeError: '<' not supported between instances of 'LearningRateScheduler' and 'int':LearningRateScheduler是训练回调类,不能直接传给Adam优化器的lr/learning_rate参数。优化器的学习率参数要求是数值或tf.keras.optimizers.schedules下的调度对象,Keras会校验参数是否非负,而回调实例无法和整数做比较,因此触发错误。
  • 第二个报错 ValueError: Attempt to convert a value (...) with an unsupported type to a Tensor:即使把参数名改为learning_rate,优化器依然无法将回调实例转换为张量,因为其类型不符合要求。

修正后的代码

核心是将学习率调度回调放入训练的callbacks参数中,优化器仅传入初始学习率:

initial_learning_rate = 0.1     
decay_steps = 1000               
decay_rate = 0.5                
staircase = True         

# 定义学习率调度逻辑
def lr_schedule(epoch, lr):
    if staircase:
        return lr * decay_rate ** (epoch // decay_steps)
    else:
        return lr * decay_rate ** (epoch / decay_steps)


from keras.callbacks import LearningRateScheduler

# 创建学习率调度回调实例
lr_callback = LearningRateScheduler(lr_schedule)
# 整合所有训练回调(假设early_stopping、learning_rate_reduce已提前定义)
callbacks = [early_stopping, learning_rate_reduce, lr_callback]

# 编译模型:给Adam传入初始学习率,而非回调实例
model.compile(
    optimizer=keras.optimizers.Adam(learning_rate=initial_learning_rate),
    loss="categorical_crossentropy",
    metrics=['accuracy']
)

# 启动训练,传入回调列表
model.fit(
    x_train, y_train,  # 替换为你的训练数据
    epochs=50,
    batch_size=32,
    callbacks=callbacks
)

关键注意点

  • LearningRateScheduler属于训练阶段的回调工具,必须在model.fit()的callbacks参数中使用,作用是在每个epoch调整学习率。
  • 优化器的learning_rate参数仅接受初始数值,或tf.keras.optimizers.schedules中的调度对象(如ExponentialDecay),和回调类的学习率调整是两种独立实现,不要混淆使用。

内容的提问来源于stack exchange,提问作者Piolo Macayan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:32:18