def test_lod_tensor_gpu_init(self): if not core.is_compiled_with_cuda(): return place = core.CUDAPlace(0) lod_py = [[2, 1], [1, 2, 2]] lod_tensor = core.LoDTensor() lod_tensor._set_dims([5, 2, 3, 4]) lod_tensor.set_recursive_sequence_lengths(lod_py) lod_tensor._alloc_float(place) tensor_array = numpy.array(lod_tensor) tensor_array[0, 0, 0, 0] = 1.0 tensor_array[0, 0, 0, 1] = 2.0 lod_tensor.set(tensor_array, place) lod_v = numpy.array(lod_tensor) self.assertAlmostEqual(1.0, lod_v[0, 0, 0, 0]) self.assertAlmostEqual(2.0, lod_v[0, 0, 0, 1]) self.assertListEqual(lod_py, lod_tensor.recursive_sequence_lengths())
def test_lod_tensor_to_array_level_2(self): tensor = core.LoDTensor() tensor.set( numpy.arange(50).reshape(50, 1).astype('int32'), self.place()) tensor.set_recursive_sequence_lengths( [[2, 3, 1], [2, 3, 1, 4, 2, 1], [3, 4, 4, 6, 4, 1, 1, 4, 4, 8, 6, 1, 4]]) expect = [ numpy.array(item, dtype='int32') for item in [[21, 0, 1, 2, 3, 4, 5, 6, 46, 47, 48, 49], range(22, 39) + range(7, 21), range(39, 46)] ] lod = [[[1, 2, 1], [1, 3, 4, 4]], [[4, 3], [1, 4, 4, 8, 4, 6, 4]], [[2], [6, 1]]] self.main(tensor=tensor, expect_array=expect, expect_lod=lod, expect_max_len=3)
def test_feed_fetch(self): scope = core.Scope() place = core.CPUPlace() input_array = np.ones((4, 4, 6)).astype("float32") input_array[0, 0, 0] = 3 input_array[3, 3, 5] = 10 input_tensor = core.LoDTensor([[2, 2]]) input_tensor.set(input_array, place) core.set_feed_variable(scope, input_tensor, "feed", 0) output_tensor = core.get_fetch_variable(scope, "feed", 0) output_lod = output_tensor.recursive_sequence_lengths() self.assertEqual(2, output_lod[0][0]) self.assertEqual(2, output_lod[0][1]) output_array = np.array(output_tensor) self.assertEqual(3, output_array[0, 0, 0]) self.assertEqual(10, output_array[3, 3, 5])
def get_attention_feeder_data(data, place, need_label=True): #print data.shape #print ("data shape") #print (data) #print ("data") pixel_tensor = core.LoDTensor() pixel_data = None pixel_data = np.concatenate(list(map(lambda x: x[0][np.newaxis, :], data)), axis=0).astype("float32") pixel_tensor.set(pixel_data, place) label_in_tensor = to_lodtensor(list(map(lambda x: x[1], data)), place) label_out_tensor = to_lodtensor(list(map(lambda x: x[2], data)), place) if need_label: return { "pixel": pixel_tensor, "label_in": label_in_tensor, "label_out": label_out_tensor } else: return {"pixel": pixel_tensor}
def infer(args): data_shape = [-1, 3, 256, 256] input = fluid.layers.data(name='input', shape=data_shape, dtype='float32') if args.input_style == "A": model_name = 'g_a' fake = build_generator_resnet_9blocks(input, name="g_A") elif args.input_style == "B": model_name = 'g_b' fake = build_generator_resnet_9blocks(input, name="g_B") else: raise "Input with style [%s] is not supported." % args.input_style # prepare environment place = fluid.CPUPlace() if args.use_gpu: place = fluid.CUDAPlace(0) exe = fluid.Executor(place) exe.run(fluid.default_startup_program()) fluid.io.load_persistables(exe, args.init_model + "/" + model_name) if not os.path.exists(args.output): os.makedirs(args.output) for file in glob.glob(args.input): print "read %s" % file image_name = os.path.basename(file) image = Image.open(file) image = image.resize((256, 256)) image = np.array(image) / 127.5 - 1 if len(image.shape) != 3: continue data = image.transpose([2, 0, 1])[np.newaxis, :].astype("float32") tensor = core.LoDTensor() tensor.set(data, place) fake_temp = exe.run(fetch_list=[fake.name], feed={"input": tensor}) fake_temp = np.squeeze(fake_temp[0]).transpose([1, 2, 0]) input_temp = np.squeeze(data).transpose([1, 2, 0]) imsave(args.output + "/fake_" + image_name, ( (fake_temp + 1) * 127.5).astype(np.uint8))
def get_attention_feeder_for_infer(data, place): batch_size = len(data) init_ids_data = np.array([0 for _ in range(batch_size)], dtype='int64') init_scores_data = np.array( [1. for _ in range(batch_size)], dtype='float32') init_ids_data = init_ids_data.reshape((batch_size, 1)) init_scores_data = init_scores_data.reshape((batch_size, 1)) init_recursive_seq_lens = [1] * batch_size init_recursive_seq_lens = [init_recursive_seq_lens, init_recursive_seq_lens] init_ids = fluid.create_lod_tensor(init_ids_data, init_recursive_seq_lens, place) init_scores = fluid.create_lod_tensor(init_scores_data, init_recursive_seq_lens, place) pixel_tensor = core.LoDTensor() pixel_data = None pixel_data = np.concatenate( list(map(lambda x: x[0][np.newaxis, :], data)), axis=0).astype("float32") pixel_tensor.set(pixel_data, place) return { "pixel": pixel_tensor, "init_ids": init_ids, "init_scores": init_scores }
def create_tensor(np_data, place): tensor = core.LoDTensor() tensor.set(np_data, place) return tensor
def train(args): max_images_num = data_reader.max_images_num() shuffle = True if args.run_ce: np.random.seed(10) fluid.default_startup_program().random_seed = 90 max_images_num = 1 shuffle = False data_shape = [-1] + data_reader.image_shape() input_A = fluid.layers.data(name='input_A', shape=data_shape, dtype='float32') input_B = fluid.layers.data(name='input_B', shape=data_shape, dtype='float32') fake_pool_A = fluid.layers.data(name='fake_pool_A', shape=data_shape, dtype='float32') fake_pool_B = fluid.layers.data(name='fake_pool_B', shape=data_shape, dtype='float32') g_A_trainer = GATrainer(input_A, input_B) g_B_trainer = GBTrainer(input_A, input_B) d_A_trainer = DATrainer(input_A, fake_pool_A) d_B_trainer = DBTrainer(input_B, fake_pool_B) # prepare environment place = fluid.CPUPlace() if args.use_gpu: place = fluid.CUDAPlace(0) exe = fluid.Executor(place) exe.run(fluid.default_startup_program()) A_pool = ImagePool() B_pool = ImagePool() A_reader = paddle.batch(data_reader.a_reader(shuffle=shuffle), args.batch_size)() B_reader = paddle.batch(data_reader.b_reader(shuffle=shuffle), args.batch_size)() if not args.run_ce: A_test_reader = data_reader.a_test_reader() B_test_reader = data_reader.b_test_reader() def test(epoch): out_path = args.output + "/test" if not os.path.exists(out_path): os.makedirs(out_path) i = 0 for data_A, data_B in zip(A_test_reader(), B_test_reader()): A_name = data_A[1] B_name = data_B[1] tensor_A = core.LoDTensor() tensor_B = core.LoDTensor() tensor_A.set(data_A[0], place) tensor_B.set(data_B[0], place) fake_A_temp, fake_B_temp, cyc_A_temp, cyc_B_temp = exe.run( g_A_trainer.infer_program, fetch_list=[ g_A_trainer.fake_A, g_A_trainer.fake_B, g_A_trainer.cyc_A, g_A_trainer.cyc_B ], feed={ "input_A": tensor_A, "input_B": tensor_B }) fake_A_temp = np.squeeze(fake_A_temp[0]).transpose([1, 2, 0]) fake_B_temp = np.squeeze(fake_B_temp[0]).transpose([1, 2, 0]) cyc_A_temp = np.squeeze(cyc_A_temp[0]).transpose([1, 2, 0]) cyc_B_temp = np.squeeze(cyc_B_temp[0]).transpose([1, 2, 0]) input_A_temp = np.squeeze(data_A[0]).transpose([1, 2, 0]) input_B_temp = np.squeeze(data_B[0]).transpose([1, 2, 0]) imsave(out_path + "/fakeB_" + str(epoch) + "_" + A_name, ((fake_B_temp + 1) * 127.5).astype(np.uint8)) imsave(out_path + "/fakeA_" + str(epoch) + "_" + B_name, ((fake_A_temp + 1) * 127.5).astype(np.uint8)) imsave(out_path + "/cycA_" + str(epoch) + "_" + A_name, ((cyc_A_temp + 1) * 127.5).astype(np.uint8)) imsave(out_path + "/cycB_" + str(epoch) + "_" + B_name, ((cyc_B_temp + 1) * 127.5).astype(np.uint8)) imsave(out_path + "/inputA_" + str(epoch) + "_" + A_name, ((input_A_temp + 1) * 127.5).astype(np.uint8)) imsave(out_path + "/inputB_" + str(epoch) + "_" + B_name, ((input_B_temp + 1) * 127.5).astype(np.uint8)) i += 1 def checkpoints(epoch): out_path = args.output + "/checkpoints/" + str(epoch) if not os.path.exists(out_path): os.makedirs(out_path) fluid.io.save_persistables(exe, out_path + "/g_a", main_program=g_A_trainer.program) fluid.io.save_persistables(exe, out_path + "/g_b", main_program=g_B_trainer.program) fluid.io.save_persistables(exe, out_path + "/d_a", main_program=d_A_trainer.program) fluid.io.save_persistables(exe, out_path + "/d_b", main_program=d_B_trainer.program) print("saved checkpoint to {}".format(out_path)) sys.stdout.flush() def init_model(): assert os.path.exists( args.init_model), "[%s] cann't be found." % args.init_mode fluid.io.load_persistables(exe, args.init_model + "/g_a", main_program=g_A_trainer.program) fluid.io.load_persistables(exe, args.init_model + "/g_b", main_program=g_B_trainer.program) fluid.io.load_persistables(exe, args.init_model + "/d_a", main_program=d_A_trainer.program) fluid.io.load_persistables(exe, args.init_model + "/d_b", main_program=d_B_trainer.program) print("Load model from {}".format(args.init_model)) if args.init_model: init_model() losses = [[], []] t_time = 0 build_strategy = fluid.BuildStrategy() build_strategy.enable_inplace = False build_strategy.memory_optimize = False exec_strategy = fluid.ExecutionStrategy() exec_strategy.num_threads = 1 exec_strategy.use_experimental_executor = True #exec_strategy.num_iteration_per_drop_scope = 100 g_A_trainer.g_loss_A.persistable = True g_A_trainer.fake_B.persistable = True d_B_trainer.d_loss_B.persistable = True g_B_trainer.g_loss_B.persistable = True g_B_trainer.fake_A.persistable = True d_A_trainer.d_loss_A.persistable = True g_A_trainer_program = fluid.CompiledProgram( g_A_trainer.program).with_data_parallel( loss_name=g_A_trainer.g_loss_A.name, build_strategy=build_strategy, exec_strategy=exec_strategy) g_B_trainer_program = fluid.CompiledProgram( g_B_trainer.program).with_data_parallel( loss_name=g_B_trainer.g_loss_B.name, build_strategy=build_strategy, exec_strategy=exec_strategy) d_B_trainer_program = fluid.CompiledProgram( d_B_trainer.program).with_data_parallel( loss_name=d_B_trainer.d_loss_B.name, build_strategy=build_strategy, exec_strategy=exec_strategy) d_A_trainer_program = fluid.CompiledProgram( d_A_trainer.program).with_data_parallel( loss_name=d_A_trainer.d_loss_A.name, build_strategy=build_strategy, exec_strategy=exec_strategy) for epoch in range(args.epoch): batch_id = 0 for i in range(max_images_num): data_A = next(A_reader) data_B = next(B_reader) tensor_A = core.LoDTensor() tensor_B = core.LoDTensor() tensor_A.set(data_A, place) tensor_B.set(data_B, place) s_time = time.time() # optimize the g_A network g_A_loss, fake_B_tmp = exe.run( g_A_trainer_program, fetch_list=[g_A_trainer.g_loss_A, g_A_trainer.fake_B], feed={ "input_A": tensor_A, "input_B": tensor_B }) fake_pool_B = B_pool.pool_image(fake_B_tmp) # optimize the d_B network d_B_loss = exe.run(d_B_trainer_program, fetch_list=[d_B_trainer.d_loss_B], feed={ "input_B": tensor_B, "fake_pool_B": fake_pool_B })[0] # optimize the g_B network g_B_loss, fake_A_tmp = exe.run( g_B_trainer_program, fetch_list=[g_B_trainer.g_loss_B, g_B_trainer.fake_A], feed={ "input_A": tensor_A, "input_B": tensor_B }) fake_pool_A = A_pool.pool_image(fake_A_tmp) # optimize the d_A network d_A_loss = exe.run(d_A_trainer_program, fetch_list=[d_A_trainer.d_loss_A], feed={ "input_A": tensor_A, "fake_pool_A": fake_pool_A })[0] batch_time = time.time() - s_time t_time += batch_time print( "epoch{}; batch{}; g_A_loss: {}; d_B_loss: {}; g_B_loss: {}; d_A_loss: {}; " "Batch_time_cost: {:.2f}".format(epoch, batch_id, g_A_loss[0], d_B_loss[0], g_B_loss[0], d_A_loss[0], batch_time)) losses[0].append(g_A_loss[0]) losses[1].append(d_A_loss[0]) sys.stdout.flush() batch_id += 1 if args.run_test and not args.run_ce: test(epoch) if args.save_checkpoints and not args.run_ce: checkpoints(epoch) if args.run_ce: print("kpis,g_train_cost,{}".format(np.mean(losses[0]))) print("kpis,d_train_cost,{}".format(np.mean(losses[1]))) print("kpis,duration,{}".format(t_time / args.epoch))
def as_lodtensor(np_array, lod, place): tensor = core.LoDTensor() tensor.set(np_value, place) if lod is not None: tensor.set_recursive_sequence_lengths(lod) return tensor
def test_get_set(self): scope = core.Scope() program = fluid.Program() block = program.global_block() input_arr = block.create_var( name="tmp_lod_tensor_array", type=core.VarDesc.VarType.LOD_TENSOR_ARRAY) input_arr.persistable = True input_arr_var = scope.var('tmp_lod_tensor_array') input_tensor_array = input_arr_var.get_lod_tensor_array() self.assertEqual(0, len(input_tensor_array)) cpu = core.CPUPlace() for i in range(10): t = core.LoDTensor() if i == 0: t.set(numpy.array([[i], [i]], dtype='float32'), cpu) else: t.set(numpy.array([[i]], dtype='float32'), cpu) input_tensor_array.append(t) self.assertEqual(10, len(input_tensor_array)) random_grad = numpy.random.random_sample([11]).astype(numpy.float32) y_out = block.create_var(name="Out") y_out.persistable = True y_out_index = block.create_var(name="OutIndex") y_out_index.persistable = True y_grad_arr = block.create_var( name='Out@GRAD', dtype='float32', shape=[11]) y_grad_arr.persistable = True y_grad = scope.var('Out@GRAD') y_grad_tensor = y_grad.get_tensor() y_grad_tensor.set(random_grad, cpu) op = block.append_op( type=self.op_type, inputs={"X": input_arr}, outputs={"Out": y_out, "OutIndex": y_out_index}, attrs=self.attrs) out_grad = block.create_var( name="tmp_lod_tensor_array@GRAD", type=core.VarDesc.VarType.LOD_TENSOR_ARRAY) out_grad.persistable = True grad_op_desc_list, op_grad_to_var = core.get_grad_op_desc(op.desc, set(), []) grad_op_desc = grad_op_desc_list[0] new_op_desc = block.desc.append_op() new_op_desc.copy_from(grad_op_desc) for var_name in grad_op_desc.output_arg_names(): block.desc.var(var_name.encode("ascii")) grad_op_desc.infer_var_type(block.desc) grad_op_desc.infer_shape(block.desc) for arg in grad_op_desc.output_arg_names(): grad_var = block.desc.find_var(arg.encode("ascii")) grad_var.set_dtype(core.VarDesc.VarType.FP32) fetch_list = [] fetch_list.append(block.var('Out')) fetch_list.append(block.var('OutIndex')) exe = fluid.Executor(fluid.CPUPlace()) out = exe.run(program, fetch_list=fetch_list, scope=scope) #print ("index: ", numpy.array(out[1])) # test forward tensor_res = numpy.array(out[0]) tensor_res_out_idx = numpy.array(out[1]) tensor_gt = numpy.array( [0] + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='float32') self.assertEqual(len(tensor_res), len(tensor_gt)) self.assertEqual(len(tensor_res_out_idx), 10) for i in range(len(tensor_res)): self.assertEqual(tensor_res[i], tensor_gt[i]) for i in range(len(tensor_res_out_idx)): if i == 0: self.assertEqual(tensor_res_out_idx[i], 2) else: self.assertEqual(tensor_res_out_idx[i], 1) # test backward grad_tensor = scope.var('tmp_lod_tensor_array@GRAD') grad_tensor_array = grad_tensor.get_lod_tensor_array() self.assertEqual(10, len(grad_tensor_array)) for i in range(len(grad_tensor_array)): if i == 0: self.assertEqual( numpy.array(grad_tensor_array[i])[0], numpy.array(random_grad[i])) self.assertEqual( numpy.array(grad_tensor_array[i])[1], numpy.array(random_grad[i + 1])) if i == 1: self.assertEqual( numpy.array(grad_tensor_array[i]), numpy.array(random_grad[i + 1]))
def setUp(self): self.place = core.CUDAPlace(0) self.x_tensor = core.LoDTensor() tensor_np = np.random.random(size=(2, 3)).astype('float32') self.x_tensor.set(tensor_np, self.place) self.x_tensor.set_lod([[0, 1, 1]])
def create_tensor(np_data, place, lod=None): tensor = core.LoDTensor() tensor.set(np_data, place) if lod: tensor.set_recursive_sequence_lengths(lod) return tensor
def _numpy_to_lod_tensor(np_value, lod, place): tensor = core.LoDTensor() tensor.set(np_value, place) if lod is not None: tensor.set_lod(lod) return tensor
def _as_lodtensor(data, place): # single tensor case tensor = core.LoDTensor() tensor.set(data, place) return tensor
def _numpy_to_lod_tensor(np_value, lod, place): tensor = core.LoDTensor() tensor.set(np_value, place) if lod is not None: tensor.set_recursive_sequence_lengths(lod) return tensor
def append_lod_tensor(self, tensor_array, lod, data): lod_tensor = core.LoDTensor() lod_tensor.set_lod(lod) lod_tensor.set(data, self.place) tensor_array.append(lod_tensor)
def setUp(self): self.place = core.CPUPlace() self.x_tensor = core.LoDTensor() tensor_np = np.random.random(size=(2, 3)).astype('float32') self.x_tensor.set(tensor_np, self.place) self.x_tensor.set_recursive_sequence_lengths([[1, 1]])