版本、环境信息
1)paddlehub 1.8.2,paddle1.8.4
2)系统环境:Windows 10,python3.7.9,x64
问题
通过hub提供的预训练模型提取句子的字特征,同一个句子每次得到的特征不一样。
问题描述
使用paddlehub提供的预训练bert_chinese_L-12_H-768_A-12模型组建下游任务(没有使用task方法,使用动态图构建),在获取同一个句子的输出字特征时,通过debug显示返回的 sequence_output
数据内容不一样。不清楚是否是自动更新了参数,也没找到开关, context()
方法的trainable也设置为了False,但应该是不相关的。
由于是构建多输入多输出的任务,所以拟使用动态图的方式进行构建,如有其他更好办法欢迎RD指导,感谢。
复现代码
(当前还在组网阶段,没有模型结构,只在验证输入输出)
#!/usr/bin/env python3
# encoding:utf-8
# @Time : 2020/11/12 9:13
# @Author : vflanker
# @Email : local
# File : test.py
# Project : scratch
# encoding:utf-8
import paddlehub as hub
from paddlehub.tokenizer import BertTokenizer
import numpy as np
import paddle.fluid as fluid
mini_data = [
# 0
{"text": "查尔斯·阿兰基斯(Charles Aránguiz),1989年4月17日出生于智利圣地亚哥,智利职业足球运动员,司职中场,效力于德国足球甲级联赛勒沃库森足球俱乐部",
"spo_list": [["查尔斯·阿兰基斯", "出生地", "圣地亚哥"], ["查尔斯·阿兰基斯", "出生日期", "1989年4月17日"]]},
# 1
{"text": "《离开》是由张宇谱曲,演唱", "spo_list": [["离开", "歌手", "张宇"], ["离开", "作曲", "张宇"]]},
# 2
{"text": "《愤怒的唐僧》由北京吴意波影视文化工作室与优酷电视剧频道联合制作,故事以喜剧元素为主,讲述唐僧与佛祖打牌,得罪了佛祖,被踢下人间再渡九九八十一难的故事",
"spo_list": [["愤怒的唐僧", "出品公司", "北京吴意波影视文化工作室"], ["愤怒的唐僧", "导演", "吴意波"]]},
# 3
{"text": "李治即位后,萧淑妃受宠,王皇后为了排挤萧淑妃,答应李治让身在感业寺的武则天续起头发,重新纳入后宫", "spo_list": [["李治", "妻子", "萧淑妃"], ["萧淑妃", "丈夫", "李治"]]}
]
max_seq_len = 128
mini_data = mini_data[:2]
data_size = len(mini_data)
module = hub.Module(name='bert_chinese_L-12_H-768_A-12')
tokenizer = BertTokenizer(vocab_file=module.get_vocab_path())
inputs, outputs, program = module.context(trainable=False, max_seq_len=max_seq_len)
data_0 = [tokenizer.encode(mini_data[i]['text'], max_seq_len=max_seq_len, pad_to_max_seq_len=True)
for i in range(len(mini_data))]
data = {key: [line[key] for line in data_0] for key in data_0[0].keys()}
batch_size = len(data["input_ids"])
with fluid.dygraph.guard():
input_ids = np.array(data['input_ids']).astype(np.int64).reshape([batch_size, -1, 1])
position_ids = np.array(data['position_ids']).astype(np.int64).reshape([batch_size, -1, 1])
segment_ids = np.array(data['segment_ids']).astype(np.int64).reshape([batch_size, -1, 1])
input_mask = np.array(data['input_mask']).astype(np.float32).reshape([batch_size, -1, 1])
ret = module(input_ids, position_ids, segment_ids, input_mask)
print(ret)
2条答案
按热度按时间ycl3bljg1#
\n\n你好!请参考 #1018 问题回复。如果你想要取句子特征,对于PaddleHub ernie/bert类 module,可以通过get_embedding的方法取得,参考 https://www.paddlepaddle.org.cn/hubdetail?name=ERNIE&en_category=SemanticModel
$x_{1}^{c}{0}{d}{1}$
2o7dmzc52#
你好,我看hub中demo:sequence_labeling_dygtaph.py,里面用预训练的ernie作为backbone构建下游任务模型,里面提取特征就是直接对module对象传入input_ids等4个固定输入。我是模仿那个来实现模型的,疑问有2:1. 通过这种方式,获取的sequence_output每次都不一样(对相同的输入)2. 这样子是更新了预训练模型的参数吗?构建下游任务模型的话,需要更新预训练模型的参数吗?发自我的华为手机