几天来,我正在努力提高我的自动编码器网络的性能,从更改网络架构到手动调整一些参数,以及最近使用optuna来优化 hpyerparameters。网络性能没有显着改善。
我可以知道您是否可以提出一些建议来改进此模型?
代码:
def objective(trial):
"""Object function to optimize parameters"""
#clear session
keras.backend.clear_session()
encoding_dim = 32
input_shape = x_train_sub.shape[1:] #(1, 200, 4) input shape
autoencoder = Sequential()
activ='relu'
autoencoder.add(Flatten(input_shape=input_shape))
autoencoder.add(Dense(800, activation=activ))
autoencoder.add(Dropout(trial.suggest_uniform('dropout_1', 0.0, 0.5)))
autoencoder.add(Dense(600, activation=activ))
autoencoder.add(Dropout(trial.suggest_uniform('dropout_2', 0.0, 0.5)))
autoencoder.add(Dense(400, activation=activ))
autoencoder.add(Dropout(trial.suggest_uniform('dropout_3', 0.0, 0.5)))
autoencoder.add(Dense(200, activation=activ))
autoencoder.add(Dense(100, activation=activ))
autoencoder.add(Dense(80, activation=activ))
autoencoder.add(Dense(encoding_dim, activation=activ))
#decoder
autoencoder.add(Dense(80, activation=activ))
autoencoder.add(Dense(100, activation=activ))
autoencoder.add(Dense(200, activation=activ))
autoencoder.add(Dense(400, activation=activ))
autoencoder.add(Dense(600, activation=activ))
autoencoder.add(Dense(800, activation=activ))
autoencoder.add(Dense(np.prod(input_shape), activation=activ))
autoencoder.add(Reshape(input_shape))
optimizer = Adam(lr=trial.suggest_loguniform("learning_rate", 1e-5, 1e-1))
autoencoder.compile(optimizer=optimizer, loss='mae', metrics=['mean_squared_error'])
hist = autoencoder.fit(x_train_sub, x_train_sub, epochs=200, verbose = 0,
batch_size = trial.suggest_categorical('batch_size', [64, 128]), shuffle=True)
min_mse = np.min(hist.history['mean_squared_error'])#min mean_squared_error
return min_mse
创建一个 optuna 研究:
study = optuna.create_study(study_name='ae_study', direction='minimize')
study.optimize(objective, n_trials=150)
然后用 `study 参数训练模型,如下所示:
output = study.best_params
dropout_list = [] #loop to form dropouts list from study best parameters
def createModel():
encoding_dim = 32
input_shape = x_train.shape[1:] #(1, 100, 4)
autoencoder = Sequential()
activ='relu'
# encoder
autoencoder.add(Flatten(input_shape=input_shape))
autoencoder.add(Dense(800, activation=activ))
autoencoder.add(Dropout(dropout_list[0]))
autoencoder.add(Dense(600, activation=activ))
autoencoder.add(Dropout(dropout_list[1]))
autoencoder.add(Dense(400, activation=activ))
autoencoder.add(Dropout(dropout_list[2]))
autoencoder.add(Dense(200, activation=activ))
autoencoder.add(Dense(100, activation=activ))
autoencoder.add(Dense(80, activation=activ))
autoencoder.add(Dense(encoding_dim, activation=activ))
#decoder
autoencoder.add(Dense(80, activation=activ))
autoencoder.add(Dense(100, activation=activ))
autoencoder.add(Dense(200, activation=activ))
autoencoder.add(Dense(400, activation=activ))
autoencoder.add(Dense(600, activation=activ))
autoencoder.add(Dense(800, activation=activ))
autoencoder.add(Dense(np.prod(input_shape), activation=activ))
autoencoder.add(Reshape(input_shape))
optimizer = Adam(lr=output['learning_rate'])
autoencoder.compile(optimizer=optimizer, loss='mae',
metrics=['mean_squared_error'])
autoencoder.fit(x_train, x_train, epochs=250, batch_size=output['batch_size'],
shuffle=True)
return autoencoder
不幸的是,尽管做出了所有这些努力,但我的模型性能并没有显着改善。你建议我应该进一步做什么?