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