使用 Keras Tuner 调整 pre-existing 模型
Tune a pre-existing model with Keras Tuner
我在看Keras Tuner as a way of doing hyperparameter optimization, but all of the examples I have seen show an entirely fresh model being defined. For example, from the Keras Tuner 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
我已经有一个我想调整的模型,但这是否意味着我必须像上面那样用拼接到 body 的超参数重写它,或者我可以简单地将超参数传递给到顶部的模型?例如像这样:
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
以上 似乎 有效,据我所知。模型初始化参数都通过 HyperParameters
实例传递到内部 TF 层,并从那里访问...虽然我不太确定 如何 传递它在...我 认为 它可以通过预定义 HyperParameters
object 并将其传递给调谐器来完成,然后它会传递给 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 Tuner build_model
,它采用像这样的现有模型,只是简单地传入超参数。该模型非常复杂,我想避免重新定义它(以及避免代码重复)。
确实这 是 可能的,因为 this GitHub issue 表明...
然而,我没有通过 hyperparameters
arg 将 hp
对象传递给调谐器,而是按照建议的方式覆盖了调谐器 run_trial
方法 here。
我在看Keras Tuner as a way of doing hyperparameter optimization, but all of the examples I have seen show an entirely fresh model being defined. For example, from the Keras Tuner 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
我已经有一个我想调整的模型,但这是否意味着我必须像上面那样用拼接到 body 的超参数重写它,或者我可以简单地将超参数传递给到顶部的模型?例如像这样:
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
以上 似乎 有效,据我所知。模型初始化参数都通过 HyperParameters
实例传递到内部 TF 层,并从那里访问...虽然我不太确定 如何 传递它在...我 认为 它可以通过预定义 HyperParameters
object 并将其传递给调谐器来完成,然后它会传递给 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 Tuner build_model
,它采用像这样的现有模型,只是简单地传入超参数。该模型非常复杂,我想避免重新定义它(以及避免代码重复)。
确实这 是 可能的,因为 this GitHub issue 表明...
然而,我没有通过 hyperparameters
arg 将 hp
对象传递给调谐器,而是按照建议的方式覆盖了调谐器 run_trial
方法 here。