Example #1
0
    def test_ray_pong_preprocessor_config_in_python(self):
        in_space = IntBox(256,
                          shape=(210, 160, 3),
                          dtype="uint8",
                          add_batch_rank=True)

        # Regression test: Incrementally add preprocessors.
        specs = [spec for spec in self.preprocessing_spec_ray_pong]
        scopes = [spec["scope"] for spec in self.preprocessing_spec_ray_pong]

        # Set up python preprocessor.
        # Set backend to python.
        for spec in specs:
            spec["backend"] = "python"
        python_preprocessor = PreprocessorStack(*specs, backend="python")
        for sub_comp_scope in scopes:
            python_preprocessor.sub_components[
                sub_comp_scope].create_variables(
                    input_spaces=dict(preprocessing_inputs=in_space),
                    action_space=None)
            python_preprocessor.reset()

        # Generate a few states from random set points. Test if preprocessed states are almost equal
        states = in_space.sample(size=self.batch_size)
        python_preprocessed_states = python_preprocessor.preprocess(states)
        # TODO: add more checks here besides the shape.
        self.assertEqual(python_preprocessed_states.shape, (4, 84, 84, 4))
Example #2
0
    def test_two_preprocessor_layers_in_a_preprocessor_stack(self):
        space = Dict(a=FloatBox(shape=(1, 2)),
                     b=FloatBox(shape=(2, 2, 2)),
                     c=Tuple(FloatBox(shape=(2, )),
                             Dict(ca=FloatBox(shape=(3, 3, 2)))))

        # Construct the Component to test (PreprocessorStack).
        scale = Multiply(factor=2)
        gray = GrayScale(weights=(0.5, 0.5), keep_rank=False)
        stack = PreprocessorStack(scale, gray)
        test = ComponentTest(component=stack, input_spaces=dict(inputs=space))

        input_ = dict(
            a=np.array([[3.0, 5.0]]),
            b=np.array([[[2.0, 4.0], [2.0, 4.0]], [[2.0, 4.0], [2.0, 4.0]]]),
            c=(np.array([10.0, 20.0]),
               dict(ca=np.array([[[1.0, 2.0], [1.0, 2.0], [1.0, 2.0]],
                                 [[1.0, 2.0], [1.0, 2.0], [1.0, 2.0]],
                                 [[1.0, 2.0], [1.0, 2.0], [1.0, 2.0]]]))))
        expected = dict(a=np.array([8.0]),
                        b=np.array([[6.0, 6.0], [6.0, 6.0]]),
                        c=(30.0,
                           dict(ca=np.array([[3.0, 3.0, 3.0], [3.0, 3.0, 3.0],
                                             [3.0, 3.0, 3.0]]))))
        test.test("reset")
        test.test(("preprocess", input_), expected_outputs=expected)
Example #3
0
    def test_simple_preprocessor_stack_with_one_preprocess_layer(self):
        stack = PreprocessorStack(dict(type="multiply", factor=0.5))

        test = ComponentTest(component=stack, input_spaces=dict(inputs=float))

        test.test("reset")
        test.test(("preprocess", 2.0), expected_outputs=1.0)
Example #4
0
    def test_simple_python_preprocessor_stack(self):
        """
        Tests a pure python preprocessor stack.
        """
        space = FloatBox(shape=(2, ), add_batch_rank=True)
        # python PreprocessorStack
        multiply = dict(type="multiply", factor=0.5, scope="m")
        divide = dict(type="divide", divisor=0.5, scope="d")
        stack = PreprocessorStack(multiply, divide, backend="python")
        for sub_comp_scope in ["m", "d"]:
            stack.sub_components[sub_comp_scope].create_variables(
                input_spaces=dict(inputs=space))

        #test = ComponentTest(component=stack, input_spaces=dict(inputs=float))

        for _ in range_(3):
            # Call fake API-method directly (ok for PreprocessorStack).
            stack.reset()
            input_ = np.asarray([[1.0], [2.0], [3.0], [4.0]])
            expected = input_
            #test.test(("preprocess", input_), expected_outputs=expected)
            out = stack.preprocess(input_)
            recursive_assert_almost_equal(out, input_)

            input_ = space.sample()
            #test.test(("preprocess", input_), expected_outputs=expected)
            out = stack.preprocess(input_)
            recursive_assert_almost_equal(out, input_)
Example #5
0
    def test_preprocessor_from_list_spec(self):
        space = FloatBox(shape=(2, ))
        stack = PreprocessorStack.from_spec([
            dict(type="grayscale", keep_rank=False, weights=(0.5, 0.5)),
            dict(type="divide", divisor=2),
        ])
        test = ComponentTest(component=stack, input_spaces=dict(inputs=space))

        # Run the test.
        input_ = np.array([3.0, 5.0])
        expected = np.array(2.0)
        test.test("reset")
        test.test(("preprocess", input_), expected_outputs=expected)
    def test_batched_backend_equivalence(self):
        return
        """
        Tests if Python and TensorFlow backend return the same output
        for a standard DQN-style preprocessing stack.
        """
        env_spec = dict(
            type="openai",
            gym_env="Pong-v0",
            frameskip=4,
            max_num_noops=30,
            episodic_life=True
        )
        # Test with batching because we assume vector environments to be the normal case going forward.
        env = SequentialVectorEnv(num_envs=4, env_spec=env_spec, num_background_envs=2)
        in_space = env.state_space

        agent_config = config_from_path("configs/ray_apex_for_pong.json")
        preprocessing_spec = deepcopy(agent_config["preprocessing_spec"])

        # Set up python preprocessor.
        scopes = [preprocessor["scope"] for preprocessor in preprocessing_spec]
        # Set backend to python.
        for spec in preprocessing_spec:
            spec["backend"] = "python"
        python_processor = PreprocessorStack(*preprocessing_spec, backend="python")
        for sub_comp_scope in scopes:
            python_processor.sub_components[sub_comp_scope].create_variables(dict(preprocessing_inputs=in_space))
        python_processor.reset()

        # To have the use case we considered so far, use agent interface for TF backend.
        agent_config.pop("type")
        agent = ApexAgent(state_space=env.state_space, action_space=env.action_space, **agent_config)

        # Generate a few states from random set points. Test if preprocessed states are almost equal
        states = np.asarray(env.reset_all())
        actions, agent_preprocessed_states = agent.get_action(
            states=states, use_exploration=False, extra_returns="preprocessed_states")
        print("TensorFlow preprocessed shape: {}".format(np.asarray(agent_preprocessed_states).shape))
        python_preprocessed_states = python_processor.preprocess(states)
        print("Python preprocessed shape: {}".format(np.asarray(python_preprocessed_states).shape))
        print("Asserting (almost) equal values:")
        for tf_state, python_state in zip(agent_preprocessed_states, python_preprocessed_states):
            flat_tf = np.ndarray.flatten(tf_state)
            flat_python = np.ndarray.flatten(python_state)
            for x, y in zip(flat_tf, flat_python):
                recursive_assert_almost_equal(x, y, decimals=3)

        states, _, _, _ = env.step(actions)
        actions, agent_preprocessed_states = agent.get_action(
            states=states, use_exploration=False, extra_returns="preprocessed_states")
        print("TensorFlow preprocessed shape: {}".format(np.asarray(agent_preprocessed_states).shape))
        python_preprocessed_states = python_processor.preprocess(states)
        print("Python preprocessed shape: {}".format(np.asarray(python_preprocessed_states).shape))
        print("Asserting (almost) equal values:")
        recursive_assert_almost_equal(agent_preprocessed_states, python_preprocessed_states, decimals=3)
    def test_backend_equivalence(self):
        """
        Tests if Python and TensorFlow backend return the same output
        for a standard DQN-style preprocessing stack.
        """
        in_space = IntBox(256, shape=(210, 160, 3), dtype="uint8", add_batch_rank=True)

        # Regression test: Incrementally add preprocessors.
        to_use = []
        for i, decimals in zip(range_(len(self.preprocessing_spec)), [0, 0, 2, 2]):
            to_use.append(i)
            incremental_spec = []
            incremental_scopes = []
            for index in to_use:
                incremental_spec.append(deepcopy(self.preprocessing_spec[index]))
                incremental_scopes.append(self.preprocessing_spec[index]["scope"])

            print("Comparing incremental spec: {}".format(incremental_scopes))

            # Set up python preprocessor.
            # Set backend to python.
            for spec in incremental_spec:
                spec["backend"] = "python"
            python_preprocessor = PreprocessorStack(*incremental_spec, backend="python")
            for sub_comp_scope in incremental_scopes:
                python_preprocessor.sub_components[sub_comp_scope].create_variables(
                    input_spaces=dict(preprocessing_inputs=in_space), action_space=None
                )
                python_preprocessor.sub_components[sub_comp_scope].check_input_spaces(
                    input_spaces=dict(preprocessing_inputs=in_space), action_space=None
                )
                #build_space = python_processor.sub_components[sub_comp_scope].get_preprocessed_space(build_space)
                python_preprocessor.reset()

            # To compare to tf, use an equivalent tf PreprocessorStack.
            # Switch back to tf.
            for spec in incremental_spec:
                spec["backend"] = "tf"
            tf_preprocessor = PreprocessorStack(*incremental_spec, backend="tf")

            test = ComponentTest(component=tf_preprocessor, input_spaces=dict(
                inputs=in_space
            ))

            # Generate a few states from random set points. Test if preprocessed states are almost equal
            states = in_space.sample(size=self.batch_size)
            python_preprocessed_states = python_preprocessor.preprocess(states)
            tf_preprocessed_states = test.test(("preprocess", states), expected_outputs=None)

            print("Asserting (almost) equal values:")
            for tf_state, python_state in zip(tf_preprocessed_states, python_preprocessed_states):
                recursive_assert_almost_equal(tf_state, python_state, decimals=decimals)
            print("Success comparing: {}".format(incremental_scopes))