为什么Optuna导出的CSV及最优参数仅显示1条同名分层参数
Optuna分层同类型超参数仅返回单条结果的解决方法
问题根源
你给不同层的同类型超参数设置了完全相同的参数名,Optuna以参数名为唯一标识,重名参数会被后续定义的同名字段直接覆盖,最终只会保留最后一次赋值的参数结果。
修复方案
1. 给每层参数添加唯一标识后缀
给每个层的激活函数、卷积核数量、步长等参数的名称增加层号后缀,保证每个参数名全局唯一,示例代码如下:
# 每一层参数名增加层号后缀,避免重名 activations_1 = trial.suggest_categorical('activation_1', ['relu', 'sigmoid', 'tanh', 'selu']) activations_2 = trial.suggest_categorical('activation_2', ['relu', 'sigmoid', 'tanh', 'selu']) activations_3 = trial.suggest_categorical('activation_3', ['relu', 'sigmoid', 'tanh', 'selu']) activations_4 = trial.suggest_categorical('activation_4', ['relu', 'sigmoid', 'tanh', 'selu']) # 其余分层参数同理修改参数名 num_filters_1 = trial.suggest_int('num_filters_1', 16, 128, step=16) num_filters_2 = trial.suggest_int('num_filters_2', 16, 128, step=16) kernel_size_1 = trial.suggest_int('kernel_size_1', 2, 5) kernel_size_2 = trial.suggest_int('kernel_size_2', 2, 5) stride_num_1 = trial.suggest_int('stride_num_1', 1, 2) stride_num_2 = trial.suggest_int('stride_num_2', 1, 2) # 构建模型时直接使用对应变量即可,如果存入字典需保证键名和参数名完全对应 model = Sequential([ layers.Conv2D(filters=num_filters_1, kernel_size=kernel_size_1, activation=activations_1, strides=stride_num_1, input_shape=self.input_shape), layers.BatchNormalization(), layers.MaxPooling2D(2, 2), layers.Conv2D(filters=num_filters_2, kernel_size=kernel_size_2, activation=activations_2, strides=stride_num_2), # 后续层按相同规则配置即可 ])
2. 验证输出结果
修改完成后重新运行优化流程,study.best_params返回的结果会包含所有分层的参数,格式示例如下:
{"num_filters_1": 32, "num_filters_2": 64, "kernel_size_1": 3, "kernel_size_2": 4, "strides_1": 1, "strides_2": 2, "activation_1": "relu", "activation_2": "selu", "activation_3": "tanh", "activation_4": "sigmoid", "num_dense_nodes": 64, "batch_size": 64}
此时导出的CSV文件也会为每个参数生成独立列,可直接查看每一层对应的最优参数配置。
内容的提问来源于stack exchange,提问作者Luleo_Primoc
相关产品推荐
相关产品推荐

