如何解决提高自编码器网络的性能
这几天,我一直在努力提高我的自动编码器网络的性能,从改变网络架构到手动调整一些参数,以及最近使用 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
不幸的是,尽管做出了所有这些努力,我的模型性能并没有显着改善。你建议我进一步做什么?
解决方法
我不确定这个自动编码器的最终指标。
但每次试验都需要在验证集而不是训练集上返回一些指标,以避免过度拟合。
此外,在我看来,关于输入的形状,网络架构看起来太大了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。