如何用Optuna优化长度可变的列表型超参数?
解决Optuna中可变长度编码器神经元列表的超参数优化问题
你的核心问题是:生成编码器/解码器神经元列表时,所有隐藏层的神经元参数使用了同一个名称(encoder_neuron/decoder_neuron),Optuna会将其视为单一超参数,导致所有隐藏层神经元取值相同,且无法记录每层的独立数值。
修改方案
给每个隐藏层的神经元参数设置唯一名称,结合层数索引区分不同层的参数,确保Optuna能独立优化每层的神经元数量。
修改后的完整代码
def objective(trial): LATENT_DIM = trial.suggest_int("latent_dim", 1, 5) HIDDEN_ACTIVATION = trial.suggest_categorical("hidden_activation", ["relu", "sigmoid", "tanh"]) EPOCHS = trial.suggest_int("epochs", 1, 100) BATCH_SIZE = trial.suggest_int("batch_size", 32, 256, 32) DROPOUT_RATE = trial.suggest_float("dropout_rate", 0, 0.6) L2_REGULARIZER = trial.suggest_float("l2_regularizer", 0, 0.6) # 构建编码器神经元列表:固定input_dim开头,后续每层神经元独立采样 num_encoder_layers = trial.suggest_int('num_hidden_layers_encoder', 1, 5) encoder_hidden = [] for layer_idx in range(num_encoder_layers): # 用层索引生成唯一参数名,避免参数冲突 neuron_num = trial.suggest_int(f'encoder_neuron_layer_{layer_idx}', 7, 256) encoder_hidden.append(neuron_num) ENCODER_NEURONS = [input_dim] + encoder_hidden # 构建解码器神经元列表:每层神经元独立采样,结尾固定input_dim num_decoder_layers = trial.suggest_int('num_hidden_layers_decoder', 1, 5) decoder_hidden = [] for layer_idx in range(num_decoder_layers): neuron_num = trial.suggest_int(f'decoder_neuron_layer_{layer_idx}', 7, 256) decoder_hidden.append(neuron_num) DECODER_NEURONS = decoder_hidden + [input_dim] model = VAE( encoder_neurons=ENCODER_NEURONS, decoder_neurons=DECODER_NEURONS, latent_dim=LATENT_DIM, hidden_activation=HIDDEN_ACTIVATION, epochs=EPOCHS, batch_size=BATCH_SIZE, dropout_rate=DROPOUT_RATE, l2_regularizer=L2_REGULARIZER, contamination=CONTAMINATION, random_state=RANDOM_STATE ) model.fit(x_train_scaled) y_pred = model.predict(x_test_scaled) score = fbeta_score(y_test, y_pred, beta=2) return score
关键修改说明
- 先单独获取隐藏层数量,再通过循环为每层生成带索引的唯一参数名(如
encoder_neuron_layer_0、encoder_neuron_layer_1),确保每层神经元数是独立的超参数 - 这样Optuna会记录每层的神经元取值,最终能生成符合需求的可变长度列表,比如
[7,16,32]或[7,32]
内容的提问来源于stack exchange,提问作者Miorri
相关产品推荐
相关产品推荐

