{"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":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","papermill":{"duration":16.191827,"end_time":"2021-03-16T10:35:53.590772","exception":false,"start_time":"2021-03-16T10:35:37.398945","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nimport tensorflow as tf\nfrom keras_preprocessing.image import ImageDataGenerator\nfrom mpl_toolkits.axes_grid1 import ImageGrid\nimport itertools \nimport matplotlib.pyplot as plt\n%matplotlib inline","metadata":{"papermill":{"duration":5.207411,"end_time":"2021-03-16T10:35:58.886428","exception":false,"start_time":"2021-03-16T10:35:53.679017","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ntrain_dir = '../input/dog-breed-identification/train'\ntest_dir ='../input/dog-breed-identification/test'","metadata":{"papermill":{"duration":0.084354,"end_time":"2021-03-16T10:35:59.040784","exception":false,"start_time":"2021-03-16T10:35:58.956430","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ndef append_ext(fn):\n    return fn+\".jpg\"\ntraindf = pd.read_csv('../input/dog-breed-identification/labels.csv',dtype=str)\ntestdf = pd.read_csv('../input/dog-breed-identification/sample_submission.csv',dtype=str)\ntraindf[\"id\"] = traindf[\"id\"].apply(append_ext)\ntestdf[\"id\"] = testdf[\"id\"].apply(append_ext)\n","metadata":{"papermill":{"duration":0.726751,"end_time":"2021-03-16T10:35:59.838551","exception":false,"start_time":"2021-03-16T10:35:59.111800","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training Labels","metadata":{"papermill":{"duration":0.068505,"end_time":"2021-03-16T10:35:59.976152","exception":false,"start_time":"2021-03-16T10:35:59.907647","status":"completed"},"tags":[]}},{"cell_type":"code","source":"traindf.head()","metadata":{"papermill":{"duration":0.091166,"end_time":"2021-03-16T10:36:00.136753","exception":false,"start_time":"2021-03-16T10:36:00.045587","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Test id or Sample Submission","metadata":{"papermill":{"duration":0.06905,"end_time":"2021-03-16T10:36:00.274221","exception":false,"start_time":"2021-03-16T10:36:00.205171","status":"completed"},"tags":[]}},{"cell_type":"code","source":"testdf.head()","metadata":{"papermill":{"duration":0.100591,"end_time":"2021-03-16T10:36:00.441971","exception":false,"start_time":"2021-03-16T10:36:00.341380","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training Images","metadata":{"papermill":{"duration":0.127859,"end_time":"2021-03-16T10:36:00.685749","exception":false,"start_time":"2021-03-16T10:36:00.557890","status":"completed"},"tags":[]}},{"cell_type":"code","source":"\nsrc_path = \"../input/dog-breed-identification/train\"\nsub_class = os.listdir(src_path)\n\nfig = plt.figure(figsize=(10,5))\nfor e in range(len(sub_class[:8])):\n    plt.subplot(2,4,e+1)\n    img = plt.imread(os.path.join(src_path,sub_class[e]))\n    plt.imshow(img, cmap=plt.get_cmap('gray'))\n    plt.axis('off')","metadata":{"papermill":{"duration":1.188808,"end_time":"2021-03-16T10:36:01.996333","exception":false,"start_time":"2021-03-16T10:36:00.807525","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data preprocessing","metadata":{"_kg_hide-output":true,"papermill":{"duration":0.075855,"end_time":"2021-03-16T10:36:02.148350","exception":false,"start_time":"2021-03-16T10:36:02.072495","status":"completed"},"tags":[]}},{"cell_type":"code","source":"%%time\ntrain_datagen=ImageDataGenerator( rescale=1./255.,\n                                  #rotation_range = 20,\n                                  #brightness_range=[0.2,1.0],\n                                  #width_shift_range = 0.2,\n                                  #height_shift_range = 0.2,\n                                  #shear_range = 0.2,\n                                  #zoom_range = [0.7,1],\n                                  horizontal_flip = True,\n                                  #Setting validation split to 2% \n                                  validation_split=0.02 \n                                  )","metadata":{"papermill":{"duration":0.085989,"end_time":"2021-03-16T10:36:02.309474","exception":false,"start_time":"2021-03-16T10:36:02.223485","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"BATCH_SIZE = 32","metadata":{"papermill":{"duration":0.083649,"end_time":"2021-03-16T10:36:02.467716","exception":false,"start_time":"2021-03-16T10:36:02.384067","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"image_size=(331,331)","metadata":{"papermill":{"duration":0.081857,"end_time":"2021-03-16T10:36:02.624017","exception":false,"start_time":"2021-03-16T10:36:02.542160","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator=train_datagen.flow_from_dataframe(\ndataframe=traindf,\ndirectory=train_dir,\nx_col=\"id\",\ny_col=\"breed\",\nsubset=\"training\",\nbatch_size=BATCH_SIZE,\nseed=42,\nshuffle=True,\nclass_mode=\"categorical\",\ntarget_size=image_size,\ncolor_mode=\"rgb\" \n)","metadata":{"papermill":{"duration":3.515719,"end_time":"2021-03-16T10:36:06.214598","exception":false,"start_time":"2021-03-16T10:36:02.698879","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Plotting Augmented images","metadata":{"papermill":{"duration":0.074604,"end_time":"2021-03-16T10:36:06.365676","exception":false,"start_time":"2021-03-16T10:36:06.291072","status":"completed"},"tags":[]}},{"cell_type":"code","source":"x,y = next(train_generator)","metadata":{"papermill":{"duration":0.331865,"end_time":"2021-03-16T10:36:06.772658","exception":false,"start_time":"2021-03-16T10:36:06.440793","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(type(x))\nprint(x.shape)\nprint(y.shape)","metadata":{"papermill":{"duration":0.083869,"end_time":"2021-03-16T10:36:06.931543","exception":false,"start_time":"2021-03-16T10:36:06.847674","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def show_grid(image_list,nrows,ncols,figsize=(10,10),showaxis='off'):\n    \n    image_list = [image_list[i,:,:,:] for i in range(image_list.shape[0])]\n    fig = plt.figure(None, figsize,frameon=False)\n    grid = ImageGrid(fig, 111,  # similar to subplot(111)\n                     nrows_ncols=(nrows, ncols),  # creates 2x2 grid of axes\n                     axes_pad=0.3,  # pad between axes in inch.\n                     share_all=True,\n                     )\n    for i in range(nrows*ncols):\n        ax = grid[i]\n        ax.imshow(image_list[i],cmap='Greys_r')  # The AxesGrid object work as a list of axes.\n        ax.axis('off')\n        ","metadata":{"papermill":{"duration":0.090092,"end_time":"2021-03-16T10:36:07.096839","exception":false,"start_time":"2021-03-16T10:36:07.006747","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nshow_grid(x,8,3,figsize=(25,25))\n","metadata":{"papermill":{"duration":3.526836,"end_time":"2021-03-16T10:36:10.698150","exception":false,"start_time":"2021-03-16T10:36:07.171314","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Validation Data","metadata":{"papermill":{"duration":0.118688,"end_time":"2021-03-16T10:36:10.944053","exception":false,"start_time":"2021-03-16T10:36:10.825365","status":"completed"},"tags":[]}},{"cell_type":"code","source":"valid_generator=train_datagen.flow_from_dataframe(\ndataframe=traindf,\ndirectory=train_dir,\nx_col=\"id\",\ny_col=\"breed\",\nsubset=\"validation\",\nbatch_size=BATCH_SIZE,\nseed=42,\nshuffle=True,\nclass_mode=\"categorical\",\ntarget_size=image_size,\ncolor_mode=\"rgb\")\n","metadata":{"papermill":{"duration":3.133173,"end_time":"2021-03-16T10:36:14.196510","exception":false,"start_time":"2021-03-16T10:36:11.063337","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Test Data","metadata":{"papermill":{"duration":0.118623,"end_time":"2021-03-16T10:36:14.436363","exception":false,"start_time":"2021-03-16T10:36:14.317740","status":"completed"},"tags":[]}},{"cell_type":"code","source":"test_datagen=ImageDataGenerator(rescale=1./255.)\n\ntest_generator=test_datagen.flow_from_dataframe(\ndataframe=testdf,\ndirectory=test_dir,\nx_col=\"id\",\ny_col=None,\nbatch_size=BATCH_SIZE,\nseed=42,\nshuffle=False,\nclass_mode=None,\ntarget_size=image_size,\ncolor_mode=\"rgb\")","metadata":{"papermill":{"duration":3.898941,"end_time":"2021-03-16T10:36:18.453182","exception":false,"start_time":"2021-03-16T10:36:14.554241","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Pretrained model NASNetLarge","metadata":{"papermill":{"duration":0.120292,"end_time":"2021-03-16T10:36:18.693727","exception":false,"start_time":"2021-03-16T10:36:18.573435","status":"completed"},"tags":[]}},{"cell_type":"code","source":"shape=(331,331,3)","metadata":{"papermill":{"duration":0.128561,"end_time":"2021-03-16T10:36:18.942533","exception":false,"start_time":"2021-03-16T10:36:18.813972","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pretrained_model = tf.keras.applications.NASNetLarge(\n        weights='imagenet',\n        include_top=False ,\n        input_shape=shape\n    )\npretrained_model.trainable = False\n    \nmodel = tf.keras.Sequential([ \n        pretrained_model,   \n        tf.keras.layers.GlobalAveragePooling2D(),\n        #tf.keras.layers.Dense(256, activation='relu'),\n        #tf.keras.layers.Dropout(0.5),\n        tf.keras.layers.Dense(120, activation='softmax')\n    ])","metadata":{"papermill":{"duration":6.127009,"end_time":"2021-03-16T10:36:25.188793","exception":false,"start_time":"2021-03-16T10:36:19.061784","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#opt = tf.keras.optimizers.Adam(learning_rate=0.001)\nopt=tf.keras.optimizers.SGD(lr=1e-3, momentum=0.9)\nmodel.compile(optimizer = opt ,\n              loss=\"categorical_crossentropy\",\n              metrics=[\"accuracy\"])\nmodel.summary()","metadata":{"papermill":{"duration":0.17769,"end_time":"2021-03-16T10:36:25.501594","exception":false,"start_time":"2021-03-16T10:36:25.323904","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Early stopping","metadata":{"papermill":{"duration":0.140371,"end_time":"2021-03-16T10:36:25.777072","exception":false,"start_time":"2021-03-16T10:36:25.636701","status":"completed"},"tags":[]}},{"cell_type":"code","source":"#reduce = tf.keras.callbacks.ReduceLROnPlateau( monitor='val_loss',factor=0.2,patience=5, min_lr=0.001 )\n\nearly = tf.keras.callbacks.EarlyStopping( patience=2,\n                                          min_delta=0.001,\n                                          restore_best_weights=True)","metadata":{"papermill":{"duration":0.149269,"end_time":"2021-03-16T10:36:26.063886","exception":false,"start_time":"2021-03-16T10:36:25.914617","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Fitting the Model:","metadata":{"papermill":{"duration":0.124982,"end_time":"2021-03-16T10:36:26.319586","exception":false,"start_time":"2021-03-16T10:36:26.194604","status":"completed"},"tags":[]}},{"cell_type":"code","source":"STEP_SIZE_TRAIN = train_generator.n//train_generator.batch_size\nSTEP_SIZE_VALID = valid_generator.n//valid_generator.batch_size\nhistory = model.fit(train_generator,\n                    steps_per_epoch=STEP_SIZE_TRAIN,\n                    validation_data=valid_generator,\n                    validation_steps=STEP_SIZE_VALID,\n                    epochs=25,\n                    callbacks=[early],)","metadata":{"papermill":{"duration":1245.64345,"end_time":"2021-03-16T10:57:12.090137","exception":false,"start_time":"2021-03-16T10:36:26.446687","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Loss and Accuracy Curves","metadata":{"papermill":{"duration":1.560335,"end_time":"2021-03-16T10:57:15.213278","exception":false,"start_time":"2021-03-16T10:57:13.652943","status":"completed"},"tags":[]}},{"cell_type":"code","source":"def display_training_curves(training, validation, title, subplot):\n    if subplot%10==1: # set up the subplots on the first call\n        plt.subplots(figsize=(10,10), facecolor='#F0F0F0')\n        plt.tight_layout()\n    ax = plt.subplot(subplot)\n    ax.set_facecolor('#F8F8F8')\n    ax.plot(training)\n    ax.plot(validation)\n    ax.set_title('MODEL '+ title)\n    ax.set_ylabel(title)\n    ax.set_xlabel('epoch')\n    ax.legend(['train', 'valid.'])","metadata":{"papermill":{"duration":1.574586,"end_time":"2021-03-16T10:57:18.372678","exception":false,"start_time":"2021-03-16T10:57:16.798092","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display_training_curves(\n    history.history['loss'],\n    history.history['val_loss'],\n    'LOSS',\n    211,\n)\n\ndisplay_training_curves(\n    history.history['accuracy'],\n    history.history['val_accuracy'],\n    'ACCURACY',\n    212,\n)\n","metadata":{"papermill":{"duration":2.086662,"end_time":"2021-03-16T10:57:22.135604","exception":false,"start_time":"2021-03-16T10:57:20.048942","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Accuracy","metadata":{"papermill":{"duration":1.566686,"end_time":"2021-03-16T10:57:29.120074","exception":false,"start_time":"2021-03-16T10:57:27.553388","status":"completed"},"tags":[]}},{"cell_type":"code","source":"score = model.evaluate(valid_generator,batch_size=32)\nprint(\"Accuracy: {:.2f}%\".format(score[1] * 100)) \nprint(\"Loss: \",score[0])\n\n","metadata":{"papermill":{"duration":3.696096,"end_time":"2021-03-16T10:57:34.451049","exception":false,"start_time":"2021-03-16T10:57:30.754953","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predicting Test Images","metadata":{"papermill":{"duration":1.62017,"end_time":"2021-03-16T10:57:53.608834","exception":false,"start_time":"2021-03-16T10:57:51.988664","status":"completed"},"tags":[]}},{"cell_type":"code","source":"%%time\npred=model.predict(test_generator)","metadata":{"papermill":{"duration":90.347441,"end_time":"2021-03-16T10:59:25.808640","exception":false,"start_time":"2021-03-16T10:57:55.461199","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_submission = pd.read_csv('/kaggle/input/dog-breed-identification/sample_submission.csv')\ndf_submission.head()","metadata":{"papermill":{"duration":1.885996,"end_time":"2021-03-16T10:59:29.261066","exception":false,"start_time":"2021-03-16T10:59:27.375070","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_submission.iloc[:,1:] = pred\ndf_submission.head()","metadata":{"papermill":{"duration":2.016893,"end_time":"2021-03-16T10:59:36.863961","exception":false,"start_time":"2021-03-16T10:59:34.847068","status":"completed"},"tags":[],"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"%%time\nfinal_df = df_submission.set_index('id')\nfinal_df.to_csv('Submission.csv')","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}