-
关键字:
输入层name
-
问题描述:在使用PaddlePaddle 1.0以上的版本,通过使用高级API进行训练,在执行训练的时候出现错误,错误提示ValueError: var img not in this block。
-
报错信息:
<ipython-input-7-3294b0f46718> in main()
41 event_handler=event_handler,
42 reader=train_reader,
---> 43 feed_order=['img', 'label'])
44
45 # find the best pass
/usr/local/lib/python3.5/dist-packages/paddle/fluid/contrib/trainer.py in train(self, num_epochs, event_handler, reader, feed_order)
403 else:
404 self._train_by_executor(num_epochs, event_handler, reader,
--> 405 feed_order)
406
407 def test(self, reader, feed_order):
/usr/local/lib/python3.5/dist-packages/paddle/fluid/contrib/trainer.py in _train_by_executor(self, num_epochs, event_handler, reader, feed_order)
476 """
477 with self._prog_and_scope_guard():
--> 478 feed_var_list = build_feed_var_list(self.train_program, feed_order)
479 feeder = data_feeder.DataFeeder(
480 feed_list=feed_var_list, place=self.place)
/usr/local/lib/python3.5/dist-packages/paddle/fluid/contrib/trainer.py in build_feed_var_list(program, feed_order)
634 if isinstance(feed_order, list):
635 feed_var_list = [
--> 636 program.global_block().var(var_name) for var_name in feed_order
637 ]
638 else:
/usr/local/lib/python3.5/dist-packages/paddle/fluid/contrib/trainer.py in <listcomp>(.0)
634 if isinstance(feed_order, list):
635 feed_var_list = [
--> 636 program.global_block().var(var_name) for var_name in feed_order
637 ]
638 else:
/usr/local/lib/python3.5/dist-packages/paddle/fluid/framework.py in var(self, name)
1038 v = self.vars.get(name, None)
1039 if v is None:
-> 1040 raise ValueError("var %s not in this block" % name)
1041 return v
1042
ValueError: var img not in this block
- 问题复现:在使用
fluid.layers.data()
接口定义输入层时,其中name
参数的值是image
,在trainer.train()
接口的feed_order
参数中设置输入层的值为img
,之后在执行训练程序时会出错。错误代码如下:
def convolutional_neural_network():
img = fluid.layers.data(name='image', shape=[1, 28, 28], dtype='float32')
# first conv pool
conv_pool_1 = fluid.nets.simple_img_conv_pool(
input=img,
filter_size=5,
num_filters=20,
pool_size=2,
pool_stride=2,
act="relu")
conv_pool_1 = fluid.layers.batch_norm(conv_pool_1)
prediction = fluid.layers.fc(input=conv_pool_1, size=10, act='softmax')
return prediction
······
trainer.train(
num_epochs=1,
event_handler=event_handler,
reader=train_reader,
feed_order=['img', 'label'])
- 问题解决:在训练时是根据
feed_order
参数定义的输入数据的维度,对应定义输入层的name
的,所以feed_order
参数的值必须要对应输入层的name
参数的值。正确代码如下:
def convolutional_neural_network():
img = fluid.layers.data(name='img', shape=[1, 28, 28], dtype='float32')
# first conv pool
conv_pool_1 = fluid.nets.simple_img_conv_pool(
input=img,
filter_size=5,
num_filters=20,
pool_size=2,
pool_stride=2,
act="relu")
conv_pool_1 = fluid.layers.batch_norm(conv_pool_1)
prediction = fluid.layers.fc(input=conv_pool_1, size=10, act='softmax')
return prediction
······
trainer.train(
num_epochs=1,
event_handler=event_handler,
reader=train_reader,
feed_order=['img', 'label'])
- 问题拓展:PaddlePaddle的读取数据的方式是使用reader的,通过
fluid.layers.data
接口构建网络的输入层,并通过executor.run(feed=...)
的方式读入数据。数据读取和模型训练/预测的过程是同步进行的。