{"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":"## Dog Breed Identification\n\nIn this competition, given an image of a dog we are asked to predict a probability for each of the different 120 breeds of the dogs.\n\nSo let's get started.","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nprint(tf.__version__)","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2021-10-03T12:36:42.572285Z","iopub.execute_input":"2021-10-03T12:36:42.572755Z","iopub.status.idle":"2021-10-03T12:36:42.577630Z","shell.execute_reply.started":"2021-10-03T12:36:42.572716Z","shell.execute_reply":"2021-10-03T12:36:42.576724Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install livelossplot","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2021-10-03T12:36:42.579366Z","iopub.execute_input":"2021-10-03T12:36:42.579960Z","iopub.status.idle":"2021-10-03T12:36:48.228869Z","shell.execute_reply.started":"2021-10-03T12:36:42.579923Z","shell.execute_reply":"2021-10-03T12:36:48.227796Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pyplot as plt\nfrom tensorflow import keras\n\nimport cv2\nimport PIL\nimport os\nfrom IPython.display import Image, display\n\n# Plotly for the interactive viewer (see last section)\n\nimport plotly.graph_objs as go\nimport plotly.graph_objects as go\nfrom sklearn.metrics import cohen_kappa_score\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.models import Sequential, Model,load_model\nfrom tensorflow.keras.applications import xception\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator,load_img, img_to_array\nfrom tensorflow.keras import Input\nfrom tensorflow.keras.callbacks import EarlyStopping, LearningRateScheduler \nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Dropout, Flatten,BatchNormalization,Activation\nfrom tensorflow.keras.layers import GlobalAveragePooling2D\nfrom tensorflow.keras.optimizers import Adam, SGD, RMSprop\nfrom tensorflow.keras.callbacks import ModelCheckpoint, Callback, EarlyStopping\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nimport gc\nimport skimage.io\nfrom livelossplot import PlotLossesKeras","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_kg_hide-input":true,"execution":{"iopub.status.busy":"2021-10-03T12:36:48.231947Z","iopub.execute_input":"2021-10-03T12:36:48.232338Z","iopub.status.idle":"2021-10-03T12:36:48.246020Z","shell.execute_reply.started":"2021-10-03T12:36:48.232297Z","shell.execute_reply":"2021-10-03T12:36:48.245324Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"I'm gonna be using the jpeg files for training and testing.","metadata":{}},{"cell_type":"code","source":"train_dir = '../input/dog-breed-identification/train/'\ntest_dir = '../input/dog-breed-identification/test/'\ntrain_labels = pd.read_csv('../input/dog-breed-identification/labels.csv')\nsubmission=pd.read_csv('../input/dog-breed-identification/sample_submission.csv')","metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","execution":{"iopub.status.busy":"2021-10-03T12:36:48.249379Z","iopub.execute_input":"2021-10-03T12:36:48.250081Z","iopub.status.idle":"2021-10-03T12:36:48.561574Z","shell.execute_reply.started":"2021-10-03T12:36:48.250042Z","shell.execute_reply":"2021-10-03T12:36:48.560737Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_size = len(os.listdir(train_dir))\ntest_size = len(os.listdir(test_dir))\n\nprint(train_size,test_size)\nprint(train_labels.shape)\nprint(submission.shape)","metadata":{"execution":{"iopub.status.busy":"2021-10-03T12:36:48.564274Z","iopub.execute_input":"2021-10-03T12:36:48.564643Z","iopub.status.idle":"2021-10-03T12:36:48.582564Z","shell.execute_reply.started":"2021-10-03T12:36:48.564604Z","shell.execute_reply":"2021-10-03T12:36:48.581059Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"target, dog_breeds = pd.factorize(train_labels['breed'], sort = True)\ntrain_labels['target'] = target","metadata":{"execution":{"iopub.status.busy":"2021-10-03T12:36:48.583843Z","iopub.execute_input":"2021-10-03T12:36:48.584189Z","iopub.status.idle":"2021-10-03T12:36:48.592029Z","shell.execute_reply.started":"2021-10-03T12:36:48.584154Z","shell.execute_reply":"2021-10-03T12:36:48.591140Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display(train_labels.head())\ndisplay(submission.head())","metadata":{"execution":{"iopub.status.busy":"2021-10-03T12:36:48.593868Z","iopub.execute_input":"2021-10-03T12:36:48.594446Z","iopub.status.idle":"2021-10-03T12:36:48.631338Z","shell.execute_reply.started":"2021-10-03T12:36:48.594405Z","shell.execute_reply":"2021-10-03T12:36:48.630326Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_labels['breed'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2021-10-03T12:36:48.632812Z","iopub.execute_input":"2021-10-03T12:36:48.633190Z","iopub.status.idle":"2021-10-03T12:36:48.647385Z","shell.execute_reply.started":"2021-10-03T12:36:48.633154Z","shell.execute_reply":"2021-10-03T12:36:48.645965Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(13, 6))\ntrain_labels['breed'].value_counts().plot(kind='bar')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-10-03T12:36:48.649244Z","iopub.execute_input":"2021-10-03T12:36:48.649629Z","iopub.status.idle":"2021-10-03T12:36:50.314458Z","shell.execute_reply.started":"2021-10-03T12:36:48.649590Z","shell.execute_reply":"2021-10-03T12:36:50.313753Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Preparing the Datasets","metadata":{}},{"cell_type":"code","source":"labels=[]\ndata=[]\nfor i in range(train_labels.shape[0]):\n    data.append(train_dir + train_labels['id'].iloc[i]+'.jpg')\n    labels.append(train_labels['target'].iloc[i])\ndf=pd.DataFrame(data)\ndf.columns=['images']\ndf['target']=labels\nprint(df.shape)\ndisplay(df.head())\n\ndel labels\ndel data","metadata":{"execution":{"iopub.status.busy":"2021-10-03T12:36:50.315699Z","iopub.execute_input":"2021-10-03T12:36:50.316054Z","iopub.status.idle":"2021-10-03T12:36:50.606186Z","shell.execute_reply.started":"2021-10-03T12:36:50.316025Z","shell.execute_reply":"2021-10-03T12:36:50.605297Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data=[]\nfor i in range(submission.shape[0]):\n    test_data.append(test_dir + submission['id'].iloc[i]+'.jpg')\ndf_test=pd.DataFrame(test_data)\ndf_test.columns=['images']\nprint(df_test.shape)\ndisplay(df_test.head())\n\ndel test_data","metadata":{"execution":{"iopub.status.busy":"2021-10-03T12:36:50.607929Z","iopub.execute_input":"2021-10-03T12:36:50.608385Z","iopub.status.idle":"2021-10-03T12:36:50.756911Z","shell.execute_reply.started":"2021-10-03T12:36:50.608344Z","shell.execute_reply":"2021-10-03T12:36:50.756018Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_val, y_train, y_val = train_test_split(df['images'],df['target'], stratify = df['target'], test_size=0.2, random_state=1234)\n\ntrain=pd.DataFrame(X_train)\ntrain.columns=['images']\ntrain['target']=y_train\n\nvalidation=pd.DataFrame(X_val)\nvalidation.columns=['images']\nvalidation['target']=y_val\n\nprint(train.shape)\ndisplay(train.head())\nprint(validation.shape)\ndisplay(validation.head())\n\ndel X_train, X_val, y_train, y_val","metadata":{"execution":{"iopub.status.busy":"2021-10-03T12:36:50.758631Z","iopub.execute_input":"2021-10-03T12:36:50.759025Z","iopub.status.idle":"2021-10-03T12:36:50.788828Z","shell.execute_reply.started":"2021-10-03T12:36:50.758969Z","shell.execute_reply":"2021-10-03T12:36:50.787972Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Global Variables","metadata":{}},{"cell_type":"code","source":"N_EPOCHS = 50\nBATCH_SIZE = 32\nIMG_HEIGHT = 299\nIMG_WIDTH = 299","metadata":{"execution":{"iopub.status.busy":"2021-10-03T12:36:50.790668Z","iopub.execute_input":"2021-10-03T12:36:50.791093Z","iopub.status.idle":"2021-10-03T12:36:50.795690Z","shell.execute_reply.started":"2021-10-03T12:36:50.791051Z","shell.execute_reply":"2021-10-03T12:36:50.794755Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## I'll do some very basic preprocessing like \n* normalizing\n* reshaping\n* augmentation(only for tarin data)","metadata":{}},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(rotation_range=20,\n    width_shift_range=0.2,\n    height_shift_range=0.2,horizontal_flip=True, zoom_range=0.2)\n\nval_datagen = ImageDataGenerator()\n\ntrain_generator = train_datagen.flow_from_dataframe(\n    train,\n    x_col='images',\n    y_col='target',\n    target_size=(IMG_HEIGHT, IMG_WIDTH),\n    batch_size=BATCH_SIZE,\n    shuffle=True,\n    class_mode='raw')\n\nvalidation_generator = val_datagen.flow_from_dataframe(\n    validation,\n    x_col='images',\n    y_col='target',\n    target_size=(IMG_HEIGHT, IMG_WIDTH),\n    shuffle=False,\n    batch_size=BATCH_SIZE,\n    class_mode='raw')","metadata":{"execution":{"iopub.status.busy":"2021-10-03T12:36:50.797861Z","iopub.execute_input":"2021-10-03T12:36:50.798391Z","iopub.status.idle":"2021-10-03T12:36:54.531897Z","shell.execute_reply.started":"2021-10-03T12:36:50.798349Z","shell.execute_reply":"2021-10-03T12:36:54.531068Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Modelling","metadata":{}},{"cell_type":"code","source":"base_model = xception.Xception(weights='imagenet', include_top=False, input_shape=(299,299,3)) \n# display(base_model.summary())\n\n# train only the top layers (which were randomly initialized)\n# i.e. freeze all convolutional Xception layers\nbase_model.trainable = False\n\ninputs = Input(shape=(299, 299, 3))\nx = xception.preprocess_input(inputs) ##  tf.keras.applications.xception.preprocess_input\n\n# The base model contains batchnorm layers. We want to keep them in inference mode\n# when we unfreeze the base model for fine-tuning, so we make sure that the\n# base_model is running in inference mode here by passing `training=False`.\nx = base_model(x, training=False)\n\nx = GlobalAveragePooling2D()(x)\n\n#     adding extra dense layer\n#     x = Dense(1024, activation='relu')(x)\n#     x = Dropout(.7)(x)\n#     x = Dense(512, activation='relu')(x)\n\nx = Dropout(.5)(x)\noutputs = Dense(120, activation='softmax')(x)\nmodel = Model(inputs, outputs)\n\ndisplay(model.summary())","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2021-10-03T12:36:54.534811Z","iopub.execute_input":"2021-10-03T12:36:54.535084Z","iopub.status.idle":"2021-10-03T12:36:56.963756Z","shell.execute_reply.started":"2021-10-03T12:36:54.535058Z","shell.execute_reply":"2021-10-03T12:36:56.962969Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"optimizer = Adam(learning_rate=0.001)\nmodel.compile(loss=\"sparse_categorical_crossentropy\", metrics=['accuracy'], optimizer=optimizer)","metadata":{"execution":{"iopub.status.busy":"2021-10-03T12:36:56.965867Z","iopub.execute_input":"2021-10-03T12:36:56.966284Z","iopub.status.idle":"2021-10-03T12:36:57.012161Z","shell.execute_reply.started":"2021-10-03T12:36:56.966247Z","shell.execute_reply":"2021-10-03T12:36:57.011390Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"n_train_steps = train.shape[0]//BATCH_SIZE\nn_val_steps=validation.shape[0]//BATCH_SIZE\nprint(\"Number of training and validation steps: {} and {}\".format(n_train_steps, n_val_steps))","metadata":{"execution":{"iopub.status.busy":"2021-10-03T12:36:57.013510Z","iopub.execute_input":"2021-10-03T12:36:57.014015Z","iopub.status.idle":"2021-10-03T12:36:57.019792Z","shell.execute_reply.started":"2021-10-03T12:36:57.013960Z","shell.execute_reply":"2021-10-03T12:36:57.018609Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"EarlyStop_callback = EarlyStopping(min_delta=0.001, patience=10, restore_best_weights=True)\n\n# # DECREASE LEARNING RATE EACH EPOCH\n# annealer = LearningRateScheduler(lambda epoch: 1e-5 * 0.95 ** epoch, verbose=1)\n\n# cb=[PlotLossesKeras(), annealer]","metadata":{"execution":{"iopub.status.busy":"2021-10-03T12:36:57.021222Z","iopub.execute_input":"2021-10-03T12:36:57.021694Z","iopub.status.idle":"2021-10-03T12:36:57.028884Z","shell.execute_reply.started":"2021-10-03T12:36:57.021657Z","shell.execute_reply":"2021-10-03T12:36:57.027481Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(\n    train_generator,\n    epochs=N_EPOCHS,\n    validation_data=validation_generator,\n    callbacks=[EarlyStop_callback],\n#     use_multiprocessing = True,\n#     workers = 4,\n#     max_queue_size = 32\n    )","metadata":{"execution":{"iopub.status.busy":"2021-10-03T12:36:57.032551Z","iopub.execute_input":"2021-10-03T12:36:57.033138Z","iopub.status.idle":"2021-10-03T13:43:15.205646Z","shell.execute_reply.started":"2021-10-03T12:36:57.033036Z","shell.execute_reply":"2021-10-03T13:43:15.204885Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del train_generator, validation_generator","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Prediction for Test Dataset","metadata":{}},{"cell_type":"code","source":"test_datagen = ImageDataGenerator()\n\ntest_generator = test_datagen.flow_from_dataframe(\n    df_test,\n    x_col='images',\n    target_size=(IMG_HEIGHT, IMG_WIDTH),\n    shuffle=False,\n    batch_size=BATCH_SIZE,\n    class_mode=None\n)","metadata":{"execution":{"iopub.status.busy":"2021-10-03T13:49:31.983808Z","iopub.execute_input":"2021-10-03T13:49:31.984158Z","iopub.status.idle":"2021-10-03T13:49:50.008307Z","shell.execute_reply.started":"2021-10-03T13:49:31.984118Z","shell.execute_reply":"2021-10-03T13:49:50.007362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = model.predict(\n    test_generator,\n    verbose=1         \n)","metadata":{"execution":{"iopub.status.busy":"2021-10-03T13:50:27.362141Z","iopub.execute_input":"2021-10-03T13:50:27.362515Z","iopub.status.idle":"2021-10-03T13:52:50.757668Z","shell.execute_reply.started":"2021-10-03T13:50:27.362481Z","shell.execute_reply":"2021-10-03T13:52:50.756634Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(predictions.shape)\nprint(predictions)","metadata":{"execution":{"iopub.status.busy":"2021-10-03T13:54:13.428954Z","iopub.execute_input":"2021-10-03T13:54:13.429339Z","iopub.status.idle":"2021-10-03T13:54:13.435013Z","shell.execute_reply.started":"2021-10-03T13:54:13.429304Z","shell.execute_reply":"2021-10-03T13:54:13.434145Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Submission","metadata":{}},{"cell_type":"code","source":"submission.loc[:, dog_breeds] = predictions\nsubmission.head()","metadata":{"execution":{"iopub.status.busy":"2021-10-03T13:54:49.287669Z","iopub.execute_input":"2021-10-03T13:54:49.288022Z","iopub.status.idle":"2021-10-03T13:54:49.813039Z","shell.execute_reply.started":"2021-10-03T13:54:49.287966Z","shell.execute_reply":"2021-10-03T13:54:49.812002Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2021-10-03T13:54:54.386020Z","iopub.execute_input":"2021-10-03T13:54:54.386334Z","iopub.status.idle":"2021-10-03T13:54:57.634394Z","shell.execute_reply.started":"2021-10-03T13:54:54.386305Z","shell.execute_reply":"2021-10-03T13:54:57.633514Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}