diff --git a/.gitignore b/.gitignore index 40c136844ddad3a9421b200995bdb552b58ccd55..3fe2a748292827d63eb1260eeef7fb4142ad72b5 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ dist temp/ build/ record.txt +*.DS_Store diff --git a/bob/learn/tensorflow/models/inception_resnet_v2.py b/bob/learn/tensorflow/models/inception_resnet_v2.py index ad5b8629f52b27496aa5c92aeaa2e3793965042a..29c8fca28c3353c6bce18bdf368b612a40757ab7 100644 --- a/bob/learn/tensorflow/models/inception_resnet_v2.py +++ b/bob/learn/tensorflow/models/inception_resnet_v2.py @@ -32,6 +32,7 @@ def Conv2D_BN( activation="relu", use_bias=False, name=None, + kernel_regularizer=None, **kwargs, ): """Utility class to apply conv + BN. @@ -72,6 +73,7 @@ def Conv2D_BN( padding=padding, use_bias=use_bias, name="Conv2D", + kernel_regularizer=kernel_regularizer ) ] @@ -147,6 +149,7 @@ class InceptionResnetBlock(tf.keras.layers.Layer): activation="relu", n=1, name=None, + kernel_regularizer=None, **kwargs, ): name = name or block_type @@ -159,24 +162,24 @@ class InceptionResnetBlock(tf.keras.layers.Layer): self.n = n if block_type == "block35": - branch_0 = [Conv2D_BN(32 // n, 1, name="Branch_0/Conv2d_1x1")] - branch_1 = [Conv2D_BN(32 // n, 1, name="Branch_1/Conv2d_0a_1x1")] - branch_1 += [Conv2D_BN(32 // n, 3, name="Branch_1/Conv2d_0b_3x3")] - branch_2 = [Conv2D_BN(32 // n, 1, name="Branch_2/Conv2d_0a_1x1")] - branch_2 += [Conv2D_BN(48 // n, 3, name="Branch_2/Conv2d_0b_3x3")] - branch_2 += [Conv2D_BN(64 // n, 3, name="Branch_2/Conv2d_0c_3x3")] + branch_0 = [Conv2D_BN(32 // n, 1, name="Branch_0/Conv2d_1x1", kernel_regularizer=kernel_regularizer)] + branch_1 = [Conv2D_BN(32 // n, 1, name="Branch_1/Conv2d_0a_1x1", kernel_regularizer=kernel_regularizer)] + branch_1 += [Conv2D_BN(32 // n, 3, name="Branch_1/Conv2d_0b_3x3", kernel_regularizer=kernel_regularizer)] + branch_2 = [Conv2D_BN(32 // n, 1, name="Branch_2/Conv2d_0a_1x1", kernel_regularizer=kernel_regularizer)] + branch_2 += [Conv2D_BN(48 // n, 3, name="Branch_2/Conv2d_0b_3x3", kernel_regularizer=kernel_regularizer)] + branch_2 += [Conv2D_BN(64 // n, 3, name="Branch_2/Conv2d_0c_3x3", kernel_regularizer=kernel_regularizer)] branches = [branch_0, branch_1, branch_2] elif block_type == "block17": - branch_0 = [Conv2D_BN(192 // n, 1, name="Branch_0/Conv2d_1x1")] - branch_1 = [Conv2D_BN(128 // n, 1, name="Branch_1/Conv2d_0a_1x1")] - branch_1 += [Conv2D_BN(160 // n, (1, 7), name="Branch_1/Conv2d_0b_1x7")] - branch_1 += [Conv2D_BN(192 // n, (7, 1), name="Branch_1/Conv2d_0c_7x1")] + branch_0 = [Conv2D_BN(192 // n, 1, name="Branch_0/Conv2d_1x1", kernel_regularizer=kernel_regularizer)] + branch_1 = [Conv2D_BN(128 // n, 1, name="Branch_1/Conv2d_0a_1x1", kernel_regularizer=kernel_regularizer)] + branch_1 += [Conv2D_BN(160 // n, (1, 7), name="Branch_1/Conv2d_0b_1x7", kernel_regularizer=kernel_regularizer)] + branch_1 += [Conv2D_BN(192 // n, (7, 1), name="Branch_1/Conv2d_0c_7x1", kernel_regularizer=kernel_regularizer)] branches = [branch_0, branch_1] elif block_type == "block8": - branch_0 = [Conv2D_BN(192 // n, 1, name="Branch_0/Conv2d_1x1")] - branch_1 = [Conv2D_BN(192 // n, 1, name="Branch_1/Conv2d_0a_1x1")] - branch_1 += [Conv2D_BN(224 // n, (1, 3), name="Branch_1/Conv2d_0b_1x3")] - branch_1 += [Conv2D_BN(256 // n, (3, 1), name="Branch_1/Conv2d_0c_3x1")] + branch_0 = [Conv2D_BN(192 // n, 1, name="Branch_0/Conv2d_1x1", kernel_regularizer=kernel_regularizer)] + branch_1 = [Conv2D_BN(192 // n, 1, name="Branch_1/Conv2d_0a_1x1", kernel_regularizer=kernel_regularizer)] + branch_1 += [Conv2D_BN(224 // n, (1, 3), name="Branch_1/Conv2d_0b_1x3", kernel_regularizer=kernel_regularizer)] + branch_1 += [Conv2D_BN(256 // n, (3, 1), name="Branch_1/Conv2d_0c_3x1", kernel_regularizer=kernel_regularizer)] branches = [branch_0, branch_1] else: raise ValueError( @@ -190,7 +193,7 @@ class InceptionResnetBlock(tf.keras.layers.Layer): channel_axis = 1 if K.image_data_format() == "channels_first" else 3 self.concat = Concatenate(axis=channel_axis, name="concatenate") self.up_conv = Conv2D_BN( - n_channels, 1, activation=None, use_bias=True, name="Conv2d_1x1" + n_channels, 1, activation=None, use_bias=True, name="Conv2d_1x1", kernel_regularizer=kernel_regularizer ) self.residual = ScaledResidual(scale) @@ -245,6 +248,7 @@ class ReductionA(tf.keras.layers.Layer): n=384, use_atrous=False, name="reduction_a", + kernel_regularizer=None, **kwargs, ): super().__init__(name=name, **kwargs) @@ -262,18 +266,20 @@ class ReductionA(tf.keras.layers.Layer): strides=1 if use_atrous else 2, padding=padding, name="Branch_0/Conv2d_1a_3x3", + kernel_regularizer=kernel_regularizer ) ] branch_2 = [ - Conv2D_BN(k, 1, name="Branch_1/Conv2d_0a_1x1"), - Conv2D_BN(kl, 3, name="Branch_1/Conv2d_0b_3x3"), + Conv2D_BN(k, 1, name="Branch_1/Conv2d_0a_1x1", kernel_regularizer=kernel_regularizer), + Conv2D_BN(kl, 3, name="Branch_1/Conv2d_0b_3x3", kernel_regularizer=kernel_regularizer), Conv2D_BN( km, 3, strides=1 if use_atrous else 2, padding=padding, name="Branch_1/Conv2d_1a_3x3", + kernel_regularizer=kernel_regularizer ), ] @@ -327,6 +333,7 @@ class ReductionB(tf.keras.layers.Layer): p=256, pq=288, name="reduction_b", + kernel_regularizer=None, **kwargs, ): super().__init__(name=name, **kwargs) @@ -340,19 +347,19 @@ class ReductionB(tf.keras.layers.Layer): self.pq = pq branch_1 = [ - Conv2D_BN(n, 1, name="Branch_0/Conv2d_0a_1x1"), - Conv2D_BN(no, 3, strides=2, padding=padding, name="Branch_0/Conv2d_1a_3x3"), + Conv2D_BN(n, 1, name="Branch_0/Conv2d_0a_1x1", kernel_regularizer=kernel_regularizer), + Conv2D_BN(no, 3, strides=2, padding=padding, name="Branch_0/Conv2d_1a_3x3", kernel_regularizer=kernel_regularizer), ] branch_2 = [ - Conv2D_BN(p, 1, name="Branch_1/Conv2d_0a_1x1"), - Conv2D_BN(pq, 3, strides=2, padding=padding, name="Branch_1/Conv2d_1a_3x3"), + Conv2D_BN(p, 1, name="Branch_1/Conv2d_0a_1x1", kernel_regularizer=kernel_regularizer), + Conv2D_BN(pq, 3, strides=2, padding=padding, name="Branch_1/Conv2d_1a_3x3", kernel_regularizer=kernel_regularizer), ] branch_3 = [ - Conv2D_BN(k, 1, name="Branch_2/Conv2d_0a_1x1"), - Conv2D_BN(kl, 3, name="Branch_2/Conv2d_0b_3x3"), - Conv2D_BN(km, 3, strides=2, padding=padding, name="Branch_2/Conv2d_1a_3x3"), + Conv2D_BN(k, 1, name="Branch_2/Conv2d_0a_1x1", kernel_regularizer=kernel_regularizer), + Conv2D_BN(kl, 3, name="Branch_2/Conv2d_0b_3x3", kernel_regularizer=kernel_regularizer), + Conv2D_BN(km, 3, strides=2, padding=padding, name="Branch_2/Conv2d_1a_3x3", kernel_regularizer=kernel_regularizer), ] branch_pool = [ @@ -387,36 +394,36 @@ class ReductionB(tf.keras.layers.Layer): class InceptionA(tf.keras.layers.Layer): - def __init__(self, pool_filters, name="inception_a", **kwargs): + def __init__(self, pool_filters, name="inception_a", kernel_regularizer=None, **kwargs): super().__init__(name=name, **kwargs) self.pool_filters = pool_filters self.branch1x1 = Conv2D_BN( - 96, kernel_size=1, padding="same", name="Branch_0/Conv2d_1x1" + 96, kernel_size=1, padding="same", name="Branch_0/Conv2d_1x1", kernel_regularizer=kernel_regularizer ) self.branch3x3dbl_1 = Conv2D_BN( - 64, kernel_size=1, padding="same", name="Branch_2/Conv2d_0a_1x1" + 64, kernel_size=1, padding="same", name="Branch_2/Conv2d_0a_1x1", kernel_regularizer=kernel_regularizer ) self.branch3x3dbl_2 = Conv2D_BN( - 96, kernel_size=3, padding="same", name="Branch_2/Conv2d_0b_3x3" + 96, kernel_size=3, padding="same", name="Branch_2/Conv2d_0b_3x3", kernel_regularizer=kernel_regularizer ) self.branch3x3dbl_3 = Conv2D_BN( - 96, kernel_size=3, padding="same", name="Branch_2/Conv2d_0c_3x3" + 96, kernel_size=3, padding="same", name="Branch_2/Conv2d_0c_3x3", kernel_regularizer=kernel_regularizer ) self.branch5x5_1 = Conv2D_BN( - 48, kernel_size=1, padding="same", name="Branch_1/Conv2d_0a_1x1" + 48, kernel_size=1, padding="same", name="Branch_1/Conv2d_0a_1x1", kernel_regularizer=kernel_regularizer ) self.branch5x5_2 = Conv2D_BN( - 64, kernel_size=5, padding="same", name="Branch_1/Conv2d_0b_5x5" + 64, kernel_size=5, padding="same", name="Branch_1/Conv2d_0b_5x5", kernel_regularizer=kernel_regularizer ) self.branch_pool_1 = AvgPool2D( pool_size=3, strides=1, padding="same", name="Branch_3/AvgPool_0a_3x3" ) self.branch_pool_2 = Conv2D_BN( - pool_filters, kernel_size=1, padding="same", name="Branch_3/Conv2d_0b_1x1" + pool_filters, kernel_size=1, padding="same", name="Branch_3/Conv2d_0b_1x1", kernel_regularizer=kernel_regularizer ) channel_axis = 1 if K.image_data_format() == "channels_first" else 3 @@ -453,6 +460,7 @@ def InceptionResNetV2( bottleneck=False, dropout_rate=0.2, name="InceptionResnetV2", + kernel_regularizer=None, **kwargs, ): """Instantiates the Inception-ResNet v2 architecture. @@ -499,15 +507,15 @@ def InceptionResNetV2( layers = [ # Stem block: 35 x 35 x 192 - Conv2D_BN(32, 3, strides=2, padding="valid", name="Conv2d_1a_3x3"), - Conv2D_BN(32, 3, padding="valid", name="Conv2d_2a_3x3"), - Conv2D_BN(64, 3, name="Conv2d_2b_3x3"), + Conv2D_BN(32, 3, strides=2, padding="valid", name="Conv2d_1a_3x3", kernel_regularizer=kernel_regularizer), + Conv2D_BN(32, 3, padding="valid", name="Conv2d_2a_3x3", kernel_regularizer=kernel_regularizer), + Conv2D_BN(64, 3, name="Conv2d_2b_3x3", kernel_regularizer=kernel_regularizer), MaxPool2D(3, strides=2, name="MaxPool_3a_3x3"), - Conv2D_BN(80, 1, padding="valid", name="Conv2d_3b_1x1"), - Conv2D_BN(192, 3, padding="valid", name="Conv2d_4a_3x3"), + Conv2D_BN(80, 1, padding="valid", name="Conv2d_3b_1x1", kernel_regularizer=kernel_regularizer), + Conv2D_BN(192, 3, padding="valid", name="Conv2d_4a_3x3", kernel_regularizer=kernel_regularizer), MaxPool2D(3, strides=2, name="MaxPool_5a_3x3"), # Mixed 5b (Inception-A block): 35 x 35 x 320 - InceptionA(pool_filters=64, name="Mixed_5b"), + InceptionA(pool_filters=64, name="Mixed_5b", kernel_regularizer=kernel_regularizer), ] # 10x block35 (Inception-ResNet-A block): 35 x 35 x 320 @@ -519,6 +527,7 @@ def InceptionResNetV2( block_type="block35", block_idx=block_idx, name=f"block35_{block_idx}", + kernel_regularizer=kernel_regularizer ) ) @@ -532,6 +541,7 @@ def InceptionResNetV2( km=384, use_atrous=False, name="Mixed_6a", + kernel_regularizer=kernel_regularizer ) ) @@ -544,6 +554,7 @@ def InceptionResNetV2( block_type="block17", block_idx=block_idx, name=f"block17_{block_idx}", + kernel_regularizer=kernel_regularizer ) ) @@ -559,6 +570,7 @@ def InceptionResNetV2( kl=288, km=320, name="Mixed_7a", + kernel_regularizer=kernel_regularizer ) ) @@ -571,6 +583,7 @@ def InceptionResNetV2( block_type="block8", block_idx=block_idx, name=f"block8_{block_idx}", + kernel_regularizer=kernel_regularizer ) ) layers.append( @@ -581,11 +594,12 @@ def InceptionResNetV2( block_type="block8", block_idx=10, name=f"block8_{block_idx+1}", + kernel_regularizer=kernel_regularizer ) ) # Final convolution block: 8 x 8 x 1536 - layers.append(Conv2D_BN(1536, 1, name="Conv2d_7b_1x1")) + layers.append(Conv2D_BN(1536, 1, name="Conv2d_7b_1x1", kernel_regularizer=kernel_regularizer)) if (include_top and pooling is None) or (bottleneck): pooling = "avg" @@ -597,7 +611,7 @@ def InceptionResNetV2( if bottleneck: layers.append(Dropout(dropout_rate, name="Dropout")) - layers.append(Dense(128, use_bias=False, name="Bottleneck")) + layers.append(Dense(128, use_bias=False, name="Bottleneck", kernel_regularizer=kernel_regularizer)) layers.append( BatchNormalization(axis=-1, scale=False, name="Bottleneck/BatchNorm") )