コード例 #1
0
    def test_tolerates_identity(self):
        conv = snt.Conv2D(output_channels=5, kernel_shape=3, padding='VALID')
        linear = snt.Linear(23)
        module = snt.Sequential([
            tf.identity,
            conv,
            tf.identity,
            tf.nn.relu,
            tf.identity,
            snt.BatchFlatten(),
            tf.identity,
            linear,
            tf.identity,
        ])

        network = ibp.VerifiableModelWrapper(module)
        network(self._inputs)

        v_layers = auto_verifier.VerifiableLayerBuilder(network).build_layers()

        self.assertLen(v_layers, 3)

        self.assertIsInstance(v_layers[0], layers.Conv)
        self.assertIs(conv, v_layers[0].module)

        self.assertIsInstance(v_layers[1], layers.Activation)
        self.assertEqual('relu', v_layers[1].activation)

        self.assertIsInstance(v_layers[2], layers.Linear)
        self.assertIs(linear, v_layers[2].module)
コード例 #2
0
    def test_stack_with_tf_activation(self, activation_fn):
        conv = snt.Conv2D(output_channels=5, kernel_shape=3, padding='VALID')
        linear = snt.Linear(23)
        module = snt.Sequential(
            [conv, activation_fn,
             snt.BatchFlatten(), linear])

        network = ibp.VerifiableModelWrapper(module)
        network(self._inputs)

        v_layers = auto_verifier.VerifiableLayerBuilder(network).build_layers()

        self.assertLen(v_layers, 3)

        self.assertIsInstance(v_layers[0], layers.Conv)
        self.assertIs(conv, v_layers[0].module)
        self.assertIsInstance(v_layers[0].input_node, ibp.ModelInputWrapper)

        self.assertIsInstance(v_layers[1], layers.Activation)
        self.assertEqual(activation_fn.__name__, v_layers[1].activation)
        self.assertIs(v_layers[0].output_node, v_layers[1].input_node)

        self.assertIsInstance(v_layers[2], layers.Linear)
        self.assertIs(linear, v_layers[2].module)

        self.assertIs(v_layers[2].output_node, network.output_module)
コード例 #3
0
    def test_empty_network(self):
        module = snt.Sequential([])

        network = ibp.VerifiableModelWrapper(module)
        network(self._inputs)

        v_layers = auto_verifier.VerifiableLayerBuilder(network).build_layers()

        self.assertEmpty(v_layers)
コード例 #4
0
    def test_leading_batchnorm_rejected(self):
        module = snt.Sequential([
            _BatchNorm(),
            snt.Conv2D(output_channels=5, kernel_shape=3, padding='VALID'),
        ])

        network = ibp.VerifiableModelWrapper(module)
        network(self._inputs)

        with self.assertRaises(auto_verifier.NotVerifiableError):
            _ = auto_verifier.VerifiableLayerBuilder(network).build_layers()
コード例 #5
0
    def test_avgpool_global(self):
        def module(inputs):
            return tf.reduce_mean(inputs, axis=(1, 2))

        network = ibp.VerifiableModelWrapper(module)
        network(self._inputs)

        v_layers = auto_verifier.VerifiableLayerBuilder(network).build_layers()

        self.assertLen(v_layers, 1)
        self.assertIsInstance(v_layers[0], layers.AvgPool)
        self.assertIs(None, v_layers[0].kernel_shape)
コード例 #6
0
    def test_leaky_relu(self):
        module = lambda x: tf.nn.leaky_relu(x, alpha=0.3)

        network = ibp.VerifiableModelWrapper(module)
        network(self._inputs)

        v_layers = auto_verifier.VerifiableLayerBuilder(network).build_layers()

        self.assertLen(v_layers, 1)
        self.assertIsInstance(v_layers[0], layers.Activation)
        self.assertEqual('leaky_relu', v_layers[0].activation)
        self.assertLen(v_layers[0].parameters, 1)
        self.assertAllClose(0.3, v_layers[0].parameters['alpha'])
コード例 #7
0
    def test_standalone_conv_module(self):
        module = snt.Conv2D(output_channels=5, kernel_shape=3, padding='VALID')

        network = ibp.VerifiableModelWrapper(module)
        network(self._inputs)

        v_layers = auto_verifier.VerifiableLayerBuilder(network).build_layers()

        self.assertLen(v_layers, 1)

        self.assertIsInstance(v_layers[0], layers.Conv)
        self.assertIs(module, v_layers[0].module)
        self.assertIsInstance(v_layers[0].input_node, ibp.ModelInputWrapper)

        self.assertIs(v_layers[0].output_node, network.output_module)
コード例 #8
0
    def test_unrecognised_trailing_calculation_rejected(self):
        class InvalidModule(snt.AbstractModule):
            def _build(self, inputs):
                module = snt.Conv2D(output_channels=5,
                                    kernel_shape=3,
                                    padding='VALID')
                return 2 * module(inputs)

        module = InvalidModule()

        network = ibp.VerifiableModelWrapper(module)
        network(self._inputs)

        with self.assertRaises(auto_verifier.NotVerifiableError):
            _ = auto_verifier.VerifiableLayerBuilder(network).build_layers()
コード例 #9
0
    def test_maxpool_global(self, with_relu):
        def module(inputs):
            outputs = tf.reduce_max(inputs, axis=(1, 2))
            if with_relu:
                outputs = tf.nn.relu(outputs)
            return outputs

        network = ibp.VerifiableModelWrapper(module)
        network(self._inputs)

        v_layers = auto_verifier.VerifiableLayerBuilder(network).build_layers()

        self.assertLen(v_layers, 1)
        self.assertIsInstance(v_layers[0], layers.MaxPool)
        self.assertIs(None, v_layers[0].kernel_shape)
        self.assertEqual(with_relu, v_layers[0].with_relu)
コード例 #10
0
    def test_avgpool(self):
        def module(inputs):
            return tf.nn.avg_pool(inputs,
                                  ksize=(3, 3),
                                  padding='VALID',
                                  strides=(2, 2))

        network = ibp.VerifiableModelWrapper(module)
        network(self._inputs)

        v_layers = auto_verifier.VerifiableLayerBuilder(network).build_layers()

        self.assertLen(v_layers, 1)
        self.assertIsInstance(v_layers[0], layers.AvgPool)
        self.assertEqual([3, 3], v_layers[0].kernel_shape)
        self.assertEqual([2, 2], v_layers[0].strides)
コード例 #11
0
    def test_flatten_and_linear(self):
        linear = snt.Linear(23)
        module = snt.Sequential([
            snt.BatchFlatten(),
            linear,
        ])

        network = ibp.VerifiableModelWrapper(module)
        network(self._inputs)

        v_layers = auto_verifier.VerifiableLayerBuilder(network).build_layers()

        self.assertLen(v_layers, 1)

        self.assertIsInstance(v_layers[0], layers.Linear)
        self.assertIs(linear, v_layers[0].module)
        self.assertEqual([2352], v_layers[0].input_node.shape)

        self.assertIs(v_layers[0].output_node, network.output_module)
コード例 #12
0
    def test_maxpool(self, with_relu):
        def module(inputs):
            outputs = tf.nn.max_pool(inputs,
                                     ksize=(3, 3),
                                     padding='VALID',
                                     strides=(2, 2))
            if with_relu:
                outputs = tf.nn.relu(outputs)
            return outputs

        network = ibp.VerifiableModelWrapper(module)
        network(self._inputs)

        v_layers = auto_verifier.VerifiableLayerBuilder(network).build_layers()

        self.assertLen(v_layers, 1)
        self.assertIsInstance(v_layers[0], layers.MaxPool)
        self.assertEqual([3, 3], v_layers[0].kernel_shape)
        self.assertEqual([2, 2], v_layers[0].strides)
        self.assertEqual(with_relu, v_layers[0].with_relu)
コード例 #13
0
    def test_batchnorm(self):
        conv = snt.Conv2D(output_channels=5, kernel_shape=3, padding='VALID')
        batchnorm = _BatchNorm()
        module = snt.Sequential([
            conv,
            batchnorm,
        ])

        network = ibp.VerifiableModelWrapper(module)
        network(self._inputs)

        v_layers = auto_verifier.VerifiableLayerBuilder(network).build_layers()

        self.assertLen(v_layers, 1)

        self.assertIsInstance(v_layers[0], layers.Conv)
        self.assertIs(conv, v_layers[0].module)
        self.assertIs(batchnorm, v_layers[0].batch_norm)
        self.assertIsInstance(v_layers[0].input_node, ibp.ModelInputWrapper)

        self.assertIs(v_layers[0].output_node, network.output_module)
コード例 #14
0
 def _verifiable_layer_builder(self, net):
     return auto_verifier.VerifiableLayerBuilder(net)