{"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\ndirectory = '../input/dog-breed-identification/train'\ndirectory_test = '../input/dog-breed-identification/test'\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)\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":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-05-04T13:27:42.360492Z","iopub.execute_input":"2022-05-04T13:27:42.360812Z","iopub.status.idle":"2022-05-04T13:27:42.980303Z","shell.execute_reply.started":"2022-05-04T13:27:42.360780Z","shell.execute_reply":"2022-05-04T13:27:42.979280Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"_, _, files = next(os.walk(directory))\nfile_count = len(files)\nfile_count  #number of files","metadata":{"execution":{"iopub.status.busy":"2022-05-04T13:20:51.121813Z","iopub.execute_input":"2022-05-04T13:20:51.122817Z","iopub.status.idle":"2022-05-04T13:20:59.992907Z","shell.execute_reply.started":"2022-05-04T13:20:51.122770Z","shell.execute_reply":"2022-05-04T13:20:59.991773Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nsorted_data=traindf.groupby('breed')['id'].agg('count').sort_values(ascending=False)\nsorted_data.plot(kind='bar',figsize=(20, 10))\nplt.show()  ","metadata":{"execution":{"iopub.status.busy":"2022-05-04T13:21:35.863988Z","iopub.execute_input":"2022-05-04T13:21:35.864369Z","iopub.status.idle":"2022-05-04T13:21:37.866780Z","shell.execute_reply.started":"2022-05-04T13:21:35.864334Z","shell.execute_reply":"2022-05-04T13:21:37.866104Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The class count in the data set is not uniform. We can use data augmentation to generate more data","metadata":{}},{"cell_type":"code","source":"from keras_preprocessing.image import ImageDataGenerator\nfrom keras.layers import Dense, Activation, Flatten, Dropout, BatchNormalization\nfrom keras.layers import Conv2D, MaxPooling2D\nfrom keras import regularizers\nfrom keras.models import Sequential\nfrom tensorflow.keras import optimizers","metadata":{"execution":{"iopub.status.busy":"2022-05-04T13:22:53.461153Z","iopub.execute_input":"2022-05-04T13:22:53.461511Z","iopub.status.idle":"2022-05-04T13:23:00.972421Z","shell.execute_reply.started":"2022-05-04T13:22:53.461475Z","shell.execute_reply":"2022-05-04T13:23:00.971300Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datagen=ImageDataGenerator(rescale=1./255.,validation_split=0.25,horizontal_flip=True,\n        vertical_flip=True,width_shift_range=0.2, height_shift_range=0.2)","metadata":{"execution":{"iopub.status.busy":"2022-05-04T13:28:29.286378Z","iopub.execute_input":"2022-05-04T13:28:29.287136Z","iopub.status.idle":"2022-05-04T13:28:29.292380Z","shell.execute_reply.started":"2022-05-04T13:28:29.287077Z","shell.execute_reply":"2022-05-04T13:28:29.291269Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#add jpg extension to the image name in pandas dataset\ndef append_ext(fn):\n    return fn+\".jpg\"\ntraindf[\"id\"]=traindf[\"id\"].apply(append_ext)\ntestdf[\"id\"]=testdf[\"id\"].apply(append_ext)","metadata":{"execution":{"iopub.status.busy":"2022-05-04T13:27:47.225750Z","iopub.execute_input":"2022-05-04T13:27:47.226129Z","iopub.status.idle":"2022-05-04T13:27:47.243028Z","shell.execute_reply.started":"2022-05-04T13:27:47.226089Z","shell.execute_reply":"2022-05-04T13:27:47.242035Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"traindf","metadata":{"execution":{"iopub.status.busy":"2022-05-04T13:28:01.021482Z","iopub.execute_input":"2022-05-04T13:28:01.021971Z","iopub.status.idle":"2022-05-04T13:28:01.041838Z","shell.execute_reply.started":"2022-05-04T13:28:01.021937Z","shell.execute_reply":"2022-05-04T13:28:01.040721Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator=datagen.flow_from_dataframe(dataframe=traindf,directory=directory,x_col=\"id\",y_col=\"breed\",subset=\"training\",\n                                            batch_size=32,seed=42,shuffle=True,class_mode=\"categorical\",target_size=(224,224))\nvalid_generator=datagen.flow_from_dataframe(dataframe=traindf,directory=directory,x_col=\"id\",y_col=\"breed\",\n                                            subset=\"validation\",batch_size=32,seed=42,shuffle=True,class_mode=\"categorical\",target_size=(224,224))\ntest_datagen=ImageDataGenerator(rescale=1./255.)\ntest_generator=test_datagen.flow_from_dataframe(dataframe=testdf,directory=directory_test,x_col=\"id\",y_col=None,batch_size=32,seed=42,\n                                                shuffle=False,class_mode=None,target_size=(224,224))","metadata":{"execution":{"iopub.status.busy":"2022-05-04T13:39:26.992556Z","iopub.execute_input":"2022-05-04T13:39:26.992904Z","iopub.status.idle":"2022-05-04T13:39:35.925089Z","shell.execute_reply.started":"2022-05-04T13:39:26.992870Z","shell.execute_reply":"2022-05-04T13:39:35.924100Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" \nimport tensorflow as tf\nmodel = Sequential()\nmodel.add(Conv2D(32, (3, 3), padding='same',\n                 input_shape=(224,224,3)))\nmodel.add(Activation('relu'))\nmodel.add(Conv2D(32, (3, 3)))\nmodel.add(Activation('relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\nmodel.add(Conv2D(64, (3, 3), padding='same'))\nmodel.add(Activation('relu'))\nmodel.add(Conv2D(64, (3, 3)))\nmodel.add(Activation('relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.25))\nmodel.add(Flatten())\nmodel.add(Dense(512))\nmodel.add(Activation('relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(120, activation='softmax'))\nmodel.compile(optimizers.Adam(learning_rate=0.001, decay=1e-6),loss=\"categorical_crossentropy\",metrics=[\"accuracy\"])","metadata":{"execution":{"iopub.status.busy":"2022-05-04T13:39:41.953255Z","iopub.execute_input":"2022-05-04T13:39:41.954175Z","iopub.status.idle":"2022-05-04T13:39:43.061915Z","shell.execute_reply.started":"2022-05-04T13:39:41.954113Z","shell.execute_reply":"2022-05-04T13:39:43.060958Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"STEP_SIZE_TRAIN=train_generator.n//train_generator.batch_size\nSTEP_SIZE_VALID=valid_generator.n//valid_generator.batch_size\nSTEP_SIZE_TEST=test_generator.n//test_generator.batch_size\nmodel.fit(train_generator,\n                    steps_per_epoch=STEP_SIZE_TRAIN,\n                    validation_data=valid_generator,\n                    validation_steps=STEP_SIZE_VALID,\n                    epochs=30)","metadata":{"execution":{"iopub.status.busy":"2022-05-04T13:39:51.552284Z","iopub.execute_input":"2022-05-04T13:39:51.552632Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.evaluate(valid_generator,\nsteps=STEP_SIZE_TEST)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_generator.reset()\npred=model.predict(test_generator,steps=STEP_SIZE_TEST,verbose=1)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predicted_class_indices=np.argmax(pred,axis=1)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = (train_generator.class_indices)\nlabels = dict((v,k) for k,v in labels.items())\npredictions = [labels[k] for k in predicted_class_indices]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filenames=test_generator.filenames\nresults=pd.DataFrame({\"Filename\":filenames,\n                      \"Predictions\":predictions})\nresults.to_csv(\"results.csv\",index=False)","metadata":{},"execution_count":null,"outputs":[]}]}