【发布时间】: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