{"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\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\nfrom os.path import join\n\nimage_dir = '../input/dog-breed-identification/train/'\nimg_paths = [join(image_dir, filename) for filename in \n                           ['0c8fe33bd89646b678f6b2891df8a1c6.jpg',\n                            '0c3b282ecbed1ca9eb17de4cb1b6e326.jpg',\n                            '04fb4d719e9fe2b6ffe32d9ae7be8a22.jpg',\n                            '0e79be614f12deb4f7cae18614b7391b.jpg']]\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","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport matplotlib.pyplot as plt\nfrom PIL import Image\nimport keras as keras\nimport tensorflow as tf\nimport tensorflow_datasets as tfds\nfrom keras.preprocessing import image","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = keras.Sequential([\n    keras.layers.Conv2D(32, kernel_size=(3,3), input_shape=(224,224,3), activation='relu', padding='same'),\n    keras.layers.MaxPool2D(2, 2),\n    keras.layers.Dropout(0.5),\n    keras.layers.Conv2D(64, kernel_size=(3,3), activation='relu', padding='same'),\n    keras.layers.MaxPool2D(2, 2),\n    keras.layers.Dropout(0.5),\n    keras.layers.Conv2D(64, kernel_size=(3,3), activation='relu', padding='same'),\n    keras.layers.MaxPool2D(2, 2),\n    keras.layers.Dropout(0.5),\n    keras.layers.Flatten(),\n    keras.layers.Dense(64, activation='relu'),\n    keras.layers.Dropout(0.5),\n    keras.layers.Dense(120, activation='softmax')\n])\n\nmodel.compile(optimizer='adam',\n              loss=keras.losses.CategoricalCrossentropy(),\n              metrics=['accuracy'])\n\nmodel.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size = 32\nimg_size = 224","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dir = \"../input/dog-breed-identification/train\"\ntest_dir = \"../input/dog-breed-identification/test\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_labels = pd.read_csv('/kaggle/input/dog-breed-identification/labels.csv')\ntest_labels = pd.read_csv('../input/dog-breed-identification/sample_submission.csv')\ntrain_labels.columns\ndef append_ext(fn):\n    return fn + '.jpg'\n\ntrain_labels['id'] = train_labels['id'].apply(append_ext)\ntest_labels['id'] = test_labels['id'].apply(append_ext)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(rescale = 1./255,\n                                  horizontal_flip = True,\n                                  validation_split = 0.1\n                                  )","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator = train_datagen.flow_from_dataframe(\n    dataframe = train_labels,\n    directory = train_dir,\n    x_col = \"id\",\n    y_col = \"breed\",\n    subset = \"training\",\n    batch_size = batch_size,\n    seed = 42,\n    shuffle = True,\n    class_mode = \"categorical\",\n    target_size = (img_size, img_size),\n    color_mode = \"rgb\"\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"val_generator = train_datagen.flow_from_dataframe(\n    dataframe = train_labels,\n    directory = train_dir,\n    x_col = \"id\",\n    y_col = \"breed\",\n    subset = \"validation\",\n    batch_size = batch_size,\n    seed = 42,\n    shuffle = True,\n    class_mode = \"categorical\",\n    target_size = (img_size, img_size),\n    color_mode = \"rgb\"\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_datagen = ImageDataGenerator(rescale = 1./255)\n\ntest_generator = test_datagen.flow_from_dataframe(\n    dataframe = test_labels,\n    directory = test_dir,\n    x_col = \"id\",\n    y_col = None,\n    batch_size = batch_size,\n    seed = 42,\n    shuffle = False,\n    class_mode = None,\n    target_size = (img_size, img_size),\n    color_mode = \"rgb\"\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"early = tf.keras.callbacks.EarlyStopping(monitor = 'val_loss', patience=5)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"STEP_SIZE_TRAIN = train_generator.n//train_generator.batch_size\nSTEP_SIZE_VAL = val_generator.n//val_generator.batch_size\nSTEP_SIZE_TEST = test_generator.n//test_generator.batch_size\n\nmodel.fit(train_generator,\n          steps_per_epoch=STEP_SIZE_TRAIN,\n          validation_data=val_generator,\n          validation_steps=STEP_SIZE_VAL,\n          epochs=20,\n          callbacks = [early])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Y_pred = model.predict(val_generator)\ny_pred = np.argmax(Y_pred, axis=1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import f1_score\n\nprint(\"Micro F1: \", f1_score(val_generator.classes,y_pred,average='micro'))\nprint(\"Macro F1: \", f1_score(val_generator.classes,y_pred,average='macro'))\nprint(\"Weighted F1: \", f1_score(val_generator.classes,y_pred,average='weighted'))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred = model.predict(test_generator)","metadata":{"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":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import re\n\nfile_list = test_generator.filenames\nid_list = []\nfor name in file_list:\n    m = re.sub('test/', '', name)\n    m = re.sub('.jpg', '', m)\n    id_list.append(m)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_submission['id'] = id_list\ndf_submission.iloc[:,1:] = pred\ndf_submission.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"final_sub = df_submission.set_index('id')\nfinal_sub.to_csv('Submission.csv')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}