如何在贝叶斯优化函数中集成神经网络替代原耗时函数?
解决神经网络替代原函数集成贝叶斯优化的问题
问题根源
- 你直接传
model.predict()给BayesianOptimization的f参数,这会立即执行predict方法但没传入任何输入,自然触发"模型无输入"的报错,而且BayesianOptimization需要的是可调用的函数对象,不是函数执行结果。 - 贝叶斯优化会以字典形式传递参数,需要先把字典里的参数转换成模型要求的输入格式(比如匹配4输入模型的二维数组)。
修正方案
定义一个包装函数,把贝叶斯优化的参数转成模型能接受的输入格式,再调用predict方法,最后返回符合优化方向的预测值(默认贝叶斯优化做最大化,若原任务是最小化,需返回预测值的负值)。
修正后的代码
# 定义适配贝叶斯优化的包装函数 def surrogate_function(gammap, k, lambdap, Nrp): # 将参数整理为模型要求的输入形状:(单样本数, 特征数),即(1,4) input_data = [[gammap, k, lambdap, Nrp]] # 调用模型预测,关闭verbose避免冗余输出,取出标量结果 prediction = model.predict(input_data, verbose=0)[0][0] # 若原任务是最小化原函数,返回-prediction;最大化则直接返回prediction return -prediction # 初始化贝叶斯优化器,传入包装后的目标函数 optimizer = BayesianOptimization( f=surrogate_function, pbounds={'gammap': [1,10], 'k': [6,10], 'lambdap': [1, 20], 'Nrp': [1, 10]}, verbose=2, random_state=1234 ) # 执行优化 optimizer.maximize(init_points=5, n_iter=100) # 输出最优结果,若之前返回的是-prediction,这里要转回原函数值 print("Best result: {}; f(x) = {}.".format(optimizer.max["params"], optimizer.max["target"] * -1))
关键细节说明
surrogate_function的参数名必须和pbounds里的键完全一致,贝叶斯优化会自动匹配传参。- 模型输入要保证形状正确,比如TensorFlow/Keras模型要求输入为二维数组,不能直接传一维参数列表。
- 正负值调整:如果原任务是最小化原函数,因为BayesianOptimization默认做最大化,所以要返回预测值的负值,最终输出时再转回原函数值;若原任务是最大化,直接返回prediction即可。
内容的提问来源于stack exchange,提问作者Cqllysto
相关产品推荐
相关产品推荐

