# Importing the Keras libraries and packages
from keras.models import Sequential as se
from keras.layers import Conv2D as c2
from keras.layers import MaxPooling2D as m2
from keras.layers import Flatten as flat
from keras.layers import Dense as den
from keras.preprocessing.image import ImageDataGenerator

import numpy as np
from keras.preprocessing import image

# Initialising the CNN
classifier = se()
# Step 1 - Convolution
classifier.add(c2(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
# Step 2 - Pooling
classifier.add(m2(pool_size = (2, 2)))
# Adding a second convolutional layer
classifier.add(c2(32, (3, 3), activation = 'relu'))
classifier.add(m2(pool_size = (2, 2)))
# Step 3 - Flattening
classifier.add(flat())
# Step 4 - Full connection
classifier.add(den(units = 128, activation = 'relu'))
classifier.add(den(units = 1, activation = 'sigmoid'))
# Compiling the CNN
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
# Part 2 - Fitting the CNN to the images

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_generator(training_set,
steps_per_epoch = 8000,
epochs = 25,
validation_data = test_set,
validation_steps = 2000)
# Part 3 - Making new predictions

test_image = image.load_img('dataset/single_prediction/cat_or_dog_1.jpg', target_size = (64, 64))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)
result = classifier.predict(test_image)
training_set.class_indices
if result[0][0] == 1:
    prediction = 'dog'
else:
    prediction = 'cat'