我认为Keras调谐器是一种进行超参数优化的方法,但是我看到的所有示例都显示了一个全新的模型正在定义中。例如,来自Keras Hello World
def build_model(hp):
model = keras.Sequential()
model.add(layers.Flatten(input_shape=(28, 28)))
for i in range(hp.Int('num_layers', 2, 20)):
model.add(layers.Dense(units=hp.Int('units_' + str(i), 32, 512, 32),
activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.compile(
optimizer=keras.optimizers.Adam(
hp.Choice('learning_rate', [1e-2, 1e-3, 1e-4])),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
return model我已经有了一个我想要调整的模型,但这是否意味着我必须重写它,并将超参数拼接到上面,或者我可以简单地将超级参数传递给顶部的模型吗?例如:
def build_model(hp):
model = MyExistingModel(
batch_size=hp['batch_size'],
seq_len=hp['seq_len'],
rnn_hidden_units=hp['hidden_units'],
rnn_type='gru',
num_rnn_layers=hp['num_rnn_layers']
)
optimizer = optimizer_factory['adam'](
learning_rate=hp['learning_rate'],
momentum=0.9,
)
model.compile(
optimizer=optimizer,
loss='sparse_categorical_crossentropy',
metrics=['sparse_categorical_accuracy'],
)
return model就我所能看到的来说,上面的内容似乎是可行的。模型初始化args都通过HyperParameters实例传递到内部TF层,并从那里访问.虽然我不知道该怎么传进去.我认为可以通过预定义HyperParameters对象并将其传入调谐器来完成,然后将其传递给build_model。
hp = HyperParameters()
hp.Choice('learning_rate', [1e-1, 1e-3])
tuner = RandomSearch(
build_model,
max_trials=5,
hyperparameters=hp,
tune_new_entries=False,
objective='val_accuracy')在内部,我的模型有两个RNN (LSTM或GRU)和一个MLP。但我还没有遇到一个Keras build_model,它采用这样的现有模型,只是简单地传递超参数。该模型相当复杂,我希望避免重新定义它(以及避免代码重复)。
发布于 2020-09-23 15:24:13
事实上,这是可能的,正如这个GitHub问题所明确指出的.
但是,我没有将hp对象通过hyperparameters arg传递给Tuner,而是以建议的这里方式覆盖Tuner run_trial方法。
https://stackoverflow.com/questions/63984425
复制相似问题