先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了
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)))
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)
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)
``
hi :
fluid.io.load_params的功能是从指定的 main_program 中筛选出所有模型参数变量,并根据目录 dirname 或 filename 提供的参数文件对这些模型参数进行赋值。
而你这里的main_program是一个空的program,没有定义计算图,没有参数变量,所以什么都load不到
我猜你是有一个inference_model需要load?那可以用paddle.fluid.io.load_inference_model
接口,这样不用定义计算图
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来获取变量的值吗?
word2vec,fluid.io.save_params里保存了emb, emb-w, emb_b,要如何获取每个词的词向量