提高自编码器网络的性能

问题描述

这几天,我一直在努力提高我的自动编码器网络的性能,从改变网络架构到手动调整一些参数,以及最近使用 optuna 来优化 hpyer 参数。网络性能没有显着改善。

我想知道您是否可以提出一些改进此模型的建议?

代码

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.5)))
    autoencoder.add(Dense(400,activation=activ))
    autoencoder.add(Dropout(trial.suggest_uniform('dropout_3',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)

然后像这样使用“研究参数”训练拟合模型:

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,metrics=['mean_squared_error'])
        autoencoder.fit(x_train,x_train,epochs=250,batch_size=output['batch_size'],shuffle=True) 

        return autoencoder

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

解决方法

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

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

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