请RD看一下:Module返回模型对象,相同的输入得到不同的输出(paddlehub提供的预训练bert模型)

8wigbo56  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(95)

版本、环境信息
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)
ycl3bljg

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}$

2o7dmzc5

2o7dmzc52#

你好,我看hub中demo:sequence_labeling_dygtaph.py,里面用预训练的ernie作为backbone构建下游任务模型,里面提取特征就是直接对module对象传入input_ids等4个固定输入。我是模仿那个来实现模型的,疑问有2:1. 通过这种方式,获取的sequence_output每次都不一样(对相同的输入)2.  这样子是更新了预训练模型的参数吗?构建下游任务模型的话,需要更新预训练模型的参数吗?发自我的华为手机

相关问题