首页 Paddle框架 帖子详情
使用recordio时如何区分训练和测试数据?
收藏
快速回复
Paddle框架 问答模型训练 1507 6
使用recordio时如何区分训练和测试数据?
收藏
快速回复
Paddle框架 问答模型训练 1507 6

根据 文档 https://0x9.me/NygvY 中描述,写了以下测试程序(已精简):

import paddle
import paddle.fluid as fluid


USE_CUDA = True
IMAGE_RESIZE_SIZE = 128
BATCH_SIZE = 32
PASS_NUM = 100

# Layers
def network(is_test):
    data_shape = [-1, 3, IMAGE_RESIZE_SIZE, IMAGE_RESIZE_SIZE]

    if not is_test:
        file_obj = fluid.layers.open_files(
              filenames=['train.recordio'],
              shapes=[data_shape, [-1, 1]],
              lod_levels=[0, 0],
              dtypes=['float32', 'float32'],
              pass_num=PASS_NUM,
        )
        file_obj = fluid.layers.shuffle(file_obj, buffer_size=8192)
    else:
        file_obj = fluid.layers.open_files(
              filenames=['test.recordio'],
              shapes=[data_shape, [-1, 1]],
              lod_levels=[0, 0],
              dtypes=['float32', 'float32'],
        )
    file_obj = fluid.layers.batch(file_obj, batch_size=BATCH_SIZE)
    file_obj = fluid.layers.double_buffer(file_obj)
    image_layer, label_layer = fluid.layers.read_file(file_obj)
    return label_layer

# Train program
with fluid.unique_name.guard():
    train_label_layer = network(is_test=False)

# Test program
test_program = fluid.Program()
with fluid.unique_name.guard():
    with fluid.program_guard(test_program, fluid.Program()):
        test_label_layer = network(is_test=True)

# Executor
place = fluid.CUDAPlace(0) if USE_CUDA else fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())

# Train
while True:
    test_label, = exe.run(program=test_program, fetch_list=[test_label_layer])
    print(test_label)  # 应该打印测试数据的 label
    raw_input()

结果运行时,打印的是训练数据,也就是 train.recordio 中的数据,请问是什么原因?谢谢

0
收藏
回复
全部评论(6)
时间顺序
s
sneaxiy
#2 回复于2018-09

需将代码改为:

# Layers
def network(is_test):
    data_shape = [-1, 3, IMAGE_RESIZE_SIZE, IMAGE_RESIZE_SIZE]

    if not is_test:
        file_obj = fluid.layers.open_files(
              filenames=['train.recordio'],
              shapes=[data_shape, [-1, 1]],
              lod_levels=[0, 0],
              dtypes=['float32', 'float32'],
              pass_num=PASS_NUM,
        )
        file_obj = fluid.layers.shuffle(file_obj, buffer_size=8192)
    else:
        file_obj = fluid.layers.open_files(
              filenames=['test.recordio'],
              shapes=[data_shape, [-1, 1]],
              lod_levels=[0, 0],
              dtypes=['float32', 'float32'],
        )
    file_obj = fluid.layers.batch(file_obj, batch_size=BATCH_SIZE)
    file_obj = fluid.layers.double_buffer(file_obj)

    with fluid.unique_name.guard():
    	image_layer, label_layer = fluid.layers.read_file(file_obj)
    return label_layer

# Train program
train_label_layer = network(is_test=False)

# Test program
test_program = fluid.Program()
with fluid.program_guard(test_program, fluid.Program()):
    test_label_layer = network(is_test=True)
0
回复
joodo
#3 回复于2018-09
sneaxiy #2
需将代码改为: [代码]

十分感谢回复!!我看您的代码,是把定义 program 时的两个 with fluid.unique_name.guard() 移动到了 network 函数中了

按您的代码尝试后,提示错误

Traceback (most recent call last):
  File "train/train.py", line 51, in 
    test_label, = exe.run(program=test_program, fetch_list=[test_label_layer])
  File "/root/jazzornot.env/lib/python2.7/site-packages/paddle/fluid/executor.py", line 443, in run
    self.executor.run(program.desc, scope, 0, True, True)
paddle.fluid.core.EnforceNotMet: reader_ should not be null

我看貌似是因为 test_program 中 image_layer 这个 Variable 没声明导致的?请问 Executor 部分代码不用变,依然是 exe.run(fluid.default_startup_program()) 吗?

 

0
回复
s
sneaxiy
#4 回复于2018-09
joodo #3
十分感谢回复!!我看您的代码,是把定义 program 时的两个 with fluid.unique_name.guard() 移动到了 network 函数中了 按您的代码尝试后,提示错误 [代码] 我看貌似是因为 test_program 中 image_layer 这个 Variable 没声明导致的?请问 Executor 部分代码不用变,依然是 exe.run(fluid.default_startup_program()) 吗?  
展开

这个错误应该是没有跑startup所致,需要跑exe.run(fluid.default_startup_program())后再跑主程序

0
回复
joodo
#5 回复于2018-09
sneaxiy #4
这个错误应该是没有跑startup所致,需要跑exe.run(fluid.default_startup_program())后再跑主程序

您好,是有跑 start up 的。我在按照您代码修改的同时,保留了源代码 Executor 和 Train 部分的代码。在 Executor 部分代码第三行运行了 start up,但是问题依然存在

0
回复
s
sneaxiy
#6 回复于2018-09
joodo #5
您好,是有跑 start up 的。我在按照您代码修改的同时,保留了源代码 Executor 和 Train 部分的代码。在 Executor 部分代码第三行运行了 start up,但是问题依然存在

应该跑test的startup而不是default_startup

# Train program
train_label_layer = network(is_test=False)

# Test program
test_program = fluid.Program()
test_startup = fluid.Program()
with fluid.program_guard(test_program, test_startup):
    test_label_layer = network(is_test=True)

exe.run(test_startup)
0
回复
joodo
#7 回复于2018-09

已解决!十分感谢!

另外,当跑 test_startup 时,会出现 train 数据无法读取的问题。解决方法就是 test 和 train (也就是 default_startup_program)都跑一遍。

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