神经网络Bayesian优化调参遇ValueError及target列nan问题求助
贝叶斯优化超参数调优问题解答
1. target列的含义
target列是贝叶斯优化框架记录的目标函数返回值,对应你代码中nn_cl_bo函数的输出结果:也就是5折交叉验证得到的负均方误差neg_mean_squared_error的均值。贝叶斯优化的核心逻辑就是不断搜索超参数组合,最大化这个target值。
2. target出现NaN及报错的原因
二者是同一个问题的不同表现:因为目标函数执行过程中出错,没有返回有效数值,所以target显示为NaN,执行过程中抛出ValueError: Input contains NaN, infinity or a value too large for dtype('float64')。
常见触发原因如下:
- 超参数类型错误:
layers1、layers2两个参数仅做了范围定义,你没有将贝叶斯优化返回的浮点型结果转为整数,直接传入range()函数会触发报错,导致交叉验证无法得到有效评分。 - 学习率设置过高:你当前设置的学习率范围是
(0.01, 1),超过0.01的学习率对于RNN和Adam/RMSprop优化器来说极易触发梯度爆炸,训练过程中损失、权重都会变为inf,后续计算时就会触发数值类型错误。 - 输入维度不匹配:你定义的SimpleRNN输入维度是
(25,1),如果train_x的维度没有调整为(样本数, 25, 1),会直接导致训练失败。
3. 修复方案
# 第一步:在nn_cl_bo函数的参数处理段补充layers1、layers2的类型转换 neurons = round(neurons) activation = activationL[round(activation)] batch_size = round(batch_size) epochs = round(epochs) layers1 = round(layers1) # 新增 layers2 = round(layers2) # 新增
# 第二步:缩小学习率范围,避免梯度爆炸 params_nn ={ # 其他参数不变 'learning_rate':(1e-5, 0.01), # 修改学习率上限为0.01 }
# 第三步:增加异常捕获,避免无效参数打断优化流程 try: score = cross_val_score(nn, train_x, train_y, scoring='neg_mean_squared_error', cv=kf, fit_params={'callbacks':[es]}).mean() except: # 异常时返回极小值,引导优化器避开当前超参数区间 return -1 * 10 ** 18
# 第四步:训练前确认训练数据维度 print(train_x.shape) # 输出应为 (总样本数, 25, 1),如果不对提前调整reshape
内容的提问来源于stack exchange,提问作者shwts
相关产品推荐
相关产品推荐

