input: Write a function to create and train a machine learning model in Python that distinguishes between cats and dogs using a given dataset of 800 images of cats and dogs. The function should return the trained model.
  from keras.models import Sequential
  from keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, Flatten
  from keras.preprocessing.image import ImageDataGenerator
  
  def train_cats_dogs_model(dataset_path):
      # Create the neural network model
      model = Sequential()
  
      # Input layer
      model.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
  
      # Hidden layers
      model.add(MaxPooling2D(pool_size = (2, 2)))
      model.add(Dropout(0.3))
      model.add(Conv2D(64, (3, 3), activation = 'relu'))
      model.add(MaxPooling2D(pool_size = (2, 2)))
      model.add(Dropout(0.3))
      model.add(Conv2D(64, (3, 3), activation = 'relu'))
      model.add(MaxPooling2D(pool_size = (2, 2)))
      model.add(Dropout(0.3))
  
      # Output layer
      model.add(Flatten())
      model.add(Dense(units = 128, activation = 'relu'))
      model.add(Dense(units = 1, activation = 'sigmoid'))
  
      # Compile the model
      model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
  
      # Create data generator
      datagen = ImageDataGenerator(rescale = 1./255, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True)
  
      # Fit the model
      train_generator = datagen.flow_from_directory(directory = dataset_path, target_size = (64, 64), color_mode = 'rgb', class_mode = 'binary', batch_size = 32)
      model.fit_generator(generator = train_generator, steps_per_epoch = 800, epochs = 5, validation_data = test_generator, validation_steps = 200)
      
      return model
  
  assert isinstance(train_cats_dogs_model('/path/to/dataset'), Sequential)
output: 
  def train_cats_dogs_model(dataset_path):
      model = Sequential()
      model.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
      model.add(MaxPooling2D(pool_size = (2, 2)))
      model.add(Dropout(0.3))
      model.add(Conv2D(64, (3, 3), activation = 'relu'))
      model.add(MaxPooling2D(pool_size = (2, 2)))
      model.add(Dropout(0.3))
      model.add(Conv2D(64, (3, 3), activation = 'relu'))
      model.add(MaxPooling2D(pool_size = (2, 2)))
      model.add(Dropout(0.3))
      model.add(Flatten())
      model.add(Dense(units = 128, activation = 'relu'))
      model.add(Dense(units = 1, activation = 'sigmoid'))
      model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
      datagen = ImageDataGenerator(rescale = 1./255, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True)
      train_generator = datagen.flow_from_directory(directory = dataset_path, target_size = (64, 64), color_mode = 'rgb', class_mode = 'binary', batch_size = 32)
      model.fit_generator(generator = train_generator, steps_per_epoch = 800, epochs = 5, validation_data = train_generator, validation_steps = 200)
      return model
  