如何从基于参数名称的字典中获取Keras图层函数的参数值?

时间:2019-08-07 14:28:20

标签: python keras

我正在创建一个基于Keras的深度学习模型。由于我的模型可以具有各种体系结构和超参数值,因此我想在自己的create_model函数中灵活一些,以获取层layers_list以及超参数值params的列表,以便create_model函数可以相应地编译模型以供以后使用。

这是我的create_model函数:


def create_model(layers_list, 
                 params,
                 optimizer='adam',
                 loss='binary_crossentropy',
                 metrics=['categorical_accuracy']):
    model = Sequential(layers_list)
    model.compile(optimizer=optimizer, loss=loss, metrics=metrics)

    return model

理想情况下,我应该能够像这样提供params字典:

{'max_words': 30000,
 'embedding_dim': 60,
 'maxlen': 70,
 'dropout_rate': 0.3,
 'filters': 300,
 'kernel_size': 11}

还有一个layers_list,其中所有参数都是从params字典中自动找到的,并填充到layers_list中。

layers_list = [
    Embedding(input_dim,
              output_dim,
              input_length,
    Conv1D(filters,
           kernel_size,
           activation='relu'),
    GlobalMaxPooling1D(),
    Dense(276),
    Activation('sigmoid')
]

当然,我可以像这样分配每个参数:

input_dim = params['max_words']

但是我想知道是否有更少的手动和更优雅的方式来做到这一点。谢谢

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,则希望动态填充图层列表中的参数。为此,我要做的是创建一个虚拟函数,该函数将自动返回带有字典中填充参数的层列表。为此,您必须按如下所示定义函数,然后使用**技巧展开字典:

首先,我们使用层架构定义函数

def get_layer_list(input_dim, output_dim, input_length, filters, kernel_size):
    layer_list = [
                  Embedding(input_dim,
                            output_dim),
                  Conv1D(filters,
                         kernel_size,
                         activation='relu'),
                  GlobalMaxPooling1D(),
                  Dense(276),
                  Activation('sigmoid')]
    return layer_list

然后我们定义参数dict以将它们填充到上一个列表中。

params = {"input_dim": (4096,),
          "output_dim": (1,),
          "input_length": 16,
          "filters": 128,
          "kernel_size": (3, 3)}

最后,我们可以调用函数以自动填充参数值,如下所示。

get_layer_list(**params)

然后您的最终函数将类似于以下内容,其中在这种情况下,函数中的layers_list_generator参数将是您的get_layer_list函数:

def create_model(layers_list_generator, 
                 params,
                 optimizer='adam',
                 loss='binary_crossentropy',
                 metrics=['categorical_accuracy']):
    layers_list = layers_list_generator(**params)
    model = Sequential(layers_list)
    model.compile(optimizer=optimizer, loss=loss, metrics=metrics)

    return model

希望它可以帮助:D