使用recordio时如何区分训练和测试数据?
收藏
根据 文档 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
收藏
请登录后评论
需将代码改为:
十分感谢回复!!我看您的代码,是把定义 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())后再跑主程序
您好,是有跑 start up 的。我在按照您代码修改的同时,保留了源代码 Executor 和 Train 部分的代码。在 Executor 部分代码第三行运行了 start up,但是问题依然存在
应该跑test的startup而不是default_startup
已解决!十分感谢!
另外,当跑 test_startup 时,会出现 train 数据无法读取的问题。解决方法就是 test 和 train (也就是 default_startup_program)都跑一遍。