input: Write a function to collate a machine learning model in Python that distinguishes between cats and dogs. The model should be built using Keras and should be capable of classifying images from a dataset containing 800 images of cats and dogs. The function should return the compiled model.
  
  import numpy as np
  import keras
  from keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, Flatten
  from keras.models import Sequential
  from keras.preprocessing.image import ImageDataGenerator
  
  def cat_dog_classifier():
      # 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'])
  
      return model
  
  # Test case
  assert cat_dog_classifier().__class__ == keras.models.Sequential
  assert cat_dog_classifier().layers[0].__class__ == keras.layers.Conv2D
  assert cat_dog_classifier().layers[-1].__class__ == keras.layers.Dense
output: def cat_dog_classifier():
      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'])
      return model