{"cells":[{"metadata":{"_uuid":"b68f6948e99b809ac2a57272cdf5efbc57b76e0f"},"cell_type":"markdown","source":"# Building a strong image classification model using keras"},{"metadata":{"_uuid":"63aacd020911a13c93d8851b5b584a70482565ff"},"cell_type":"markdown","source":"## importing libraries and constants for Preprocessing"},{"metadata":{"trusted":true,"_uuid":"6b05417f8c123893b6af5eabd04f404b4c23d436"},"cell_type":"code","source":"import cv2                 # working with, mainly resizing, images\nimport numpy as np         # dealing with arrays\nimport os                  # dealing with directories\nfrom random import shuffle # mixing up or currently ordered data that might lead our network astray in training.\n\ntrain_dir = '../input/train'\ntest_dir = '../input/test'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"cf2feb128a9a38cf2f31e982996fcd1194a29736"},"cell_type":"markdown","source":"## conversion to one-hot array for cat it is [1,0] and for dog it is [0,1]"},{"metadata":{"trusted":true,"_uuid":"fdbb40f595170be6ad74e572b805716b64238a9d"},"cell_type":"code","source":"def get_label(img):\n    label = img.split('.')[0]\n    if label == 'cat': \n        return [1,0]\n    elif label == 'dog': \n        return [0,1]","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"4008882f89d91b0018ca582b700cde0064b33cbf"},"cell_type":"markdown","source":"## Building  another function to fully process the training images and their labels into arrays:-"},{"metadata":{"trusted":true,"_uuid":"b46cf58d19996037dd0dbf036eb531a698ca0038"},"cell_type":"code","source":"from tqdm import tqdm      # a nice pretty percentage bar for tasks.\n\ndef making_train_data():\n    training_data = []\n    \n    for img in tqdm(os.listdir(train_dir)):\n        label = get_label(img)\n        path = os.path.join(train_dir,img)\n        img = cv2.imread(path,cv2.IMREAD_GRAYSCALE)\n        img = cv2.resize(img, (50,50))\n        training_data.append([np.array(img),np.array(label)])\n        \n    shuffle(training_data)\n    np.save('train_data.npy', training_data)\n    return training_data","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"18915db0ccb5cf67184c6c397c0098b3afce8176"},"cell_type":"code","source":"def making_test_data():\n    testing_data = []\n    \n    for img in tqdm(os.listdir(test_dir)):\n        path = os.path.join(test_dir , img)\n        img_num = img.split('.')[0]\n        img = cv2.imread(path , cv2.IMREAD_GRAYSCALE)\n        img = cv2.resize(img , (50,50))\n        testing_data.append([np.array(img), img_num])\n        \n    shuffle(testing_data)\n    np.save('test_data.npy', testing_data)\n    return testing_data","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8b65aabe5028f50d125136a52c969515be09f634"},"cell_type":"code","source":"train_data = making_train_data()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"1f708032fa5750766b4f44a008c9a5d175975a85"},"cell_type":"markdown","source":"**Split the train_data into train(having 20,000 images) and test(having 5,000 images) **"},{"metadata":{"trusted":true,"_uuid":"04ff1544d429f03c2dfc3d08305986271ee09bc4"},"cell_type":"code","source":"train = train_data[0:20000]\ntest = train_data[20000:25000]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c3d841927f380f1e2ab0013f23b057ecb89dfbab"},"cell_type":"code","source":"X = np.array([i[0] for i in train]).reshape(-1,1,50,50)\nY = [i[1] for i in train]\n\ntest_x = np.array([i[0] for i in test]).reshape(-1,1,50,50)\ntest_y = [i[1] for i in test]","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"c7ef4c2965b05e13dca956cc384e8f3cb934a9cf"},"cell_type":"markdown","source":"## Data Augmentation to prevent Overfitting"},{"metadata":{"trusted":true,"_uuid":"eaf17e547b351a7c8995662787fc3daf0afa95a5","_kg_hide-input":false},"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\n\ndatagen = ImageDataGenerator(\n        featurewise_center=False,  \n        samplewise_center=False,  \n        featurewise_std_normalization=False,  \n        samplewise_std_normalization=False,  \n        zca_whitening=False,  \n        rotation_range=10,  \n        zoom_range = 0.0,  \n        width_shift_range=0.1,  \n        height_shift_range=0.1,  \n        horizontal_flip=False, \n        vertical_flip=False)  \n\ndatagen.fit(X)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d4239c829f5c6cfe5fa6a170b9d872ff394766f4"},"cell_type":"code","source":"Y = np.asarray(Y)\nY.reshape(len(Y) , 2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"40b58317702fec39ceaa84a85d96942a6875503e"},"cell_type":"code","source":"test_y = np.asarray(test_y)\ntest_y.reshape(len(test_y) , 2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d91a18a73518eea667f7d64a7160e15bdd9592e2"},"cell_type":"code","source":"test_x = test_x.reshape(-1, 1, 50, 50)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c567cef43e9d6a4ed812b3822304b9efdabf49b2"},"cell_type":"code","source":"test_x = test_x / 255\nX = X / 255","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f15356bae02f6cf471f02a97c8978ecaf2d28fad"},"cell_type":"markdown","source":"****We will be using the Sequential model from Keras to form the Neural Network. Sequential Model is used to construct simple models with linear stack of layers.****\n\n****More info on Sequential model and Keras in general at https://keras.io/getting-started/sequential-model-guide/ and https://github.com/keras-team/keras****"},{"metadata":{"trusted":true,"_uuid":"ed99a41cb74507cb7771bd4051f9217bae0091dd"},"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.layers import Dense , Activation\nfrom keras.layers import Dropout\nfrom keras.layers import Flatten\nfrom keras.constraints import maxnorm\nfrom keras.optimizers import SGD\nfrom keras.layers import Convolution2D\nfrom keras.layers import Conv2D , BatchNormalization\nfrom keras.layers import MaxPooling2D\nfrom keras.utils import np_utils\nfrom keras import backend as K\nK.set_image_dim_ordering('th')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"82100e50ad688f2672b32bf558c74f62ad1bda4d"},"cell_type":"markdown","source":"## Building the ConvNet Model"},{"metadata":{"trusted":true,"_uuid":"f3d125c14972757fba99093af2384c13345d46b8"},"cell_type":"code","source":"# Initialising the CNN\nclassifier = Sequential()\n\n# Step 1 - Convolution\nclassifier.add(Convolution2D(32, 3, 3, input_shape = (1,50,50), activation = 'relu'))\n\n# Step 2 - Pooling\nclassifier.add(MaxPooling2D(pool_size = (2, 2)))\n\n# Adding a second convolutional layer\nclassifier.add(Convolution2D(32, 3, 3, activation = 'relu'))\nclassifier.add(MaxPooling2D(pool_size = (2, 2)))\n\n\n\n# Adding a third convolutional layer\nclassifier.add(Convolution2D(64, 3, 3, activation = 'relu'))\nclassifier.add(MaxPooling2D(pool_size = (2, 2)))\n\n\n\n\n# Step 3 - Flattening\nclassifier.add(Flatten())\n\n# Step 4 - Full connection\nclassifier.add(Dense(output_dim = 64, activation = 'relu'))\nclassifier.add(Dropout(0.4))\nclassifier.add(Dense(output_dim = 2, activation = 'sigmoid'))\n\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"33853e4625de26c1e7576c3c49f3b4b6d8e0ece4"},"cell_type":"markdown","source":"## Compiling the Keras Model"},{"metadata":{"trusted":true,"_uuid":"648eef187a41975a98a0e491eeeee50475988364"},"cell_type":"code","source":"# Compiling the CNN\nclassifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e98879fef7dbc06ae80625cc99bb8ca46a5179c9"},"cell_type":"markdown","source":"## Summary of the Model"},{"metadata":{"trusted":true,"_uuid":"34b38918b670c8c194467a90d8269e69dc3bdb60"},"cell_type":"code","source":"classifier.summary()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"5f97d29998adf5d5de9d7de1a2dbc18457efc9b3"},"cell_type":"markdown","source":"## Fitting on the Training set and making predcitons on the Validation set"},{"metadata":{"trusted":true,"_uuid":"b1a42acd4a50f25c4ed9a5f509582b684c12028f"},"cell_type":"code","source":"batch_size = 128\nepochs = 20\n\nclassifier.compile(loss='binary_crossentropy', optimizer='adam' , metrics=['accuracy'])\nsteps_per_epoch = len(train_data) // batch_size\nvalidation_steps = len((test_x, test_y)) // batch_size","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b9079c6a2428c393e89389b28e399c7fc80d21b2"},"cell_type":"code","source":"history = classifier.fit_generator(datagen.flow(X, Y, batch_size=batch_size),\n                    steps_per_epoch=X.shape[0] // batch_size,\n                    validation_data=(test_x, test_y),\n                    epochs = epochs, verbose = 2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b0ef513b6683f8eb7c0d246d840058ed436ba2c3"},"cell_type":"code","source":"test_data = making_test_data()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7ffcfa8c53022d59f2fae5136c9ca3a579a9b5dd"},"cell_type":"code","source":"score = classifier.evaluate(test_x, test_y, verbose=0)\nprint('valid loss:', score[0])\nprint('valid accuracy:', score[1])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9231debfda99bda01b19ea58f8c9dc0eced8232f"},"cell_type":"code","source":"with open('submission_file.csv','w') as f:\n    f.write('id,label\\n')\n            \nwith open('submission_file.csv','a') as f:\n    for data in tqdm(test_data):\n        img_num = data[1]\n        img_data = data[0]\n        orig = img_data\n        data = img_data.reshape(1,1,50,50)\n        model_out = classifier.predict([data])[0]\n        f.write('{},{}\\n'.format(img_num,model_out[1]))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"bab1b3e04302fa0de586b9bc91a58539bc1b2dea"},"cell_type":"code","source":"import pandas as pd\naa = pd.read_csv('submission_file.csv')\naa\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"fe7ebcf785629eb9dea3bc2303d55a4d2eb70bac"},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"873c2485b650ddcbaeaea69161d54999164d8bad"},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"cf1367fea4f71b8deb9b844d681b3d344d11e9e4"},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}