【问题标题】:Optimize number of hidden layers and neurons with RandomizedSearchCV (scikit-learn) -> No unnecessary trainings?使用 RandomizedSearchCV (scikit-learn) 优化隐藏层和神经元的数量 -> 没有不必要的训练?
【发布时间】:2021-03-04 19:43:29
【问题描述】:

我想优化隐藏层的数量和每个隐藏层中的单元数量。 为此,我以这种方式使用了来自 sklearn 的 RandomizedSearchCV:

    from tensorflow.keras.wrappers.scikit_learn import KerasRegressor
    from sklearn.model_selection import RandomizedSearchCV
    from tensorflow import keras
    models = keras.models
    layers = keras.layers

    def tuneModel(n_layer, n1_units, n2_units):
        model = models.Sequential()

        # input layer + first hidden layer
        model.add(layers.Dense(n1_units, input_dim=100, activation="relu"))       
        
        # second hidden layer
        if n_layer == 2:
            model.add(layers.Dense(n2_units, activation="relu"))   
    
        # output layer
        model.add(layers.Dense(2))                                                  
        
        model.compile(loss="mse", optimizer=opt)
        return model
    
    model = KerasRegressor(build_fn=tuneModel, verbose=0)
    
    param_grid = dict(n_layer=[1,2],
                      n1_units=[16, 32, 64, 128],                  
                      n2_units=[16, 32, 64, 128],
                      batch_size=[64],
                      epochs=[100]
                      )

    grid = RandomizedSearchCV(estimator=model,
                              param_distributions=param_grid, 
                              scoring="neg_mean_squared_error",
                              cv=5,
                              n_iter=8
                              )
    
    grid_result = grid.fit(x,y)

这是显示我的问题的一个强大的缩小示例。 它运作良好,但会发生不必要的培训。例如,如果 n_layer = 1 和 n1_units = 16,则有四种组合可以训练相同的网络:

n_layer = 1,n1_units = 16,n2_units=16

n_layer = 1, n1_units = 16, n2_units=32

n_layer = 1, n1_units = 16, n2_units=64

n_layer = 1, n1_units = 16, n2_units=128

因为参数 n2_units 不用于一层网络。

是否有可能以另一种方式构建网络,这不会发生?

我希望我的解释是可以理解的:)

【问题讨论】:

    标签: python optimization scikit-learn neural-network hyperparameters


    【解决方案1】:

    我会将层的大小作为元组而不是单独的参数传递。例如

    def tuneModel(layer_sizes): 
        model = models.Sequential()
        model.add(keras.Input(shape=(100,)))
    
        for layer_size in layer_sizes:
            model.add(layers.Dense(layer_size, activation="relu"))
    
        model.add(layers.Dense(2))
    
        model.compile(loss="mse", optimizer=opt)
        return model
    
    sizes = [16, 32, 64, 128]
    shapes = (
        list(itertools.product(sizes, repeat=1))
        + list(itertools.product(sizes, repeat=2))
    )
    
    param_grid = dict(
        layer_sizes=shapes,
        batch_size=[64],
        epochs=[100]
    )
    

    【讨论】:

    • 非常感谢!我没有看到这种方式。效果很好。
    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 2021-07-26
    • 2014-03-22
    • 2017-12-07
    • 2019-02-01
    • 2016-11-23
    • 2012-09-28
    • 1970-01-01
    相关资源
    最近更新 更多