-
关键字:
ValueError
var
-
问题描述:
1、将caffe VGG16模型转化为fluid要求的类型,其中模型的加载和存储使用的用法来自:https://github.com/PaddlePaddle/Paddle/issues/8973
2、输入数据类型:images = fluid.layers.data(name=‘img’, shape=data_shape, dtype=‘float32’),data_shape = [3, 300, 300];
加载模型:predict = vgg16_raw(images),然后run:
loss = exe.run( #fluid.default_main_program(), main_program, feed={“img”: img_data, “label”: y_data}, fetch_list=[avg_cost]) -
报错输出:
/home/yczhao/anaconda2/lib/python2.7/site-packages/paddle/fluid/average.py:42: Warning: The WeightedAverage is deprecated, please use fluid.metrics.Accuracy instead.
(self.class.name), Warning)
Traceback (most recent call last):
File "vgg16.py", line 301, in
main()
File "vgg16.py", line 263, in main
fetch_list=[avg_cost])
File "/home/yczhao/anaconda2/lib/python2.7/site-packages/paddle/fluid/executor.py", line 335, in run
fetch_var_name=fetch_var_name)
File "/home/yczhao/anaconda2/lib/python2.7/site-packages/paddle/fluid/executor.py", line 234, in _add_feed_fetch_ops
out = global_block.var(name)
File "/home/yczhao/anaconda2/lib/python2.7/site-packages/paddle/fluid/framework.py", line 724, in var
raise ValueError("var %s not in this block" % name)
ValueError: var img not in this block
- 相关代码段:
#读入已有模型
#restore from trained model
with open(vgg16_filename, "rb") as f:
program_desc_str = f.read()
main_program = Program.parse_from_string(program_desc_str)
load_persistables(exe, vgg16_dirname, main_program)
#构建模型
images = fluid.layers.data(name='img', shape=data_shape, dtype='float32')
label = fluid.layers.data(name='label', shape=[300*300], dtype='float32')
# Train program
predict = vgg16_raw(images)
cost = crossentropy_seg(predict, label)
avg_cost = fluid.layers.mean(x=cost)
# Optimization
optimizer = fluid.optimizer.Adam(learning_rate=args.learning_rate)
opts = optimizer.minimize(avg_cost)
loss = exe.run(
#fluid.default_main_program(),
main_program,
feed={"img": img_data,
"label": y_data},
fetch_list=[avg_cost])
-
问题分析:
从报错ValueError: var img not in this block
可知,报错的原因是因为模块中没有img这个变量,即代码中调用了模块中的img变量,而模型中本身是不存在的,所以造成了这个错误,是用法问题,看到报错的相关代码,有两大块,一块是载入模型,另一块是写了一个新的模型结构,然后通过exe.run()方法来执行,这里就存在一个逻辑问题,即你载入了以存在的模型,那么就是使用训练该模型了,新构建的模型结构没有被使用,此时你又使用新模型的变量images
,它的name为img,就可能会造成var img not in this block
,因为导入使用的旧模型不一定有名为img的变量。 -
解决方法:
理清思路,确定自己的具体任务,造成这个问题的原因是使用了加载的模型,而该模型中没有名为img的变量,但看到相关代码段中构建新模型的代码,其中创建了名为img的变量,即使用者以为自己可以使用新构建的模型,但又加载了已存在的模型,理清楚思路,如果要使用img变量,就放弃加载模型,如果可以不使用,那就修改训练模型的代码则可。