class VGG19(tf.keras.Model): def __init__(self,input_shape,output_shape,**kwargs): super().__init__(**kwargs) self.conv_blocks=[ self._conv_block(64,2), self._conv_block(128,2), self._conv_block(256,4), self._conv_block(512,4), self._conv_block(512,4), ] self.flatten = tf.keras.layers.Flatten() self.dense1 = tf.keras.layers.Dense(units=4096,activation="relu",kernel_regularizer=tf.keras.regularizers.L2(0.0005)) self.dropout1 = tf.keras.layers.Dropout(0.5) self.dense2 = tf.keras.layers.Dense(units=4096,activation="relu",kernel_regularizer=tf.keras.regularizers.L2(0.0005)) self.dropout2 = tf.keras.layers.Dropout(0.5) self.output_layer = tf.keras.layers.Dense(units=output_shape,activation="softmax") def _conv_block(self,filters,num_layers): block = tf.keras.Sequential() for _ in range(num_layers): block.add(tf.keras.layers.Conv2D(filters=filters, kernel_size=(3,3), strides=(1,1), activation="relu",padding="same")) block.add(tf.keras.layers.MaxPool2D(pool_size=(2,2),strides=(2,2))) return block def call(self,inputs,training=False): x = inputs for block in self.conv_blocks: x = block(x) x = self.flatten(x) x = self.dense1(x) x = self.dropout1(x,training=training) x = self.dense2(x) x= self.dropout2(x) x = self.output_layer(x) return x __ __