input: Write a function to create a machine learning model in Python using Keras that can distinguish between cats and dogs, using a dataset of 800 images.
  
  def create_cats_dogs_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
  
      # 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
  
  assert create_cats_dogs_model().layers[0].input_shape == (None, 64, 64, 3)
  assert create_cats_dogs_model().layers[-1].output_shape == (None, 1)
  assert create_cats_dogs_model().loss == 'binary_crossentropy'
  assert create_cats_dogs_model().optimizer.__class__.__name__ == 'Adam'
output: def create_cats_dogs_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
  
      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