首页 PaddleNLP 帖子详情
fluid-1.4 word2vec训练完成后,如何拿到获取词向量
收藏
快速回复
PaddleNLP 问答NLP 1327 14
fluid-1.4 word2vec训练完成后,如何拿到获取词向量
收藏
快速回复
PaddleNLP 问答NLP 1327 14

word2vec,fluid.io.save_params里保存了emb, emb-w, emb_b,要如何获取每个词的词向量

0
收藏
回复
全部评论(14)
时间顺序
AIStudio784543
#2 回复于2019-12
@JoyeeL

您好,请问用的是哪个word2vec的代码,麻烦贴下链接

0
回复
AIStudio786339
#4 回复于2019-12

可以参考这个issue #20795

0
回复
AIStudio786338
#5 回复于2019-12

不是,我是想直接dump这份词向量,不是在其他模型里加载这个参数。

0
回复
AIStudio786339
#6 回复于2019-12

加载后转成numpy可以保存成自己的格式

0
回复
AIStudio784543
#7 回复于2019-12
@JoyeeL

先load_params读取模型参数二进制文件,然后可以通过当前的scope(默认是fluid.global_scope())拿到需要的参数,例如VAR_X,并转为numpy array,用法参考:

import numpy as np
var_x = np.array(scope.var("VAR_X").get_tensor())

得到需要参数的numpy array var_x后就可以根据需求任意dump了

0
回复
AIStudio786338
#8 回复于2020-01
        fluid.io.load_params(
                executor=exe, dirname=model_path, main_program=copy_program)
        exe.run(fluid.default_startup_program())
        ret = fluid.global_scope().find_var("emb_b").get_tensor()

返回'NoneType' object has no attribute 'get_tensor'
但是

input_emb = fluid.layers.embedding(
    input=words[0],
    is_sparse=is_sparse,
    size=[dict_size, embedding_size],
    param_attr=fluid.ParamAttr(
        name='emb',
        initializer=fluid.initializer.Uniform(-init_width, init_width)))

true_emb_w = fluid.layers.embedding(
    input=words[1],
    is_sparse=is_sparse,
    size=[dict_size, embedding_size],
    param_attr=fluid.ParamAttr(
        name='emb_w', initializer=fluid.initializer.Constant(value=0.0)))
0
回复
AIStudio784543
#9 回复于2020-01

fluid.global_scope().find_var("emb_b")返回值为None, 表示fluid没有在当前scope下找到"emb_b"这个var
建议确认下当前scope下的program是否定义了这个var, 可以用下面方法打印出program内所有var,看看是否包含这个"emb_b"

all_vars = []
for v in program.list_vars():
    try:
        all_vars.append((v.name, v.shape))
    except:
        pass
print(all_vars)
0
回复
AIStudio786338
#10 回复于2020-01

all_vars是空的。
代码逻辑如下:

place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
exe = fluid.Executor(place)
emb_size = args.emb_size
batch_size = args.batch_size
with fluid.scope_guard(fluid.core.Scope()):
    main_program = fluid.Program()
    #with fluid.program_guard(main_program):
    #    copy_program = main_program.clone()
    model_path = model_dir + "/pass-0"
    fluid.io.load_params(
                executor=exe, dirname=model_path, main_program=main_program)
    exe.run(main_program)
    all_vars = []
    for v in main_program.list_vars():
        try:
            all_vars.append((v.name, v.shape))
        except:
            pass
    print(all_vars)
    #ret = fluid.executor.global_scope().find_var("emb_b").get_tensor()
    ret = fluid.executor.global_scope().var("emb_b").get_tensor()
    ret = np.array(ret)
    print (ret.shape)
    print(ret)

``

0
回复
AIStudio784543
#11 回复于2020-01
@JoyeeL

hi :
fluid.io.load_params的功能是从指定的 main_program 中筛选出所有模型参数变量,并根据目录 dirname 或 filename 提供的参数文件对这些模型参数进行赋值。
而你这里的main_program是一个空的program,没有定义计算图,没有参数变量,所以什么都load不到
我猜你是有一个inference_model需要load?那可以用paddle.fluid.io.load_inference_model接口,这样不用定义计算图

0
回复
AIStudio786338
#12 回复于2020-01

可以通过fluid.io.load_params来获取变量的值吗?

0
回复
AIStudio786338
#13 回复于2020-01
@JoyeeL

hi :
fluid.io.load_params的功能是从指定的 main_program 中筛选出所有模型参数变量,并根据目录 dirname 或 filename 提供的参数文件对这些模型参数进行赋值。
而你这里的main_program是一个空的program,没有定义计算图,没有参数变量,所以什么都load不到
我猜你是有一个inference_model需要load?那可以用paddle.fluid.io.load_inference_model接口,这样不用定义计算图

可以通过fluid.io.load_params来获取变量的值吗?

0
回复
AIStudio784543
#14 回复于2020-01

可以通过fluid.io.load_params来获取变量的值吗?

使用fluid.io.load_params需要你的program里有定义var,
可以把训练过程的train_program拿过来,用train_program来load。只要确保这个program里有"emb_b",模型文件里存了"emb_b",就能load进来

0
回复
AIStudio784543
#15 回复于2020-01
@JoyeeL

已私下沟通解决了问题,该issue可以close
如有需要可随时reopen

0
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户