从零训练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
相关产品推荐
相关产品推荐

