PaddlePaddle使用高级API训练时出现ValueError: var img not in this block

  • 关键字:输入层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=...)的方式读入数据。数据读取和模型训练/预测的过程是同步进行的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值