首页 Paddle框架 帖子详情
io.batch 报错:'generator' object is not callable
收藏
快速回复
Paddle框架 问答深度学习模型训练 3265 2
io.batch 报错:'generator' object is not callable
收藏
快速回复
Paddle框架 问答深度学习模型训练 3265 2

根据官方的batch的用法,版本是paddle1.6,代码如下:
import paddle.reader as reader
import paddle.fluid as fl
import time

def reader_creator_10(x):
print(x)
for i in range(10):
yield i

def mapper(x):
return (x + 1)

orders = (True, False)
thread_num = 2# (1, 2, 4, 8, 16)
buffer_size = 2# (1, 2, 4, 8, 16)

user_reader = reader.xmap_readers(mapper,reader_creator_10(5), thread_num, buffer_size, True)
shuffled_reader = fl.io.shuffle(reader, 5)
GPU_flag = False
place = fl.CUDAPlace(0) if GPU_flag else fl.CPUPlace()
batch_size = 5
batch_reader = fl.io.batch(user_reader,batch_size =batch_size)
with fl.dygraph.guard(place):

for data in batch_reader():
    print(data)

此时就会报如下错误:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/opt/anaconda3/envs/paddle_env/lib/python3.7/threading.py", line 926, in _bootstrap_inner
self.run()
File "/opt/anaconda3/envs/paddle_env/lib/python3.7/threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "/opt/anaconda3/envs/paddle_env/lib/python3.7/site-packages/paddle/reader/decorator.py", line 445, in order_read_worker
for i in reader():
TypeError: 'generator' object is not callable

### 当修改一下,将reader_creator_10中的参数去掉时,就不报错

import paddle.reader as reader
import paddle.fluid as fl
import time

def reader_creator_10():
print(5)
for i in range(10):
yield i

def mapper(x):
return (x + 1)

orders = (True, False)
thread_num = 2# (1, 2, 4, 8, 16)
buffer_size = 2# (1, 2, 4, 8, 16)

user_reader = reader.xmap_readers(mapper,reader_creator_10, thread_num, buffer_size, True)
shuffled_reader = fl.io.shuffle(reader, 5)
GPU_flag = False
place = fl.CUDAPlace(0) if GPU_flag else fl.CPUPlace()
batch_size = 5
batch_reader = fl.io.batch(user_reader,batch_size =batch_size)
with fl.dygraph.guard(place):

for data in batch_reader():
    print(data)

结果如下:
5
[1, 2, 3, 4, 5]
[6, 7, 8, 9, 10]

0
收藏
回复
全部评论(2)
时间顺序
AIStudio790719
#2 回复于2020-03

看起来应该是代码问题,我将你的原始代码修改一下以后,如下:

import paddle.reader as reader
import paddle.fluid as fl
import time

def reader_creator_10(x):
    print(x)
    def iterator():
        for i in range(10):
            yield i
    return iterator

def mapper(x):
    return (x + 1)

orders = (True, False)
thread_num = 2# (1, 2, 4, 8, 16)
buffer_size = 2# (1, 2, 4, 8, 16)

user_reader = reader.xmap_readers(mapper,reader_creator_10(5), thread_num, buffer_size, True)
shuffled_reader = fl.io.shuffle(reader, 5)
GPU_flag = False
place = fl.CUDAPlace(0) if GPU_flag else fl.CPUPlace()
batch_size = 5
batch_reader = fl.io.batch(user_reader,batch_size =batch_size)

with fl.dygraph.guard(place):
    for data in batch_reader():
        print(data)

运行结果符合预期

0
回复
AIStudio791335
#3 回复于2020-03

非常感谢,学习了

0
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户