class ResidualBlock(tf.keras.layers.Layer): def __init__(self, filters, kernel_size=3, strides=1, downsample=False): super(ResidualBlock, self).__init__() self.downsample = downsample self.conv1 = tf.keras.layers.Conv2D(filters, kernel_size, strides=strides, padding="same",kernel_regularizer=tf.keras.regularizers.L2(0.001)) self.bn1 = tf.keras.layers.BatchNormalization() self.relu = tf.keras.layers.ReLU() self.conv2 = tf.keras.layers.Conv2D(filters, kernel_size, strides=1, padding="same",kernel_regularizer=tf.keras.regularizers.L2(0.001)) self.bn2 = tf.keras.layers.BatchNormalization() if downsample: self.downsample_conv = tf.keras.layers.Conv2D(filters, 1, strides=strides,kernel_regularizer=tf.keras.regularizers.L2(0.001)) self.downsample_bn = tf.keras.layers.BatchNormalization() def call(self, inputs, training=False): residual = inputs x = self.conv1(inputs) x = self.bn1(x, training=training) x = self.relu(x) x = self.conv2(x) x = self.bn2(x, training=training) if self.downsample: residual = self.downsample_conv(inputs) residual = self.downsample_bn(residual, training=training) x += residual return self.relu(x) __ __