From 78cc10064eee9a11a00d3c424e8c2836815609e2 Mon Sep 17 00:00:00 2001
From: Felix Kleinert <f.kleinert@fz-juelich.de>
Date: Mon, 12 Apr 2021 17:53:49 +0200
Subject: [PATCH] add Secor model class

---
 mlair/model_modules/model_class.py | 181 +++++++++++++++++++++++++++--
 1 file changed, 174 insertions(+), 7 deletions(-)

diff --git a/mlair/model_modules/model_class.py b/mlair/model_modules/model_class.py
index 9b2058ac..ce74a89a 100644
--- a/mlair/model_modules/model_class.py
+++ b/mlair/model_modules/model_class.py
@@ -486,7 +486,9 @@ class MyLSTMModel(AbstractModelClass):
         super().__init__(input_shape[0], output_shape[0])
 
         # settings
-        self.dropout_rate = 0.25
+        self.dropout_rate = 0.4
+        self.stateful = False
+        self.initial_lr = 1e-5
 
         # apply to model
         self.set_model()
@@ -495,16 +497,181 @@ class MyLSTMModel(AbstractModelClass):
 
     def set_model(self):
         x_input = keras.layers.Input(shape=self._input_shape)
-        x_in = keras.layers.LSTM(16, return_sequences=True, name="First_LSTM", dropout=self.dropout_rate)(x_input)
-        x_in = keras.layers.LSTM(32, name="Second_LSTM", dropout=self.dropout_rate)(x_in)
+        x_in = keras.layers.LSTM(16, return_sequences=True, name="First_LSTM", dropout=self.dropout_rate, stateful=self.stateful)(x_input)
+        x_in = keras.layers.Dropout(self.dropout_rate)(x_in)
+        x_in = keras.layers.LSTM(16, name="Second_LSTM", dropout=self.dropout_rate, stateful=self.stateful)(x_in)
         out_main = keras.layers.Dense(self._output_shape, name='Output_Dense')(x_in)
         self.model = keras.Model(inputs=x_input, outputs=[out_main])
 
     def set_compile_options(self):
-        self.initial_lr = 1e-4
+#         self.initial_lr = 1e-4
+        #self.optimizer = keras.optimizers.SGD(lr=self.initial_lr, momentum=0.9)
+        self.optimizer = keras.optimizers.Adam(lr=self.initial_lr)
+#         self.lr_decay = mlair.model_modules.keras_extensions.LearningRateDecay(base_lr=self.initial_lr,
+#                                                                                drop=.94,
+#                                                                                epochs_drop=10)
+        self.loss = keras.losses.mean_squared_error
+        self.compile_options = {"metrics": ["mse", "mae"]}
+        
+        
+        
+class MyCNNModel(AbstractModelClass):
+
+    def __init__(self, input_shape: list, output_shape: list):
+
+        super().__init__(input_shape[0], output_shape[0])
+
+        # settings
+        self.dropout_rate = 0.4
+        self.batchnormalization = keras.layers.normalization.BatchNormalization
+#         self.activation = keras.layers.LeakyReLU
+        self.activation = keras.layers.ELU
+#         self.regularizer = keras.regularizers.l2(0.001)
+        
+        self.initial_lr = 0.01
+        
+
+        # apply to model
+        self.set_model()
+        self.set_compile_options()
+        self.set_custom_objects(SymmetricPadding2D=SymmetricPadding2D)
+
+    def set_model(self):
+
+        first_kernel = (3, 1)
+        first_filters = 16
+        pad_size1 = PadUtils.get_padding_for_same(first_kernel)
+        
+        pool_kernel = (3,1)
+        pad_size_pool = PadUtils.get_padding_for_same(pool_kernel)
+        
+        second_kernel = (3, 1)
+        second_filters = 32
+        pad_size2 = PadUtils.get_padding_for_same(second_kernel)
+        
+        x_input = keras.layers.Input(shape=self._input_shape)
+
+        x_in = Padding2D("SymPad2D")(padding=pad_size1, name="SymPad1")(x_input)
+        x_in = keras.layers.Conv2D(filters=first_filters,
+                                   kernel_size=first_kernel,
+#                                    kernel_regularizer=self.regularizer,
+                                   name="First_conv_{}x{}".format(first_kernel[0], first_kernel[1]))(x_in)
+        x_in = self.batchnormalization()(x_in)
+        x_in = self.activation()(x_in)
+        x_in = keras.layers.Dropout(self.dropout_rate)(x_in)
+        
+#         x_in = Padding2D("SymPad2D")(padding=pad_size_pool, name="SymPad_pool")(x_in)
+#         x_in = keras.layers.MaxPool2D(pool_kernel)(x_in)
+
+        x_in = Padding2D("SymPad2D")(padding=pad_size2, name="SymPad2")(x_in)
+        x_in = keras.layers.Conv2D(filters=second_filters,
+                                   kernel_size=second_kernel,
+#                                    kernel_regularizer=self.regularizer,
+                                   name="Second_conv_{}x{}".format(second_kernel[0], second_kernel[1]))(x_in)
+        x_in = self.batchnormalization()(x_in)
+        x_in = self.activation()(x_in)
+        x_in = keras.layers.Dropout(self.dropout_rate)(x_in)
+        
+
+        x_in = keras.layers.Flatten()(x_in)
+
+        x_in = keras.layers.Dense(32)(x_in)
+        x_in = self.batchnormalization()(x_in)
+        x_in = self.activation()(x_in)
+        
+        x_in = keras.layers.Dropout(self.dropout_rate)(x_in)
+        
+        out_main = keras.layers.Dense(self._output_shape, name='Output_Dense')(x_in)
+
+        self.model = keras.Model(inputs=x_input, outputs=[out_main])
+
+    def set_compile_options(self):
+        
+#         self.optimizer = keras.optimizers.Adam()
         self.optimizer = keras.optimizers.SGD(lr=self.initial_lr, momentum=0.9)
-        self.lr_decay = mlair.model_modules.keras_extensions.LearningRateDecay(base_lr=self.initial_lr,
-                                                                               drop=.94,
-                                                                               epochs_drop=10)
+#         self.lr_decay = mlair.model_modules.keras_extensions.LearningRateDecay(base_lr=self.initial_lr,
+#                                                                                drop=.94,
+#                                                                                epochs_drop=10)
+        self.loss = keras.losses.mean_squared_error
+        self.compile_options = {"metrics": ["mse", "mae"]}
+        
+class MyCNNModelSect(AbstractModelClass):
+
+    def __init__(self, input_shape: list, output_shape: list):
+
+        super().__init__(input_shape[0], output_shape[0])
+
+        # settings
+        self.dropout_rate = 0.35
+        self.batchnormalization = keras.layers.normalization.BatchNormalization
+#         self.activation = keras.layers.LeakyReLU
+        self.activation = keras.layers.ELU
+#         self.regularizer = keras.regularizers.l2(0.001)
+        
+        self.initial_lr = 0.01
+        
+
+        # apply to model
+        self.set_model()
+        self.set_compile_options()
+        self.set_custom_objects(SymmetricPadding2D=SymmetricPadding2D)
+
+    def set_model(self):
+
+        first_kernel = (3, 1)
+        first_filters = 16
+        pad_size1 = PadUtils.get_padding_for_same(first_kernel)
+        
+        pool_kernel = (3,1)
+        pad_size_pool = PadUtils.get_padding_for_same(pool_kernel)
+        
+        second_kernel = (3, 1)
+        second_filters = 32
+        pad_size2 = PadUtils.get_padding_for_same(second_kernel)
+
+        x_input = keras.layers.Input(shape=self._input_shape)
+
+        x_in = Padding2D("SymPad2D")(padding=pad_size1, name="SymPad1")(x_input)
+        x_in = keras.layers.Conv2D(filters=first_filters,
+                                   kernel_size=first_kernel,
+#                                    kernel_regularizer=self.regularizer,
+                                   name="First_conv_{}x{}".format(first_kernel[0], first_kernel[1]))(x_in)
+        x_in = self.batchnormalization()(x_in)
+        x_in = self.activation()(x_in)
+        x_in = keras.layers.Dropout(self.dropout_rate)(x_in)
+        
+#         x_in = Padding2D("SymPad2D")(padding=pad_size_pool, name="SymPad_pool")(x_in)
+#         x_in = keras.layers.MaxPool2D(pool_kernel)(x_in)
+
+        x_in = Padding2D("SymPad2D")(padding=pad_size2, name="SymPad2")(x_in)
+        x_in = keras.layers.Conv2D(filters=second_filters,
+                                   kernel_size=second_kernel,
+#                                    kernel_regularizer=self.regularizer,
+                                   name="Second_conv_{}x{}".format(second_kernel[0], second_kernel[1]))(x_in)
+        x_in = self.batchnormalization()(x_in)
+        x_in = self.activation()(x_in)
+        x_in = keras.layers.Dropout(self.dropout_rate)(x_in)
+        
+
+        x_in = keras.layers.Flatten()(x_in)
+
+        x_in = keras.layers.Dense(32)(x_in)
+        x_in = self.batchnormalization()(x_in)
+        x_in = self.activation()(x_in)
+        
+        x_in = keras.layers.Dropout(self.dropout_rate)(x_in)
+        
+        out_main = keras.layers.Dense(self._output_shape, name='Output_Dense')(x_in)
+
+        self.model = keras.Model(inputs=x_input, outputs=[out_main])
+
+    def set_compile_options(self):
+        
+#         self.optimizer = keras.optimizers.Adam()
+        self.optimizer = keras.optimizers.SGD(lr=self.initial_lr, momentum=0.9)
+#         self.lr_decay = mlair.model_modules.keras_extensions.LearningRateDecay(base_lr=self.initial_lr,
+#                                                                                drop=.94,
+#                                                                                epochs_drop=10)
         self.loss = keras.losses.mean_squared_error
         self.compile_options = {"metrics": ["mse", "mae"]}
+
-- 
GitLab