ageron / ageron/handson-ml2

[Chapter 14] ResidualUnit

Open
#320 3 comments 0 reactions 0 assignees View on GitHub
enhancement
Dominant language
Jupyter Notebook
Stars
30k
Forks
13.1k
PR merge metrics
No merged PRs in 30d

Description

I would like to implement a clean custom residual unit. Aurélien provides this one:

```
from tensorflow import keras
from functools import partial

DefaultConv2D = partial(keras.layers.Conv2D, kernel_size=3, strides=1, padding="SAME", use_bias=False)

class ResidualUnit(keras.layers.Layer):
def __init__(self, filters, strides=1, activation="relu", **kwargs):
super().__init__(**kwargs)

self.activation = keras.activations.get(activation)

self.main_layers = [
DefaultConv2D(filters, strides=strides),
keras.layers.BatchNormalization(),
self.activation,
DefaultConv2D(filters),
keras.layers.BatchNormalization()
]

self.skip_layers = []
if strides > 1:
self.skip_layers = [
DefaultConv2D(filters, kernel_size=1, strides=strides),
keras.layers.BatchNormalization()
]

def call(self, inputs):
Z = inputs
for layer in self.main_layers:
Z = layer(Z)
skip_Z = inputs
for layer in self.skip_layers:
skip_Z = layer(skip_Z)
return self.activation(Z + skip_Z)
```

The issue with this custom layer is there are no get_config() method.

I tried to implement one:

```
class ResidualUnit(keras.layers.Layer):
[...]

def get_config(self):
base_config = super().get_config()
return {**base_config,
"main_layers": self.main_layers,
"skip_layers": self.skip_layers,
"activation": self.activation}
```

But when I call the get_config method I have an error message : TypeError: can't pickle _thread.RLock objects.

Can someone help me with this ?

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.