# VGG 19 Model
class VGG19(Sequential):
def __init__(self, input_shape):
super().__init__()
self.add(Conv2D(64, kernel_size=(3,3), padding= 'same',
activation= 'relu', input_shape= input_shape))
self.add(Conv2D(64, kernel_size=(3,3), padding= 'same',
activation= 'relu'))
self.add(MaxPooling2D(pool_size=(2,2), strides= (2,2)))
self.add(Conv2D(128, kernel_size=(3,3), padding= 'same',
activation= 'relu'))
self.add(Conv2D(128, kernel_size=(3,3), padding= 'same',
activation= 'relu'))
self.add(MaxPooling2D(pool_size=(2,2), strides= (2,2)))
self.add(Conv2D(256, kernel_size=(3,3), padding= 'same',
activation= 'relu'))
self.add(Conv2D(256, kernel_size=(3,3), padding= 'same',
activation= 'relu'))
self.add(Conv2D(256, kernel_size=(3,3), padding= 'same',
activation= 'relu'))
self.add(Conv2D(256, kernel_size=(3,3), padding= 'same',
activation= 'relu'))
self.add(MaxPooling2D(pool_size=(2,2), strides= (2,2)))
self.add(Conv2D(512, kernel_size=(3,3), padding= 'same',
activation= 'relu'))
self.add(Conv2D(512, kernel_size=(3,3), padding= 'same',
activation= 'relu'))
self.add(Conv2D(512, kernel_size=(3,3), padding= 'same',
activation= 'relu'))
self.add(Conv2D(512, kernel_size=(3,3), padding= 'same',
activation= 'relu'))
self.add(MaxPooling2D(pool_size=(2,2), strides= (2,2)))
self.add(Conv2D(512, kernel_size=(3,3), padding= 'same',
activation= 'relu'))
self.add(Conv2D(512, kernel_size=(3,3), padding= 'same',
activation= 'relu'))
self.add(Conv2D(512, kernel_size=(3,3), padding= 'same',
activation= 'relu'))
self.add(Conv2D(512, kernel_size=(3,3), padding= 'same',
activation= 'relu'))
self.add(MaxPooling2D(pool_size=(2,2), strides= (2,2)))
self.add(Flatten())
self.add(Dense(4096, activation= 'relu'))
self.add(Dropout(0.5))
self.add(Dense(4096, activation= 'relu'))
self.add(Dropout(0.5))
self.add(Dense(1000, activation= 'softmax'))
self.compile(optimizer= tf.keras.optimizers.Adam(0.003),
loss='categorical_crossentropy',
metrics=['accuracy'])