From 324a941ddd9fc00f51203d1b20710cd9ed6eee12 Mon Sep 17 00:00:00 2001
From: Tiago Freitas Pereira <tiagofrepereira@gmail.com>
Date: Thu, 22 Apr 2021 18:35:04 +0200
Subject: [PATCH] Flake shit

---
 bob/learn/tensorflow/layers.py                | 30 +++++++++++---
 bob/learn/tensorflow/models/__init__.py       |  4 +-
 .../tensorflow/models/embedding_validation.py |  7 ++++
 .../tensorflow/models/resnet50_modified.py    | 40 +++++++++----------
 4 files changed, 54 insertions(+), 27 deletions(-)

diff --git a/bob/learn/tensorflow/layers.py b/bob/learn/tensorflow/layers.py
index e15d36e5..33785878 100644
--- a/bob/learn/tensorflow/layers.py
+++ b/bob/learn/tensorflow/layers.py
@@ -5,7 +5,6 @@ import tensorflow as tf
 from tensorflow.keras.layers import BatchNormalization
 from tensorflow.keras.layers import Dense
 from tensorflow.keras.layers import Dropout
-from tensorflow.keras.layers import GlobalAvgPool2D
 
 
 def _check_input(
@@ -260,7 +259,12 @@ class ModifiedSoftMaxLayer(tf.keras.layers.Layer):
         return logits
 
 
-def add_bottleneck(model, bottleneck_size=128, dropout_rate=0.2):
+from tensorflow.keras.layers import Flatten
+
+
+def add_bottleneck(
+    model, bottleneck_size=128, dropout_rate=0.2, w_decay=5e-4, use_bias=True
+):
     """
     Amend a bottleneck layer to a Keras Model
 
@@ -276,15 +280,31 @@ def add_bottleneck(model, bottleneck_size=128, dropout_rate=0.2):
       dropout_rate: float
          Dropout rate
     """
+
     if not isinstance(model, tf.keras.models.Sequential):
         new_model = tf.keras.models.Sequential(model, name="bottleneck")
     else:
         new_model = model
 
-    new_model.add(GlobalAvgPool2D())
+    new_model.add(BatchNormalization())
     new_model.add(Dropout(dropout_rate, name="Dropout"))
-    new_model.add(Dense(bottleneck_size, use_bias=False, name="embeddings"))
-    new_model.add(BatchNormalization(axis=-1, scale=False, name="embeddings/BatchNorm"))
+    new_model.add(Flatten())
+
+    if w_decay is None:
+        regularizer = None
+    else:
+        regularizer = tf.keras.regularizers.l2(w_decay)
+
+    new_model.add(
+        Dense(
+            bottleneck_size,
+            use_bias=use_bias,
+            kernel_regularizer=regularizer,
+        )
+    )
+
+    new_model.add(BatchNormalization(axis=-1, name="embeddings"))
+    # new_model.add(BatchNormalization())
 
     return new_model
 
diff --git a/bob/learn/tensorflow/models/__init__.py b/bob/learn/tensorflow/models/__init__.py
index a69718e5..333ab1f4 100644
--- a/bob/learn/tensorflow/models/__init__.py
+++ b/bob/learn/tensorflow/models/__init__.py
@@ -7,9 +7,9 @@ from .densenet import DenseNet
 from .densenet import densenet161  # noqa: F401
 from .embedding_validation import EmbeddingValidation
 from .mine import MineModel
+from .resnet50_modified import resnet50_modified  # noqa: F401
+from .resnet50_modified import resnet101_modified  # noqa: F401
 
-from .arcface import ArcFaceLayer, ArcFaceLayer3Penalties, ArcFaceModel
-from .resnet50_modified import resnet50_modified, resnet101_modified
 
 # gets sphinx autodoc done right - don't remove it
 def __appropriate__(*args):
diff --git a/bob/learn/tensorflow/models/embedding_validation.py b/bob/learn/tensorflow/models/embedding_validation.py
index be342d1f..beb4498b 100644
--- a/bob/learn/tensorflow/models/embedding_validation.py
+++ b/bob/learn/tensorflow/models/embedding_validation.py
@@ -12,6 +12,7 @@ class EmbeddingValidation(tf.keras.Model):
 
     def compile(
         self,
+        single_precision=False,
         **kwargs,
     ):
         """
@@ -27,14 +28,20 @@ class EmbeddingValidation(tf.keras.Model):
         """
 
         X, y = data
+
         with tf.GradientTape() as tape:
             logits, _ = self(X, training=True)
             loss = self.loss(y, logits)
 
+        # trainable_vars = self.trainable_variables
+
         self.optimizer.minimize(loss, self.trainable_variables, tape=tape)
 
         self.compiled_metrics.update_state(y, logits, sample_weight=None)
         self.train_loss(loss)
+
+        tf.summary.scalar("training_loss", data=loss, step=self._train_counter)
+
         return {m.name: m.result() for m in self.metrics + [self.train_loss]}
 
         # self.optimizer.apply_gradients(zip(gradients, trainable_vars))
diff --git a/bob/learn/tensorflow/models/resnet50_modified.py b/bob/learn/tensorflow/models/resnet50_modified.py
index c6bb4bdf..6725301c 100644
--- a/bob/learn/tensorflow/models/resnet50_modified.py
+++ b/bob/learn/tensorflow/models/resnet50_modified.py
@@ -9,10 +9,11 @@ This resnet 50 implementation provides a cleaner version
 """
 
 import tensorflow as tf
-
-from tensorflow.keras.regularizers import l2
-from tensorflow.keras.layers import Conv2D, Activation, BatchNormalization
+from tensorflow.keras.layers import Activation
+from tensorflow.keras.layers import BatchNormalization
+from tensorflow.keras.layers import Conv2D
 from tensorflow.keras.layers import MaxPooling2D
+from tensorflow.keras.regularizers import l2
 
 global weight_decay
 weight_decay = 1e-4
@@ -24,15 +25,15 @@ class IdentityBlock(tf.keras.layers.Layer):
     ):
 
         """Block that has no convolutianal layer as skip connection
-        
+
         Parameters
         ----------
-            kernel_size: 
+            kernel_size:
                The kernel size of middle conv layer at main path
-            
-            filters: 
+
+            filters:
                 list of integers, the filterss of 3 conv layer at main path
-            stage: 
+            stage:
               Current stage label, used for generating layer names
 
             block:
@@ -94,8 +95,8 @@ class IdentityBlock(tf.keras.layers.Layer):
     def call(self, input_tensor, training=None):
 
         x = input_tensor
-        for l in self.layers:
-            x = l(x, training=training)
+        for lay in self.layers:
+            x = lay(x, training=training)
 
         x = tf.keras.layers.add([x, input_tensor])
         x = Activation("relu")(x)
@@ -115,15 +116,15 @@ class ConvBlock(tf.keras.layers.Layer):
         name=None,
         **kwargs,
     ):
-        """ Block that has a conv layer AS shortcut.
+        """Block that has a conv layer AS shortcut.
         Parameters
         ----------
-            kernel_size: 
+            kernel_size:
                The kernel size of middle conv layer at main path
-            
-            filters: 
+
+            filters:
                 list of integers, the filterss of 3 conv layer at main path
-            stage: 
+            stage:
               Current stage label, used for generating layer names
 
             block:
@@ -200,12 +201,12 @@ class ConvBlock(tf.keras.layers.Layer):
 
     def call(self, input_tensor, training=None):
         x = input_tensor
-        for l in self.layers:
-            x = l(x, training=training)
+        for lay in self.layers:
+            x = lay(x, training=training)
 
         x_s = input_tensor
-        for l in self.shortcut:
-            x_s = l(x_s, training=training)
+        for lay in self.shortcut:
+            x_s = lay(x_s, training=training)
 
         x = tf.keras.layers.add([x, x_s])
         x = Activation("relu")(x)
@@ -348,4 +349,3 @@ if __name__ == "__main__":
 
     print(len(model.variables))
     print(model.summary())
-
-- 
GitLab