{"nbformat_minor": 1, "cells": [{"execution_count": null, "cell_type": "code", "metadata": {"_uuid": "20612218cfe2610238a65e74016b29c28409d82d", "collapsed": true, "_cell_guid": "ddd4b043-43c0-42a2-93c6-c37d71473815"}, "outputs": [], "source": ["import numpy as np # linear algebra\n", "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n", "import keras\n", "from keras.applications.vgg19 import VGG19\n", "from keras.models import Model\n", "from keras.layers import Dense, Dropout, Flatten\n", "\n", "import os\n", "from tqdm import tqdm\n", "from sklearn import preprocessing\n", "from sklearn.model_selection import train_test_split\n", "import cv2\n", "# Input data files are available in the \"../input/\" directory.\n", "# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n", "\n", "from subprocess import check_output\n", "print(check_output([\"ls\", \"../input\"]).decode(\"utf8\"))\n"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": ["df_train = pd.read_csv('../input/labels.csv')\n", "df_test = pd.read_csv('../input/sample_submission.csv')"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": ["df_train.head(10)"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": ["targets_series = pd.Series(df_train['breed'])\n", "one_hot = pd.get_dummies(targets_series, sparse = True)"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": ["one_hot_labels = np.asarray(one_hot)"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": ["im_size = 90"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": ["x_train = []\n", "y_train = []\n", "x_test = []"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": ["i = 0 \n", "for f, breed in tqdm(df_train.values):\n", "    img = cv2.imread('../input/train/{}.jpg'.format(f))\n", "    label = one_hot_labels[i]\n", "    x_train.append(cv2.resize(img, (im_size, im_size)))\n", "    y_train.append(label)\n", "    i += 1"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": ["for f in tqdm(df_test['id'].values):\n", "    img = cv2.imread('../input/test/{}.jpg'.format(f))\n", "    x_test.append(cv2.resize(img, (im_size, im_size)))"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": ["y_train_raw = np.array(y_train, np.uint8)\n", "x_train_raw = np.array(x_train, np.float32) / 255.\n", "x_test  = np.array(x_test, np.float32) / 255.\n"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": ["print(x_train_raw.shape)\n", "print(y_train_raw.shape)\n", "print(x_test.shape)"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": ["num_class = y_train_raw.shape[1]"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": ["X_train, X_valid, Y_train, Y_valid = train_test_split(x_train_raw, y_train_raw, test_size=0.3, random_state=1)"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": ["# Create the base pre-trained model\n", "# Can't download weights in the kernel\n", "base_model = VGG19(#weights='imagenet',\n", "    weights = None, include_top=False, input_shape=(im_size, im_size, 3))\n", "\n", "# Add a new top layer\n", "x = base_model.output\n", "x = Flatten()(x)\n", "predictions = Dense(num_class, activation='softmax')(x)\n", "\n", "# This is the model we will train\n", "model = Model(inputs=base_model.input, outputs=predictions)\n", "\n", "# First: train only the top layers (which were randomly initialized)\n", "for layer in base_model.layers:\n", "    layer.trainable = False\n", "\n", "model.compile(loss='categorical_crossentropy', \n", "              optimizer='adam', \n", "              metrics=['accuracy'])\n", "\n", "callbacks_list = [keras.callbacks.EarlyStopping(monitor='val_acc', patience=3, verbose=1)]\n", "model.summary()"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": ["model.fit(X_train, Y_train, epochs=1, validation_data=(X_valid, Y_valid), verbose=1)"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": ["preds = model.predict(x_test, verbose=1)"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": ["sub = pd.DataFrame(preds)\n", "# Set column names to those generated by the one-hot encoding earlier\n", "col_names = one_hot.columns.values\n", "sub.columns = col_names\n", "# Insert the column id from the sample_submission at the start of the data frame\n", "sub.insert(0, 'id', df_test['id'])\n", "sub.head(5)"]}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": []}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": []}, {"execution_count": null, "cell_type": "code", "metadata": {"collapsed": true}, "outputs": [], "source": []}], "metadata": {"language_info": {"version": "3.6.3", "pygments_lexer": "ipython3", "mimetype": "text/x-python", "nbconvert_exporter": "python", "codemirror_mode": {"version": 3, "name": "ipython"}, "file_extension": ".py", "name": "python"}, "kernelspec": {"language": "python", "display_name": "Python 3", "name": "python3"}}, "nbformat": 4}