{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Import Libraries"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np \nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport cv2\nimport warnings\nfrom sklearn.model_selection import train_test_split\nwarnings.filterwarnings('ignore')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Read Data"},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"df = pd.read_csv('/kaggle/input/dog-breed-identification/labels.csv')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# See Data format"},{"metadata":{"trusted":true},"cell_type":"code","source":"df.head(10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.tail(10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.sample(10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.describe()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"See all breeds"},{"metadata":{"trusted":true},"cell_type":"code","source":"breeds = df.breed.unique()\nbreeds","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(breeds)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"See how our image look like"},{"metadata":{"trusted":true},"cell_type":"code","source":"row = df.iloc[0]\nimg = cv2.imread(\"/kaggle/input/dog-breed-identification/train/\"+row.id+\".jpg\")\nplt.imshow(img)\nplt.title(row.breed)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Image Shape"},{"metadata":{"trusted":true},"cell_type":"code","source":"print(img.shape)\nIMAGE_WIDTH = img.shape[0]\nIMAGE_HEIGHT = img.shape[1]\nIMAGE_CHANNEL = img.shape[2]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Let create filename column"},{"metadata":{"trusted":true},"cell_type":"code","source":"df[\"filename\"] = df['id'] + \".jpg\"\ndf.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Define Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = Sequential()\n\nmodel.add(Conv2D(64, kernel_size=(1, 1), activation=\"relu\", input_shape=(IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_CHANNEL)))\nmodel.add(MaxPooling2D())\n\nmodel.add(Conv2D(32, kernel_size=(1, 1), activation=\"relu\"))\nmodel.add(MaxPooling2D())\n\nmodel.add(Flatten())\nmodel.add(Dense(512, activation=\"relu\"))\nmodel.add(Dense(120, activation=\"softmax\"))\n\nmodel.compile(loss=\"categorical_crossentropy\", optimizer=\"adam\", metrics=['accuracy'])\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# mini_df = df.groupby('breed').apply(lambda s: s.sample(50))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# mini_df.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Split our data into test and train"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df, valid_df = train_test_split(df, test_size=0.15, random_state=42)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Create train generator"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_gen = ImageDataGenerator(\n    rescale=1.0/255,\n    rotation_range=15,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True\n)\ntrain_generator = train_gen.flow_from_dataframe(\n    train_df,\n    directory=\"/kaggle/input/dog-breed-identification/train\", \n    x_col=\"filename\",\n    y_col=\"breed\",\n    target_size=(IMAGE_WIDTH, IMAGE_HEIGHT),\n    class_mode=\"categorical\"\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Create Validate Generator"},{"metadata":{"trusted":true},"cell_type":"code","source":"valid_gen = ImageDataGenerator(\n    rescale=1.0/255,\n    rotation_range=15,\n    width_shift_range=0.2,\n    height_shift_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True\n)\nvalid_generator = train_gen.flow_from_dataframe(\n    valid_df,\n    directory=\"/kaggle/input/dog-breed-identification/train\", \n    x_col=\"filename\",\n    y_col=\"breed\",\n    target_size=(IMAGE_WIDTH, IMAGE_HEIGHT),\n    class_mode=\"categorical\"\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Train model"},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"earlystop = EarlyStopping(patience=10)\nlearning_rate_reduction = ReduceLROnPlateau(patience=2, verbose=1, factor=0.5, min_lr=0.00001)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit_generator(train_generator, validation_data=valid_generator, epochs=1000, callbacks = [earlystop, learning_rate_reduction])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Evaluate Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"scores = model.evaluate_generator(valid_generator)\nprint(\"Loss = \", scores[0])\nprint(\"Accuracy = \", scores[1])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Save our model weights"},{"metadata":{"trusted":true},"cell_type":"code","source":"model.save_weights(\"model.h5\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Read test data"},{"metadata":{"trusted":true},"cell_type":"code","source":"test_df = pd.read_csv('/kaggle/input/dog-breed-identification/sample_submission.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_df[\"filename\"] = test_df['id'] + \".jpg\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# mini_test_df = test_df.sample(300).reset_index()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Create test generator"},{"metadata":{"trusted":true},"cell_type":"code","source":"test_gen = ImageDataGenerator(rescale=1.0/255)\ntest_generator = test_gen.flow_from_dataframe(\n    test_df,\n    directory=\"/kaggle/input/dog-breed-identification/test\", \n    x_col=\"filename\",\n    target_size=(IMAGE_WIDTH, IMAGE_HEIGHT),\n    class_mode=None\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Prediction"},{"metadata":{"trusted":true},"cell_type":"code","source":"predictions = model.predict_generator(test_generator)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Submission"},{"metadata":{"trusted":true},"cell_type":"code","source":"labels = list(train_generator.class_indices.keys())\ncolumns = ['id'] + labels\nsubmission = pd.DataFrame(columns=columns)\nsubmission['id'] = mini_test_df.id\nsubmission[labels] = predictions","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"submission.to_csv(\"submission.csv\")"}],"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":4,"nbformat_minor":1}