{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Data pre-processing","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport seaborn as sns\nimport matplotlib\nimport os\nfrom shutil import copyfile\nimport matplotlib.pyplot as plt\n#%matplotlib inline","metadata":{"collapsed":true,"jupyter":{"outputs_hidden":true}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = pd.read_csv('labels.csv')","metadata":{"collapsed":true,"jupyter":{"outputs_hidden":true}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nlabels_dict = {i:j for i,j in zip(labels['id'],labels['breed'])}\nclasses = set(labels_dict.values())\nimages = [f for f in os.listdir('train')]","metadata":{"collapsed":true,"jupyter":{"outputs_hidden":true}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if  not os.path.exists('training_images'):\n        os.makedirs('training_images')\n\nif  not os.path.exists('validation_images'):\n    os.makedirs('validation_images')","metadata":{"collapsed":true,"jupyter":{"outputs_hidden":true}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.chdir('training_images')\nfor curClass in classes:    \n    if  not os.path.exists(curClass):\n        os.makedirs(curClass)\n        #os.rmdir(curClass)\n\nos.chdir('../validation_images')\nfor curClass in classes:    \n    if  not os.path.exists(curClass):\n        os.makedirs(curClass)","metadata":{"collapsed":true,"jupyter":{"outputs_hidden":true}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.chdir('..')\ncount = 0 \ndestination_directory = 'training_images/'\nfor item in images:\n    if count >7999:\n        destination_directory = 'validation_images/'\n    filekey = os.path.splitext(item)[0]\n    if  not os.path.exists(destination_directory+labels_dict[filekey]+'/'+item):\n        copyfile('train/'+item, destination_directory+labels_dict[filekey]+'/'+item)\n    print(labels_dict[filekey])\n    count +=1","metadata":{"collapsed":true,"jupyter":{"outputs_hidden":true}},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Displaying the original image of \"Afghan Hound\"","metadata":{}},{"cell_type":"code","source":"img = load_img('training_images/afghan_hound/0d5a88f0ab2db8d34b533c69768135e8.jpg') \nimg","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img\n\ndatagen = ImageDataGenerator(\n        rotation_range=50,\n        width_shift_range=0.3,\n        height_shift_range=0.2,\n        shear_range=0.3,\n        zoom_range=0.3,\n        horizontal_flip=True,\n        fill_mode='nearest')\n\nimg = load_img('training_images/afghan_hound/0d5a88f0ab2db8d34b533c69768135e8.jpg') \nx = img_to_array(img)\nx = x.reshape((1,) + x.shape)\n\ni = 0\nfor batch in datagen.flow(x, batch_size=1,\n                          save_to_dir='preview', save_prefix='dog_breed', save_format='jpeg'):\n    i += 1\n    if i > 20:\n        break  # otherwise the generator would loop indefinitely","metadata":{"collapsed":true,"jupyter":{"outputs_hidden":true}},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Displaying the image after image augmentation for 3 trials for \"Afghan Hound\"","metadata":{}},{"cell_type":"code","source":"img1=load_img('preview/dog_breed_0_7350.jpeg')\nimg1","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img2=load_img('preview/dog_breed_0_6799.jpeg')\nimg2","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img3=load_img('preview/dog_breed_0_887.jpeg')\nimg3","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Implementing Convolution Neural Network ","metadata":{}},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\nfrom keras.models import Sequential\nfrom keras.layers import Convolution2D\nfrom keras.layers import MaxPooling2D\nfrom keras.layers import Flatten\nfrom keras.layers import Dense\nfrom keras.layers import Conv2D,Dropout\nfrom keras.preprocessing.image import ImageDataGenerator","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(\n        rescale=1./255,\n        shear_range=0.2,\n        zoom_range=0.2,\n        horizontal_flip=True)\n\ntest_datagen = ImageDataGenerator(rescale=1./255)\n#check class_mode in keras documentation https://keras.io/preprocessing/image/\ntraining_set = train_datagen.flow_from_directory(\n        'training_images',\n        target_size=(128, 128),\n        batch_size=20,\n        class_mode='categorical')\n\ntest_set = test_datagen.flow_from_directory(\n        'validation_images',\n        target_size=(128, 128),\n        batch_size=20,\n        class_mode='categorical')\n\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.layers import Dropout\nclf = Sequential()\n#Convolution\nclf.add(Conv2D(32,(3,3),input_shape=(128,128,3),activation='relu'))\n#Max Pooling size reduces divided by 2\nclf.add(MaxPooling2D(pool_size=(2,2)))      \n\n\n#clf.add(Dropout(0.5))\n\nclf.add(Conv2D(32,(3,3), activation='relu'))\nclf.add(MaxPooling2D(pool_size=(2,2)))\n#clf.add(Dropout(0.25))\n\nclf.add(Conv2D(64, (3, 3), activation='relu'))\nclf.add(MaxPooling2D(pool_size=(2, 2)))\n#clf.add(Dropout(0.10))\n#Flattening\nclf.add(Flatten())\n        \n#Adding An ANN\n#lets take 128 hidden nodes in hidden layer\n#clf.add(Dense(units=128,activation='relu'))\nclf.add(Dense(units=64, activation='relu'))\nclf.add(Dropout(0.5))\nclf.add(Dense(units=120,activation='softmax'))\n#stochastic gradient descent -Adam -optimizer\n#loss func categorical cross entropy\n#metrics = accuracy\nclf.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])","metadata":{"collapsed":true,"jupyter":{"outputs_hidden":true}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.callbacks import EarlyStopping\nearly_stopping_monitor=EarlyStopping(patience=6)","metadata":{"collapsed":true,"jupyter":{"outputs_hidden":true}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"hist=clf.fit_generator(\n        training_set,\n        steps_per_epoch=400,\n        epochs=50,\n        validation_data=test_set,\n        validation_steps=2222,\ncallbacks=[early_stopping_minitor])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport cv2\nimport pandas as pd\ntest_set = []\ntest_set_ids = []\nfor curImage in os.listdir('test'):\n    test_set_ids.append(os.path.splitext(curImage)[0])\n    #print(os.path.splitext(curImage)[0])\n    curImage = cv2.imread('test/'+curImage)\n    test_set.append(cv2.resize(curImage,(128, 128)))","metadata":{"collapsed":true,"jupyter":{"outputs_hidden":true}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_set = np.array(test_set, np.float32)/255.0","metadata":{"collapsed":true,"jupyter":{"outputs_hidden":true}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions= clf.predict(test_set)","metadata":{"collapsed":true,"jupyter":{"outputs_hidden":true}},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions[0].shape","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"training_set.class_indices","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classes= {index:breed for breed,index in training_set.class_indices.items()}\ncolumn_names = [classes[i] for i in range(120)]\ncolumn_names","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions_df = pd.DataFrame(predictions)\npredictions_df.columns = column_names\npredictions_df.insert(0,'id', test_set_ids)\n#predictions_df.index = test_set_ids\npredictions_df","metadata":{"scrolled":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions_df.to_csv('interim_submission.csv',sep=\",\")","metadata":{"collapsed":true,"jupyter":{"outputs_hidden":true}},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Graph representation of validation loss vs  number of epochs","metadata":{}},{"cell_type":"code","source":"plt.plot(hist.history['val_loss'])\nplt.xlabel('epochs')\nplt.ylabel('validation loss')\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Graph representation of test accuracy","metadata":{}},{"cell_type":"code","source":"plt.plot(hist.history['acc'])\nplt.xlabel('epochs')\nplt.ylabel('accuracy')\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(hist.history['acc'],label=\"Accuracy\")\nplt.plot(hist.history['val_acc'], label=\"Validation accuracy\")\nplt.legend()\nplt.xlabel('epochs')\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(hist.history['loss'],label=\"traing loss\")\nplt.plot(hist.history['val_loss'], label=\"Validation loss\")\nplt.legend()\nplt.xlabel('epochs')\nplt.show()","metadata":{},"execution_count":null,"outputs":[]}]}