PaddlePaddle出现问题:ValueError: var img not in this block

  • 关键字: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变量,就放弃加载模型,如果可以不使用,那就修改训练模型的代码则可。

猜你喜欢

转载自blog.csdn.net/PaddlePaddle/article/details/87642336
IMG