def build_graph(self, only_forward=False):
        x_tensor = fluid.layers.data(
            name='x_tensor',
            shape=[self.x_tensor_dim],
            dtype='float32',
            lod_level=1)
        x_tensor.stop_gradient = False

        static_input_tensor = fluid.layers.data(
            name='static_input_tensor',
            shape=[self.static_input_tensor_dim],
            dtype='float32',
            lod_level=1)
        static_input_tensor.stop_gradient = False

        if only_forward:
            static_input_out_array = self._program.global_block().create_var(
                name='static_input_out_array',
                type=core.VarDesc.VarType.LOD_TENSOR_ARRAY,
                dtype='float32')
            static_input_out_array.stop_gradient = True

        rnn = fluid.layers.DynamicRNN()
        with rnn.block():
            step_x = rnn.step_input(x_tensor)
            step_static_input = rnn.static_input(static_input_tensor)
            if only_forward:
                fluid.layers.array_write(
                    x=step_static_input,
                    i=rnn.step_idx,
                    array=static_input_out_array)
            last = fluid.layers.sequence_pool(
                input=step_static_input, pool_type='last')
            projected = fluid.layers.fc(input=[step_x, last],
                                        size=self.output_dim)
            rnn.output(projected)

        if only_forward:
            static_input_step_outs = []
            step_idx = fluid.layers.fill_constant(
                shape=[1], dtype='int64', value=0)
            step_idx.stop_gradient = True

            for i in xrange(self._max_sequence_len):
                step_out = fluid.layers.array_read(static_input_out_array,
                                                   step_idx)
                step_out.stop_gradient = True
                static_input_step_outs.append(step_out)
                fluid.layers.increment(x=step_idx, value=1.0, in_place=True)

        if only_forward:
            return static_input_step_outs

        last = fluid.layers.sequence_pool(input=rnn(), pool_type='last')
        loss = fluid.layers.mean(last)
        append_backward(loss)
        static_input_grad = self._program.global_block().var(
            framework.grad_var_name('static_input_tensor'))
        return static_input_grad, loss
    def build_graph(self, only_forward=False):
        x_tensor = fluid.layers.data(name='x_tensor',
                                     shape=[self.x_tensor_dim],
                                     dtype='float32',
                                     lod_level=1)
        x_tensor.stop_gradient = False

        static_input_tensor = fluid.layers.data(
            name='static_input_tensor',
            shape=[self.static_input_tensor_dim],
            dtype='float32',
            lod_level=1)
        static_input_tensor.stop_gradient = False

        if only_forward:
            static_input_out_array = self._program.global_block().create_var(
                name='static_input_out_array',
                type=core.VarDesc.VarType.LOD_TENSOR_ARRAY,
                dtype='float32')
            static_input_out_array.stop_gradient = True

        rnn = fluid.layers.DynamicRNN()
        with rnn.block():
            step_x = rnn.step_input(x_tensor)
            step_static_input = rnn.static_input(static_input_tensor)
            if only_forward:
                fluid.layers.array_write(x=step_static_input,
                                         i=rnn.step_idx,
                                         array=static_input_out_array)
            last = fluid.layers.sequence_pool(input=step_static_input,
                                              pool_type='last')
            projected = fluid.layers.fc(input=[step_x, last],
                                        size=self.output_dim)
            rnn.output(projected)

        if only_forward:
            static_input_step_outs = []
            step_idx = fluid.layers.fill_constant(shape=[1],
                                                  dtype='int64',
                                                  value=0)
            step_idx.stop_gradient = True

            for i in xrange(self._max_sequence_len):
                step_out = fluid.layers.array_read(static_input_out_array,
                                                   step_idx)
                step_out.stop_gradient = True
                static_input_step_outs.append(step_out)
                fluid.layers.increment(x=step_idx, value=1.0, in_place=True)

        if only_forward:
            return static_input_step_outs

        last = fluid.layers.sequence_pool(input=rnn(), pool_type='last')
        loss = fluid.layers.mean(last)
        append_backward(loss)
        static_input_grad = self._program.global_block().var(
            framework.grad_var_name('static_input_tensor'))
        return static_input_grad, loss
Beispiel #3
0
 def __set_tensor__(name, data=None):
     out_tensor = scope.find_var(name).get_tensor()
     grad_tensor = scope.var(grad_var_name(name)).get_tensor()
     out_dtype = out_tensor.dtype()
     if data is None:
         if out_dtype == core.VarDesc.VarType.FP64:
             data = np.ones(out_tensor.shape(), dtype=np.float64)
         elif out_dtype == core.VarDesc.VarType.FP32:
             data = np.ones(out_tensor.shape(), dtype=np.float32)
         else:
             raise ValueError("Not supported data type " + str(out_dtype))
     grad_tensor.set(data, place)
Beispiel #4
0
 def __set_tensor__(name, data=None):
     out_tensor = scope.find_var(name).get_tensor()
     grad_tensor = scope.var(grad_var_name(name)).get_tensor()
     out_dtype = out_tensor.dtype()
     if data is None:
         if out_dtype == core.VarDesc.VarType.FP64:
             data = np.ones(out_tensor.shape(), dtype=np.float64)
         elif out_dtype == core.VarDesc.VarType.FP32:
             data = np.ones(out_tensor.shape(), dtype=np.float32)
         else:
             raise ValueError("Not supported data type " + str(out_dtype))
     grad_tensor.set(data, place)
Beispiel #5
0
 def backward(self):
     self.feed_map = {
         x: create_tensor(getattr(self.py_argsort, x), self.place)
         for x in self.feed_data_field
     }
     fetch_list = [
         self.main_program.global_block().var(grad_var_name(x))
         for x in self.grad_data_field
     ]
     exe = Executor(self.place)
     out = exe.run(self.main_program,
                   feed=self.feed_map,
                   fetch_list=fetch_list,
                   return_numpy=False)
     return out
Beispiel #6
0
    def backward(self):
        self.feed_map = {
            x: create_tensor(getattr(self.py_rnn, x), self.place)
            for x in self.data_field
        }
        fetch_list = [
            self.main_program.global_block().var(grad_var_name(x))
            for x in self.data_field
        ]

        exe = Executor(self.place)
        return exe.run(self.main_program,
                       feed=self.feed_map,
                       fetch_list=fetch_list,
                       return_numpy=False)
    def backward(self):
        self.feed_map = {
            x: create_tensor(getattr(self.py_rnn, x), self.place)
            for x in self.data_field
        }
        fetch_list = [
            self.main_program.global_block().var(grad_var_name(x))
            for x in self.data_field
        ]

        gc_vars = core._get_eager_deletion_vars(
            self.main_program.desc, [var.name for var in fetch_list])
        self.assertEqual(len(gc_vars), self.main_program.num_blocks)

        exe = Executor(self.place)
        return exe.run(self.main_program,
                       feed=self.feed_map,
                       fetch_list=fetch_list,
                       return_numpy=False)
Beispiel #8
0
    def backward(self):
        self.feed_map = {
            x: create_tensor(getattr(self.py_rnn, x), self.place)
            for x in self.data_field
        }
        fetch_list = [
            self.main_program.global_block().var(grad_var_name(x))
            for x in self.data_field
        ]

        build_strategy = fluid.BuildStrategy()
        build_strategy.enable_inplace = True
        exec_strategy = fluid.ExecutionStrategy()
        parallel_exe = fluid.ParallelExecutor(use_cuda=False,
                                              loss_name=self.output.name,
                                              main_program=self.main_program,
                                              build_strategy=build_strategy,
                                              exec_strategy=exec_strategy)
        return parallel_exe.run(feed=self.feed_map,
                                fetch_list=fetch_list,
                                return_numpy=False)