【问题标题】:Python: Issue defining grid search parameters for neural networkPython:为神经网络定义网格搜索参数的问题
【发布时间】:2021-10-23 07:14:12
【问题描述】:

我正在尝试使用以下代码对神经网络的多个参数执行网格搜索:

def create_network(optimizer='rmsprop'):
    
    # Start Artificial Neural Network
    network = Sequential()
    
    # Adding the input layer and the first hidden layer
    # units = neurons
    network.add(Dense(units = 16, 
                  activation = tf.keras.layers.LeakyReLU(alpha=0.3)))

    # Adding the second hidden layer
    network.add(Dense(units = 16, 
                  activation = tf.keras.layers.LeakyReLU(alpha=0.3)))

    # Adding the third hidden layer
    network.add(Dense(units = 16, 
                  activation = tf.keras.layers.LeakyReLU(alpha=0.3)))

    # Adding the output layer
    network.add(Dense(units = 1))
    
    # Compile NN
    network.compile(optimizer = optimizer, 
                loss = 'mean_squared_error', 
                metrics=['mae', tf.keras.metrics.RootMeanSquaredError()])
    
    # Return compiled network
    return network

# Wrap Keras model so it can be used by scikit-learn
ann = KerasRegressor(build_fn=create_network, verbose=0)

# Create hyperparameter space
epoch_values = [10, 25, 50, 100, 150, 200]
batches = [10, 20, 30, 40, 50, 100, 1000]
optimizers = ['rmsprop', 'adam', 'SGD']
neurons = [16, 32, 64, 128, 256]
lr_values = [0.001, 0.01, 0.1, 0.2, 0.3]

# Create hyperparameter options
hyperparameters = dict(optimizer=optimizers, epochs=epoch_values, batch_size=batches, units=neurons,learning_rate=lr_values)

# Create grid search
# cv=5 is the default 5-fold
grid = GridSearchCV(estimator=ann, cv=5, param_grid=hyperparameters)

# Fit grid search
grid_result = grid.fit(X, y)

但我得到了错误:

learning_rate is not a legal parameter

只有优化器、epochs 和 batch_size 起作用……其他参数在搜索中无法识别。

我该如何解决这个问题?

如果有相关了解,我还想在网格搜索中添加更多参数。

【问题讨论】:

    标签: python tensorflow keras scikit-learn neural-network


    【解决方案1】:

    目前,您并未指示网络使用学习率,因此scikit-learn 网格搜索不知道如何更改它。明确告诉优化器如何在您的 create_network 函数中更改学习率(neurons 或任何其他参数也是如此)。这样的事情应该可以工作:

    def create_network(optimizer='rmsprop', neurons=16, learning_rate=0.001):
        
        # Start Artificial Neural Network
        network = Sequential()
        
        # Adding the input layer and the first hidden layer
        network.add(Dense(units = neurons, 
                      activation = tf.keras.layers.LeakyReLU(alpha=0.3)))
    
        # Adding the second hidden layer
        network.add(Dense(units = neurons, 
                      activation = tf.keras.layers.LeakyReLU(alpha=0.3)))
    
        # Adding the third hidden layer
        network.add(Dense(units = neurons, 
                      activation = tf.keras.layers.LeakyReLU(alpha=0.3)))
    
        # Adding the output layer
        network.add(Dense(units = 1))
    
        ###############################################
        # Add optimizer with learning rate
        if optimizer == 'rmsprop':
            opt = tf.keras.optimizers.RMSprop(learning_rate=learning_rate)
        elif optimizer == 'adam':
            opt = tf.keras.optimizers.Adam(learning_rate=learning_rate)
        elif optimizer == 'SGD':
            opt = tf.keras.optimizers.SGD(learning_rate=learning_rate)
        else:
            raise ValueError('optimizer {} unrecognized'.format(optimizer))
        ##############################################    
    
        # Compile NN
        network.compile(optimizer = opt, 
                    loss = 'mean_squared_error', 
                    metrics=['mae', tf.keras.metrics.RootMeanSquaredError()])
        
        # Return compiled network
        return network
    
    # Wrap Keras model so it can be used by scikit-learn
    ann = KerasRegressor(build_fn=create_network, verbose=0)
    
    # Create hyperparameter space
    epoch_values = [10, 25, 50, 100, 150, 200]
    batches = [10, 20, 30, 40, 50, 100, 1000]
    optimizers = ['rmsprop', 'adam', 'SGD']
    neuron_list = [16, 32, 64, 128, 256]
    lr_values = [0.001, 0.01, 0.1, 0.2, 0.3]
    
    # Create hyperparameter options
    hyperparameters = dict(
        epochs=epoch_values, 
        batch_size=batches, 
        optimizer=optimizers, 
        neurons=neuron_list,
        learning_rate=lr_values)
    
    # Create grid search
    # cv=5 is the default 5-fold
    grid = GridSearchCV(estimator=ann, cv=5, param_grid=hyperparameters)
    
    # Fit grid search
    grid_result = grid.fit(X, y)
    

    也可以对neurons 或与网络结构相关的任何其他参数进行类似的修改。确保将create_network 的参数名称与hyperparameters 中的键匹配。

    【讨论】:

    • 你介意以神经元为例吗?我已经完成了def create_network(optimizer='rmsprop', neurons=16):,然后在函数中替换了units=neurons,并对grid_search 执行了相同的步骤...我需要为所有这些创建一个循环吗?
    • 为什么例如 batch_size 和 epoch 数不需要循环,但函数中需要设置其他参数?
    • 当然,我会更新我的答案以包括神经元。关键是将hyperparameter 中的内容与create_network 函数的参数相匹配。
    • epochsbatch_size 不需要显式分配给网络的原因是因为它们是训练过程的特征,没有融入网络本身。
    猜你喜欢
    • 2018-10-22
    • 2017-04-18
    • 2018-06-24
    • 2011-02-22
    • 1970-01-01
    • 2020-02-21
    • 2018-11-02
    • 2017-05-27
    • 2013-10-09
    相关资源
    最近更新 更多