# Convolutional Neural Network

# Part 1 - Building the convulutional neural network
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

# Initialising the CNN
classifier = Sequential()

# Step 1 - Convolution
classifier.add(Conv2D(32,
                      (3, 3),
                      input_shape = (64, 64, 3), # Tensorflow setup opposit to keras
                      activation = 'relu'))

# Convolution layer 2
classifier.add(Conv2D(64,
                      (3, 3),
                      activation = 'relu'))

# Step 2 Pooling
classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Step 3 Flattening
classifier.add(Flatten())

# Step 4 Creating the ANN
# Adding first hidden layer
classifier.add(Dense(units= 128,
                     activation='relu'))

# Adding output layer
classifier.add(Dense(units= 1,
                     activation='sigmoid'))

# Compiling the CNN
classifier.compile(optimizer = 'adam',
                   loss = 'binary_crossentropy',
                   metrics = ['accuracy'])
# Fitting the data to CNN
from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1./255)

training_set = train_datagen.flow_from_directory(
        'dataset/training_set',
        target_size=(64, 64),
        batch_size=32,
        class_mode='binary')

test_set = test_datagen.flow_from_directory(
        'dataset/test_set',
        target_size=(64, 64),
        batch_size=32,
        class_mode='binary')

classifier.fit(
        training_set,
        steps_per_epoch= 8000,
        epochs = 25,
        validation_data= test_set,
        validation_steps = 2000)