【问题标题】:Autoencoder Gridsearch Hyperparameter tuning Keras自编码器 Gridsearch 超参数调优 Keras
【发布时间】:2018-09-24 04:18:07
【问题描述】:

我的数据形状是一样的,我只是在这里生成了随机数。实际上,数据是从 -6 到 6 的浮点数,我也对它们进行了缩放。输入层大小和编码维度必须保持不变。当我训练时,损失开始并一直停留在0.631。我手动更改了学习率。我是 python 新手,不知道要对这段代码进行网格搜索以找到正确的参数。我还能做些什么来调整我的网络?

import numpy as np
from keras.layers import Input, Dense
from keras.models import Model
from keras import optimizers

#Train data
x_train=np.random.rand(2666000)
x_train = (train-min(train))/(max(train)-min(train))
x_train=x_train.reshape(-1,2000)

x_test=[]#empty testing later
#Enc Dimension 
encoding_dim=100
#Input shape
input_dim = Input(shape=(2000,))
#Encoding Layer
encoded = Dense(encoding_dim, activation='relu')(input_dim)
#Decoding Layer
decoded = Dense(2000, activation='sigmoid')(encoded)

#Model AE
autoencoder = Model(input_dim, decoded)
#Model Encoder 
encoder = Model(input_dim, encoded)
#Encoding
encoded_input = Input(shape=(encoding_dim,))
#Decoding 
decoder_layer = autoencoder.layers[-1]
#Model Decoder 
decoder = Model(encoded_input, decoder_layer(encoded_input))

optimizers.Adadelta(lr=0.1, rho=0.95, epsilon=None, decay=0.0)
autoencoder.compile(optimizer=optimizer, loss='binary_crossentropy', 
                metrics=['accuracy'])
#Train and test 
autoencoder_train= autoencoder.fit(x_train, x_train,
            epochs=epochs, shuffle=False, batch_size=2048)

【问题讨论】:

    标签: python keras grid-search


    【解决方案1】:

    我建议添加更多隐藏层。如果您的损失保持不变,则至少意味着以下两种情况之一:

    • 您的数据或多或少是随机的,没有要绘制的关系

    • 您的模型不够复杂,无法从数据中学习有意义的关系

    对我来说,一个经验法则是,一个模型应该足够强大,可以在给定足够的训练迭代的情况下过度拟合数据。

    不幸的是,足够复杂和太复杂之间只有一线之隔。您必须考虑隐藏层的数量、每层中的单元数量以及训练网络所需的 epoch 数量。由于您只有两个 Dense 层,因此一个很好的起点是增加模型的复杂性。

    如果你坚持使用网格搜索,keras 有一个 scikit_learn 的包装器,而 sklearn 有一个网格搜索模块。一个玩具例子:

    from keras.wrappers.scikit_learn import KerasClassifier
    from sklearn.model_selection import GridSearchCV
    
    def create_model():
        <return a compiled but untrained keras model>
    
    model = KerasClassifier(build_fn = create_model, batch_size=1000, epochs=10)
    #now write out all the parameters you want to try out for the grid search
    activation = ['relu', 'tanh', 'sigmoid'...]
    learn_rate = [0.1, 0.2, ...]
    init = ['unform', 'normal', 'zero', ...]
    optimizer = ['SGD', 'Adam' ...]
    param_grid = dict(activation=activation, learn_rate=learn_rate, init=init, optimizer=optimizer)
    grid = GridSearchCV(estimator=model, param_grid=param_grid)
    result = grid.fit(X, y)
    

    【讨论】:

    • 你解码的有 2000 个单位,而编码的只有 100 个。如果你减小模型的宽度,你当然可以使用更多的层而不会对性能产生很大影响
    • 第二点是尝试使用 optimizer='adam' 编译模型
    • 我知道你可能是对的,因为我只是在标准计算机上测试模型并想稍后使用 inputlayer:2000- hidden layer:1000, outputlayer: 2000。除了这些提示,仍然如何在我的代码中实现网格搜索? @Primusa
    • @pynewb 如果您的计算能力有限,为什么要尝试网格搜索?
    • 只是为了让自己在这个话题上做得更好。我想了解它。
    猜你喜欢
    • 2018-09-01
    • 2021-09-07
    • 1970-01-01
    • 2020-05-21
    • 2021-07-18
    • 2019-05-17
    • 2018-10-08
    • 2017-07-19
    • 2021-01-20
    相关资源
    最近更新 更多