使用recordio时如何区分训练和测试数据?
joodo 发布于2018-09-11 15:25 浏览:134 回复:6
0
收藏

根据 文档 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条回复 最后由joodo回复于2018-09-12 18:34
#7joodo回复于2018-09-12 18:34:23

已解决!十分感谢!

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

0
#6sneaxiy回复于2018-09-12 16:10:34
#5 joodo回复
您好,是有跑 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
#5joodo回复于2018-09-12 15:33:24
#4 sneaxiy回复
这个错误应该是没有跑startup所致,需要跑exe.run(fluid.default_startup_program())后再跑主程序
展开

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

0
#4sneaxiy回复于2018-09-12 15:14:35
#3 joodo回复
十分感谢回复!!我看您的代码,是把定义 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
#3joodo回复于2018-09-12 14:30:45
#2 sneaxiy回复
需将代码改为: [代码]

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

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

Traceback (most recent call last):
  File "train/train.py", line 51, in <module>
    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
#2sneaxiy回复于2018-09-12 13:33:11

需将代码改为:

# 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
TOP
切换版块