In [8]:
##### Building the CNN

from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
from keras.models import load_model
from keras.callbacks import EarlyStopping
# Initializing the CNN
classifier = Sequential()

# Step 1 - Convolution
classifier.add(Convolution2D(32, 3, 3, input_shape = (64, 64, 3),activation = 'relu'))


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

# Adding a second convolution layer
classifier.add(Convolution2D(32, 3, 3, activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2,2)))

# Adding a third convolution layer
classifier.add(Convolution2D(2560, 3, 3, activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2,2)))

# Adding a 4th convolution layer
classifier.add(Convolution2D(256, 3, 3, activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2,2)))

# Adding a 5th convolution layer
#classifier.add(Convolution2D(64, 3, 3, activation = 'relu'))
#classifier.add(MaxPooling2D(pool_size = (2,2)))

# Adding a 6th convolution layer
#classifier.add(Convolution2D(256, 3, 3, activation = 'relu'))
#classifier.add(MaxPooling2D(pool_size = (2,2)))

# Adding a 5th convolution layer
#classifier.add(Convolution2D(512, 3, 3, activation = 'relu'))
#classifier.add(MaxPooling2D(pool_size = (2,2)))

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


# Step 4 - Full Connection
classifier.add(Dense(output_dim = 128, activation= 'relu'))
classifier.add(Dense(output_dim = 4,activation= 'softmax'))


# Compiling the CNN
from keras import optimizers
sgd = optimizers.SGD(lr=0.05, momentum=0.0, decay=0.0, nesterov=True)
adam = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
adamax = optimizers.Adamax(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
nadam = optimizers.Nadam(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=1e-08, schedule_decay=0.004)
adagrad = optimizers.Adagrad(lr=0.01, epsilon=1e-08, decay=0.0)
adadelta = optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=1e-08, decay=0.0)
rmsprop = optimizers.RMSprop(lr=0.05, rho=0.9, epsilon=1e-08, decay=0.0)
tfo = optimizers.TFOptimizer(rmsprop)
classifier.compile(optimizer = adam, loss = 'categorical_crossentropy', metrics = ['accuracy'])

# Part 2 - Fitting the CNN to the image
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)

train_generator = train_datagen.flow_from_directory(
        'C:\\demo6\\TrainingData',
        target_size=(64, 64),
        batch_size=10,
        class_mode='categorical')

validation_generator = test_datagen.flow_from_directory(
        'C:\\demo6\\ValidationData',
        target_size=(64, 64),
        batch_size=2,
        class_mode='categorical')
early_stopping = EarlyStopping(monitor='val_acc', patience=3, verbose=1, mode='max')

classifier.fit_generator(
        train_generator,
        samples_per_epoch=2000,     
        epochs=100,
        validation_data=validation_generator,
        callbacks=[early_stopping],
        validation_steps=4000)
classifier.save('C:\\demo6\\clipRun.h5')


C:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:14: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(32, (3, 3), input_shape=(64, 64, 3..., activation="relu")`
  
C:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:21: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(32, (3, 3), activation="relu")`
C:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:25: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(2560, (3, 3), activation="relu")`
C:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:29: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(256, (3, 3), activation="relu")`
C:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:49: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(activation="relu", units=128)`
C:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:50: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(activation="softmax", units=4)`
Found 400 images belonging to 4 classes.
Found 120 images belonging to 4 classes.
C:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:95: UserWarning: Update your `fit_generator` call to the Keras 2 API: `fit_generator(<keras.pre..., epochs=100, validation_data=<keras.pre..., callbacks=[<keras.ca..., validation_steps=4000, steps_per_epoch=200)`
Epoch 1/100
200/200 [==============================] - 41s - loss: 0.5190 - acc: 0.7870 - val_loss: 0.3281 - val_acc: 0.9000
Epoch 2/100
200/200 [==============================] - 40s - loss: 0.2152 - acc: 0.9355 - val_loss: 0.2828 - val_acc: 0.9085
Epoch 3/100
200/200 [==============================] - 40s - loss: 0.1987 - acc: 0.9430 - val_loss: 0.2330 - val_acc: 0.9504
Epoch 4/100
200/200 [==============================] - 40s - loss: 0.1690 - acc: 0.9500 - val_loss: 0.2156 - val_acc: 0.9414
Epoch 5/100
200/200 [==============================] - 40s - loss: 0.1465 - acc: 0.9580 - val_loss: 0.2263 - val_acc: 0.9415
Epoch 6/100
200/200 [==============================] - 40s - loss: 0.1558 - acc: 0.9615 - val_loss: 0.1632 - val_acc: 0.9585
Epoch 7/100
200/200 [==============================] - 40s - loss: 0.1363 - acc: 0.9580 - val_loss: 0.2286 - val_acc: 0.9499
Epoch 8/100
200/200 [==============================] - 40s - loss: 0.1354 - acc: 0.9650 - val_loss: 0.3624 - val_acc: 0.9334
Epoch 9/100
200/200 [==============================] - 40s - loss: 0.1245 - acc: 0.9660 - val_loss: 0.2782 - val_acc: 0.9417
Epoch 10/100
200/200 [==============================] - 40s - loss: 0.1285 - acc: 0.9625 - val_loss: 0.3218 - val_acc: 0.9500
Epoch 00009: early stopping