PaddleHub 用 bert service embedding 的结果替换 fine-tuned 的 outputs["pooled_output"]

9nvpjoqh  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(82)

我通过 bert 的 fine-tune 实现文本分类:

module = hub.Module(name="bert_chinese_L-12_H-768_A-12")
        inputs, outputs, program = self.module.context(
            trainable=True, max_seq_len=max_seq_len)

        vocab_path = self.module.get_vocab_path()

        # 构建迁移学习任务的网络
        # "pooled_output" for classification tasks on an entire sentence.
        # "sequence_output" for token-level output.
        pooled_output = outputs["pooled_output"]

        # 使用 PaddleHub API 定义一个 finetune 的任务
        multi_label_cls_task = hub.MultiLabelClassifierTask(
            feature=pooled_output,
            num_classes=num_class,
            config=config
        )

但是现在我已经通过 bert service 的接口直接拿到了 embedding 的结果,所以想要用 embedding 的结果直接来代替 hub 加载模型得到 outputs["pooled_output"] 的过程:

module = hub.Module(name="bert_chinese_L-12_H-768_A-12")
inputs, outputs, program = self.module.context(trainable=True, max_seq_len=max_seq_len)

原始模型里面是直接用的 output["pooled_output"],这个打印出来是 variable 的形式,

请问在分类模型里的参数 feature=pooled_output, 要怎么替换成 embedding 的向量呢?

multi_label_cls_task = hub.MultiLabelClassifierTask(
            feature=pooled_output,
            num_classes=num_class,
            config=config
rqqzpn5f

rqqzpn5f1#

你想通过BERT服务直接获取样本的句向量,然后自己定义下游的网络进行分类吗?这样做的话就无法对原有模型进行微调,而且你只需要训练一个分类网络,将嵌入尺寸Map到标签数量。

相关问题