先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,要如何获取每个词的词向量