diff --git a/src/model_modules/inception_model.py b/src/model_modules/inception_model.py index c3fe27476272b18b4e4630e641f43ab03b555f9b..baf1d0250a319008c573109da765613ca87b2c77 100644 --- a/src/model_modules/inception_model.py +++ b/src/model_modules/inception_model.py @@ -54,6 +54,7 @@ class InceptionModelBase: regularizer = kwargs.get('regularizer', keras.regularizers.l2(0.01)) bn_settings = kwargs.get('bn_settings', {}) act_settings = kwargs.get('act_settings', {}) + padding = kwargs.get('padding', 'ZeroPad2D') logging.debug(f'Inception Block with activation: {activation}') block_name = f'Block_{self.number_of_blocks}{self.block_part_name()}_{tower_kernel[0]}x{tower_kernel[1]}' @@ -74,9 +75,9 @@ class InceptionModelBase: name=f'Block_{self.number_of_blocks}{self.block_part_name()}_1x1')(input_x) tower = self.act(tower, activation, **act_settings) - tower = self.padding_layer('SymPad2D')(padding=padding_size, - name=f'Block_{self.number_of_blocks}{self.block_part_name()}_Pad' - )(tower) + tower = self.padding_layer(padding)(padding=padding_size, + name=f'Block_{self.number_of_blocks}{self.block_part_name()}_Pad' + )(tower) tower = layers.Conv2D(tower_filter, tower_kernel, @@ -116,19 +117,19 @@ class InceptionModelBase: } if isinstance(padding, str): try: - pad2D = allowed_paddings[padding] + pad2d = allowed_paddings[padding] except KeyError as einfo: raise NotImplementedError( f"`{einfo}' is not implemented as padding. " "Use one of those: i) `RefPad2D', ii) `SymPad2D', iii) `ZeroPad2D'") else: if padding in allowed_paddings.values(): - pad2D = padding + pad2d = padding else: - raise ValueError(f"`{padding.__name__}' is not a valid padding padding. " - "Use one of those: " - "i) ReflectionPadding2D, ii) `SymmetricPadding2D', iii) `ZeroPadding2D'") - return pad2D + raise TypeError(f"`{padding.__name__}' is not a valid padding layer type. " + "Use one of those: " + "i) ReflectionPadding2D, ii) SymmetricPadding2D, iii) ZeroPadding2D") + return pad2d def create_pool_tower(self, input_x, pool_kernel, tower_filter, activation='relu', max_pooling=True, **kwargs): """ @@ -143,6 +144,7 @@ class InceptionModelBase: self.part_of_block += 1 self.act_number = 1 act_settings = kwargs.get('act_settings', {}) + padding = kwargs.get('padding', 'ZeroPad2D') padding_size = PadUtils.get_padding_for_same(kernel_size=pool_kernel) # pooling block @@ -154,11 +156,11 @@ class InceptionModelBase: block_type = "AvgPool" pooling = layers.AveragePooling2D - tower = self.padding_layer('SymPad2D')(padding=padding_size, name=block_name+'Pad')(input_x) + tower = self.padding_layer(padding)(padding=padding_size, name=block_name+'Pad')(input_x) tower = pooling(pool_kernel, strides=(1, 1), padding='valid', name=block_name+block_type)(tower) # convolution block - tower = layers.Conv2D(tower_filter, (1, 1), padding='same', name=block_name+"1x1")(tower) + tower = layers.Conv2D(tower_filter, (1, 1), padding='valid', name=block_name+"1x1")(tower) tower = self.act(tower, activation, **act_settings) return tower @@ -170,16 +172,22 @@ class InceptionModelBase: :param tower_conv_parts: dict containing settings for parts of inception block; Example: tower_conv_parts = {'tower_1': {'reduction_filter': 32, 'tower_filter': 64, - 'tower_kernel': (3, 1)}, + 'tower_kernel': (3, 1), + 'activation' : 'relu', + 'padding' : 'SymPad2D'} 'tower_2': {'reduction_filter': 32, 'tower_filter': 64, - 'tower_kernel': (5, 1)}, + 'tower_kernel': (5, 1), + 'activation' : LeakyReLU, + 'padding' : keras.layers.ZeroPadding2D} 'tower_3': {'reduction_filter': 32, 'tower_filter': 64, - 'tower_kernel': (1, 1)}, + 'tower_kernel': (1, 1), + 'activation' : ELU, + 'padding' : src.model_modules.advanced_paddings.ReflectionPadding2D} } :param tower_pool_parts: dict containing settings for pool part of inception block; Example: - tower_pool_parts = {'pool_kernel': (3, 1), 'tower_filter': 64} + tower_pool_parts = {'pool_kernel': (3, 1), 'tower_filter': 64, 'padding': 'RefPad2D'} :return: """ self.number_of_blocks += 1 @@ -201,41 +209,41 @@ class InceptionModelBase: return block -if __name__ == '__main__': - from keras.models import Model - from keras.layers import Conv2D, Flatten, Dense, Input - import numpy as np - - - kernel_1 = (3, 3) - kernel_2 = (5, 5) - x = np.array(range(2000)).reshape(-1, 10, 10, 1) - y = x.mean(axis=(1, 2)) - - x_input = Input(shape=x.shape[1:]) - pad1 = PadUtils.get_padding_for_same(kernel_size=kernel_1) - x_out = InceptionModelBase.padding_layer('RefPad2D')(padding=pad1, name="RefPAD1")(x_input) - # x_out = ReflectionPadding2D(padding=pad1, name="RefPAD")(x_input) - x_out = Conv2D(5, kernel_size=kernel_1, activation='relu')(x_out) - - pad2 = PadUtils.get_padding_for_same(kernel_size=kernel_2) - x_out = InceptionModelBase.padding_layer(SymmetricPadding2D)(padding=pad2, name="SymPAD1")(x_out) - # x_out = SymmetricPadding2D(padding=pad2, name="SymPAD")(x_out) - x_out = Conv2D(2, kernel_size=kernel_2, activation='relu')(x_out) - x_out = Flatten()(x_out) - x_out = Dense(1, activation='linear')(x_out) - - model = Model(inputs=x_input, outputs=x_out) - model.compile('adam', loss='mse') - model.summary() - # model.fit(x, y, epochs=10) +# if __name__ == '__main__': +# from keras.models import Model +# from keras.layers import Conv2D, Flatten, Dense, Input +# import numpy as np +# +# +# kernel_1 = (3, 3) +# kernel_2 = (5, 5) +# x = np.array(range(2000)).reshape(-1, 10, 10, 1) +# y = x.mean(axis=(1, 2)) +# +# x_input = Input(shape=x.shape[1:]) +# pad1 = PadUtils.get_padding_for_same(kernel_size=kernel_1) +# x_out = InceptionModelBase.padding_layer('RefPad2D')(padding=pad1, name="RefPAD1")(x_input) +# # x_out = ReflectionPadding2D(padding=pad1, name="RefPAD")(x_input) +# x_out = Conv2D(5, kernel_size=kernel_1, activation='relu')(x_out) +# +# pad2 = PadUtils.get_padding_for_same(kernel_size=kernel_2) +# x_out = InceptionModelBase.padding_layer(SymmetricPadding2D)(padding=pad2, name="SymPAD1")(x_out) +# # x_out = SymmetricPadding2D(padding=pad2, name="SymPAD")(x_out) +# x_out = Conv2D(2, kernel_size=kernel_2, activation='relu')(x_out) +# x_out = Flatten()(x_out) +# x_out = Dense(1, activation='linear')(x_out) +# +# model = Model(inputs=x_input, outputs=x_out) +# model.compile('adam', loss='mse') +# model.summary() +# # model.fit(x, y, epochs=10) if __name__ == '__main__': print(__name__) from keras.datasets import cifar10 from keras.utils import np_utils from keras.layers import Input - from keras.layers.advanced_activations import LeakyReLU + from keras.layers.advanced_activations import LeakyReLU, ELU from keras.optimizers import SGD from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D from keras.models import Model @@ -244,11 +252,17 @@ if __name__ == '__main__': conv_settings_dict = {'tower_1': {'reduction_filter': 64, 'tower_filter': 64, 'tower_kernel': (3, 3), - 'activation': LeakyReLU}, + 'activation': LeakyReLU,}, 'tower_2': {'reduction_filter': 64, 'tower_filter': 64, 'tower_kernel': (5, 5), - 'activation': 'relu'} + 'activation': 'relu', + 'padding': 'SymPad2D'}, + 'tower_3': {'reduction_filter': 64, + 'tower_filter': 64, + 'tower_kernel': (1, 1), + 'activation': ELU, + 'padding': ReflectionPadding2D} } pool_settings_dict = {'pool_kernel': (3, 3), 'tower_filter': 64, @@ -266,7 +280,7 @@ if __name__ == '__main__': # create inception net inception_net = InceptionModelBase() - output = inception_net.inception_block(input_img, conv_settings_dict, pool_settings_dict) + output = inception_net.inception_block(input_img, conv_settings_dict, pool_settings_dict, batch_normalisation=True) output = Flatten()(output) output = Dense(10, activation='softmax')(output) model = Model(inputs=input_img, outputs=output) @@ -281,5 +295,6 @@ if __name__ == '__main__': print(X_train.shape) keras.utils.plot_model(model, to_file='model.pdf', show_shapes=True, show_layer_names=True) # model.fit(X_train, y_train, epochs=epochs, validation_data=(X_test, y_test)) + print('test')