本人在这里已经给出了MatchZoo的一个简单上手,这一次我会给出为模型自动调参的方法。
这一次使用的变量,和简单上手中的变量是一样的,所以我都是直接复制,并删掉一些不需要的地方。
加载数据:
train_pack_processed = preprocessor.fit_transform(train) # 其实就是做了一个字符转id操作,所以对于中文文本,不需要分词
dev_pack_processed = preprocessor.transform(dev)
定义模型:
# 模型的参数可以先使用官方初始参数,如果已有初始参数的,可以不需要写出来。
def build():
model = mz.models.DUET() # 同样,DUET网络可看官网的论文,这里不做解释;同样,模型的参数不做解释,官方文档有
ranking_task = mz.tasks.Ranking(loss=mz.losses.RankCrossEntropyLoss(num_neg=1)) # 定义损失函数,这里采用的是排序交叉熵损失函数,它还有一个分类交叉熵损失函数,看你如何定义你的数据
model.params['input_shapes'] = preprocessor.context['input_shapes']
model.params['embedding_input_dim'] = preprocessor.context['vocab_size'] # 如果版本较老,这里需要加1,因为要考虑一个UNK的字符,如果版本较新,这个以更新解决
model.params['embedding_output_dim'] = 300
model.params['task'] = ranking_task
model.params['optimizer'] = 'adam'
model.params['padding'] = 'same'
model.params['lm_filters'] = 32
model.params['lm_hidden_sizes'] = [32]
model.params['dm_filters'] = 32
model.params['dm_kernel_size'] = 3
model.params['dm_d_mpool'] = 3
model.params['dm_hidden_sizes'] = [32]
model.params['activation_func'] = 'relu'
model.params['dropout_rate'] = 0.32
model.params['embedding_trainable'] = True
model.guess_and_fill_missing_params(verbose=0)
model.params.completed()
model.build()
model.backend.summary()
model.compile()
return model
模型自动调参器的核心代码:
model = build()
tuner = mz.auto.Tuner(
params=model.params, # 模型参数
train_data=train_pack_processed, # 训练集
test_data=dev_pack_processed, # 验证集
num_runs=10 # 调参次数
)
results = tuner.tune()
print(results)
如果num_runs为10,会输出10次调参的参数组合,并给出每一次参数组合的分值,最后输出最高分值的参数组合。