0

几天来,我正在努力提高我的自动编码器网络的性能,从更改网络架构到手动调整一些参数,以及最近使用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

不幸的是,尽管做出了所有这些努力,但我的模型性能并没有显着改善。你建议我应该进一步做什么?

4

1 回答 1

1

我不确定这个自动编码器的最终指标。

但是每次试验都需要在验证集而不是训练集上返回一些指标,以避免过度拟合。

此外,在我看来,网络架构在输入的形状方面看起来太大了。

于 2021-03-30T19:07:32.660 回答