diff --git a/requirements.txt b/requirements.txt index 753c6e7f74687102959923303c80a8090bba8907..4dd28a7df8a030029f5c662a3e9373ad0a142647 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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/test/test_inception_model.py b/test/test_inception_model.py new file mode 100644 index 0000000000000000000000000000000000000000..a03e50c13dc0bf8f3edb01d11547871e44b8e1c6 --- /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'