使用Keras Tuner调整现有模型

问题描述

我正在将Keras Tuner作为进行超参数优化的一种方式,但是我所看到的所有示例都显示了正在定义的全新模型。例如,从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

我已经有一个要调整的模型,但这是否意味着我必须如上所述使用拼接到人体上的超参数来重写它,或者我可以简单地将超参数传递到顶部的模型中?例如这样的

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,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 Tuner build_model,它采用了这样的现有模型,只需传入超参数即可。该模型非常复杂,我希望避免重新定义它(以及避免代码重复)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)