Skip to content
Snippets Groups Projects

Resolve "release v2.3.0"

Merged Ghost User requested to merge release_v2.3.0 into master
1 file
+ 86
0
Compare changes
  • Side-by-side
  • Inline
+ 86
0
__author__ = "Lukas Leufen"
__date__ = "2021-08-23"
from mlair.model_modules.branched_input_networks import BranchedInputCNN
import tensorflow.keras as keras
class BranchedInputResNet(BranchedInputCNN):
"""
A convolutional neural network with multiple input branches and residual blocks (skip connections).
```python
input_shape = [(65,1,9)]
output_shape = [(4, )]
# model
layer_configuration=[
{"type": "Conv2D", "activation": "relu", "kernel_size": (7, 1), "filters": 32, "padding": "same"},
{"type": "MaxPooling2D", "pool_size": (2, 1), "strides": (2, 1)},
{"type": "residual_block", "activation": "relu", "kernel_size": (3, 1), "filters": 32, "strides": (1, 1), "kernel_regularizer": "l2"},
{"type": "residual_block", "activation": "relu", "kernel_size": (3, 1), "filters": 32, "strides": (1, 1), "kernel_regularizer": "l2"},
{"type": "residual_block", "activation": "relu", "kernel_size": (3, 1), "filters": 64, "strides": (1, 1), "kernel_regularizer": "l2", "use_1x1conv": True},
{"type": "residual_block", "activation": "relu", "kernel_size": (3, 1), "filters": 64, "strides": (1, 1), "kernel_regularizer": "l2"},
{"type": "residual_block", "activation": "relu", "kernel_size": (3, 1), "filters": 128, "strides": (1, 1), "kernel_regularizer": "l2", "use_1x1conv": True},
{"type": "residual_block", "activation": "relu", "kernel_size": (3, 1), "filters": 128, "strides": (1, 1), "kernel_regularizer": "l2"},
{"type": "MaxPooling2D", "pool_size": (2, 1), "strides": (2, 1)},
{"type": "Dropout", "rate": 0.25},
{"type": "Flatten"},
{"type": "Concatenate"},
{"type": "Dense", "units": 128, "activation": "relu"}
]
model = BranchedInputResNet(input_shape, output_shape, layer_configuration)
```
"""
def __init__(self, input_shape: list, output_shape: list, layer_configuration: list, optimizer="adam", **kwargs):
super().__init__(input_shape, output_shape, layer_configuration, optimizer=optimizer, **kwargs)
@staticmethod
def residual_block(**layer_kwargs):
layer_name = layer_kwargs.pop("name").split("_")
layer_name = "_".join([*layer_name[0:2], "%s", *layer_name[2:]])
act = layer_kwargs.pop("activation")
act_name = act.__name__
use_1x1conv = layer_kwargs.pop("use_1x1conv", False)
def block(x):
layer_kwargs.update({"strides": 2 if use_1x1conv else 1})
y = keras.layers.Conv2D(**layer_kwargs, padding='same', name=layer_name % "Conv1")(x)
y = act(name=layer_name % f"{act_name}1")(y)
layer_kwargs.update({"strides": 1})
y = keras.layers.Conv2D(**layer_kwargs, padding='same', name=layer_name % "Conv2")(y)
y = keras.layers.BatchNormalization(name=layer_name % "BN2")(y)
if use_1x1conv is True:
layer_kwargs.update({"strides": 2})
layer_kwargs.update({"kernel_size": 1})
x = keras.layers.Conv2D(**layer_kwargs, padding='same', name=layer_name % "Conv1x1")(x)
out = keras.layers.Add(name=layer_name % "Add")([x, y])
out = act(name=layer_name % f"{act_name}2")(out)
return out
return block
def _extract_layer_conf(self, layer_opts):
follow_up_layer = None
layer_type = layer_opts.pop("type")
activation_type = layer_opts.pop("activation", None)
if activation_type is not None:
activation = self._activation.get(activation_type)
kernel_initializer = self._initializer.get(activation_type, "glorot_uniform")
layer_opts["kernel_initializer"] = kernel_initializer
follow_up_layer = activation
regularizer_type = layer_opts.pop("kernel_regularizer", None)
if regularizer_type is not None:
layer_opts["kernel_regularizer"] = self._set_regularizer(regularizer_type, **self.kwargs)
if layer_type.lower() == "residual_block":
layer = self.residual_block
layer_opts["activation"] = follow_up_layer
follow_up_layer = None
else:
layer = getattr(keras.layers, layer_type, None)
return layer, layer_opts, follow_up_layer
Loading