From 6dfb12ea30713948f4928d7a4e1de8dd129b0c9c Mon Sep 17 00:00:00 2001
From: "l.leufen" <l.leufen@fz-juelich.de>
Date: Tue, 15 Oct 2019 16:20:33 +0200
Subject: [PATCH] added first tests for inception model

---
 requirements.txt             |   1 +
 src/__init__.py              |   0
 test/__init__.py             |   0
 test/test_inception_model.py | 110 +++++++++++++++++++++++++++++++++++
 4 files changed, 111 insertions(+)
 create mode 100644 src/__init__.py
 create mode 100644 test/__init__.py
 create mode 100644 test/test_inception_model.py

diff --git a/requirements.txt b/requirements.txt
index 753c6e7f..4dd28a7d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +1,4 @@
 Keras==2.2.4
 numpy==1.15.4
 tensorflow==1.12.0
+pytest==5.2.1
\ No newline at end of file
diff --git a/src/__init__.py b/src/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/test/__init__.py b/test/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/test/test_inception_model.py b/test/test_inception_model.py
new file mode 100644
index 00000000..a03e50c1
--- /dev/null
+++ b/test/test_inception_model.py
@@ -0,0 +1,110 @@
+import pytest
+from src.inception_model import InceptionModelBase
+import keras
+import tensorflow as tf
+
+
+class TestInceptionModelBase:
+
+    @pytest.fixture
+    def base(self):
+        return InceptionModelBase()
+
+    @pytest.fixture
+    def input_x(self):
+        return keras.Input(shape=(32, 32, 3))
+
+    def test_init(self, base):
+        assert base.number_of_blocks == 0
+        assert base.part_of_block == 0
+        assert base.ord_base == 96
+
+    def test_block_part_name(self, base):
+        assert base.block_part_name() == chr(96)
+        base.part_of_block += 1
+        assert base.block_part_name() == 'a'
+
+    def test_create_conv_tower_3x3(self, base, input_x):
+        opts = {'input_X': input_x, 'reduction_filter': 64, 'tower_filter': 32, 'tower_kernel': (3, 3)}
+        tower = base.create_conv_tower(**opts)
+        # check second element of tower
+        assert base.part_of_block == 1
+        assert isinstance(tower, tf.Tensor)
+        assert tower.name == 'Block_0a_3x3/Relu:0'
+        assert isinstance(tower._keras_history[0], keras.layers.Conv2D)
+        assert tower._keras_history[0].filters == 32
+        assert isinstance(tower._keras_history[0].input, tf.Tensor)
+        assert tower._keras_history[0].padding == 'same'
+        assert tower._keras_history[0].kernel_size == (3, 3)
+        assert tower._keras_history[0].strides == (1, 1)
+        # check first element of tower
+        assert isinstance(tower._keras_history[0].input._keras_history[0], keras.layers.Conv2D)
+        assert tower._keras_history[0].input._keras_history[0].filters == 64
+        assert tower._keras_history[0].input._keras_history[0].kernel_size == (1, 1)
+        assert tower._keras_history[0].input._keras_history[0].padding == 'same'
+        assert tower._keras_history[0].input._keras_history[0].name == 'Block_0a_1x1'
+        assert tower._keras_history[0].input._keras_history[0].input._keras_shape == (None, 32, 32, 3)
+
+    def test_create_conv_tower_1x1(self, base, input_x):
+        opts = {'input_X': input_x, 'reduction_filter': 64, 'tower_filter': 32, 'tower_kernel': (1, 1)}
+        tower = base.create_conv_tower(**opts)
+        # check second element of tower
+        assert base.part_of_block == 1
+        assert isinstance(tower, tf.Tensor)
+        assert tower.name == 'Block_0a_1x1_1/Relu:0'
+        assert isinstance(tower._keras_history[0], keras.layers.Conv2D)
+        assert tower._keras_history[0].filters == 32
+        assert isinstance(tower._keras_history[0].input, tf.Tensor)
+        assert tower._keras_history[0].input._keras_shape == (None, 32, 32, 3)
+        assert tower._keras_history[0].padding == 'same'
+        assert tower._keras_history[0].kernel_size == (1, 1)
+        assert tower._keras_history[0].strides == (1, 1)
+
+    def test_create_conv_towers(self, base, input_x):
+        opts = {'input_X': input_x, 'reduction_filter': 64, 'tower_filter': 32, 'tower_kernel': (3, 3)}
+        _ = base.create_conv_tower(**opts)
+        tower = base.create_conv_tower(**opts)
+        assert base.part_of_block == 2
+        assert tower.name == 'Block_0b_3x3/Relu:0'
+
+    def test_create_pool_tower(self, base, input_x):
+        opts = {'input_X': input_x, 'pool_kernel': (3, 3), 'tower_filter': 32}
+        tower = base.create_pool_tower(**opts)
+        # check second element of tower
+        assert base.part_of_block == 0
+        assert isinstance(tower, tf.Tensor)
+        assert tower.name == 'conv2d_1/Relu:0'
+        assert isinstance(tower._keras_history[0], keras.layers.Conv2D)
+        assert tower._keras_history[0].filters == 32
+        assert tower._keras_history[0].padding == 'same'
+        assert tower._keras_history[0].kernel_size == (1, 1)
+        assert tower._keras_history[0].strides == (1, 1)
+        # check first element of tower
+        assert isinstance(tower._keras_history[0].input, tf.Tensor)
+        assert tower._keras_history[0].input._keras_history[0].pool_size == (3, 3)
+        assert tower._keras_history[0].input._keras_history[0].padding == 'same'
+        assert tower._keras_history[0].input._keras_history[0].name == 'max_pooling2d_1'
+
+    def test_inception_block(self, base, input_x):
+        conv = {'tower_1': {'reduction_filter': 64, 'tower_kernel': (3, 3), 'tower_filter': 64},
+                'tower_2': {'reduction_filter': 64, 'tower_kernel': (5, 5), 'tower_filter': 64}}
+        pool = {'pool_kernel': (3, 3), 'tower_filter': 64}
+        opts = {'input_X': input_x, 'tower_conv_parts': conv, 'tower_pool_parts': pool}
+        block = base.inception_block(**opts)
+        assert base.number_of_blocks == 1
+        concatenated = block._keras_history[0].input
+        assert len(concatenated) == 3
+        block_1a, block_1b, block_pool = concatenated
+        assert block_1a.name == 'Block_1a_3x3/Relu:0'
+        assert block_1b.name == 'Block_1b_5x5/Relu:0'
+        assert block_pool.name == 'conv2d_2/Relu:0'
+        # next block
+        opts['input_X'] = block
+        block = base.inception_block(**opts)
+        assert base.number_of_blocks == 2
+        concatenated = block._keras_history[0].input
+        assert len(concatenated) == 3
+        block_1a, block_1b, block_pool = concatenated
+        assert block_1a.name == 'Block_2a_3x3/Relu:0'
+        assert block_1b.name == 'Block_2b_5x5/Relu:0'
+        assert block_pool.name == 'conv2d_3/Relu:0'
-- 
GitLab