我正在创建一个基于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']
但是我想知道是否有更少的手动和更优雅的方式来做到这一点。谢谢
答案 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