input: def create_cat_dog_classifier(dataset_path: str, target_size: tuple, epochs: int, batch_size: int) -> keras.Sequential:
      """Create a neural network model that distinguishes between cats and dogs using Keras.
      The model will be trained on a dataset of images located at the given dataset_path.
      The model includes convolutional, pooling, dropout, and fully connected layers.
      The model is compiled with binary cross-entropy loss and the Adam optimizer.
      The model is trained using data augmentation with the ImageDataGenerator.
  
      >>> create_cat_dog_classifier('/path/to/dataset', (64, 64), 5, 32)
      <keras.engine.sequential.Sequential object at 0x7f8b1c2b3e50>
      """
      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 = (*target_size, 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 = target_size, color_mode = 'rgb', class_mode = 'binary', batch_size = batch_size)
      model.fit_generator(generator = train_generator, steps_per_epoch = 800 // batch_size, epochs = epochs, validation_data = test_generator, validation_steps = 200 // batch_size)
  
      return model
output:     test_generator = datagen.flow_from_directory(directory = dataset_path, target_size = target_size, color_mode = 'rgb', class_mode = 'binary', batch_size = batch_size, subset = 'validation')