code: def fit(self, features, labels, validation_split, epochs=50):
          
          self.model.fit(x=features, y=labels, epochs=epochs, verbose=1,
                         callbacks=[ReduceLROnPlateau(), EarlyStopping(patience=3)], validation_split=validation_split,
                         shuffle=True)
  
          for layer in self.model.layers[:self._NUM_BOTTOM_LAYERS_TO_RETRAIN]:
              layer.trainable = False
          for layer in self.model.layers[self._NUM_BOTTOM_LAYERS_TO_RETRAIN:]:
              layer.trainable = True
  
          self.model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])
          self.model.fit(x=features, y=labels, epochs=50, verbose=1,
                         callbacks=[ReduceLROnPlateau(), EarlyStopping(patience=3)], validation_split=validation_split,
                         shuffle=True)
docs: Trains the neural net on the data provided.
  
          :param features: Numpy array of training data.
          :param labels: Numpy array of target (label) data.
          :param validation_split: Float between 0 and 1. Percentage of training data to use for validation
          :param epochs: Max number of times to train over dataset.