{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"#import libraries and tools\n\nimport tensorflow as tf\nimport keras\nimport os\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport cv2\nfrom sklearn.utils import shuffle\nfrom skimage.io import imshow\nimport random\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.preprocessing import OneHotEncoder\nfrom keras.utils.np_utils import to_categorical","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","collapsed":true,"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":false},"cell_type":"code","source":"#Pre-processing\n\n#set up images to be patched with labels, then shuffle to remove any pre-patterns\ntrain_path = \"..\\\\train\\\\\"\ncsv_path = \"..\\\\labels.csv\"\n\nfile = pd.read_csv(csv_path)\nfile = np.array(file)\nfile = shuffle(file)\ntrain_data = file[:,0]\ntrain_target = file[:,1]\n\n#Append ages from csv file to corresponding images\n#Images pre-processed to RGB at size 128x128\nimg = []\nfor i in range(0, len(train_data)):\n    papth = train_path + train_data[i] + \".jpg\"\n    papth = cv2.imread(papth)\n    papth = cv2.resize(papth, (128, 128))\n    img.append(papth)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4d08f0ca6f71c2c3b1f212981530de9da1c97072"},"cell_type":"code","source":"#Convert breed categories to numerical representation\n#Used for categorical cross entropy\n\n#encode labels to numbers\nlabel_encoder = LabelEncoder()\ninteger_encoded = label_encoder.fit_transform(train_target)\nprint(integer_encoded)\n\n#encode numbers to arrays\none_hot_encoder = OneHotEncoder(sparse=False)\ninteger_encoded = integer_encoded.reshape(-1, 1)\none_hot_encoded = one_hot_encoder.fit_transform(integer_encoded)\nprint(one_hot_encoded)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"814f4af4a717e4c86141b61b1d19884748f946a0"},"cell_type":"code","source":"#Visualize data\n\nx = random.randint(0, len(img))\nprint(train_data[x])\nimshow(img[x])\nplt.show()\nprint(train_target[x])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b5f7c2e9a3b0d0439db65d97ace9cef0c39844df"},"cell_type":"code","source":"#Using Keras\n##Best time, moderate/good results, manageable resources to train model\n\n#Create empty train model\n\n#For testing, clear previous session; helps improve exec. time\nkeras.backend.clear_session()\n\n#Create sequential model\nLRM = keras.Sequential()\n\n#Add convolution and pooling layers\n###################################################################################################\n\nLRM.add(keras.layers.Convolution2D(1, (9, 9), input_shape = (128, 128, 3), activation = 'relu'))\n\n###################################################################################################\n\nLRM.add(keras.layers.MaxPooling2D((2, 2), strides = (1, 1)))\n\n###################################################################################################\n\nLRM.add(keras.layers.Convolution2D(4, (7, 7), activation = 'relu'))\nLRM.add(keras.layers.Dropout(0.2))\n\n###################################################################################################\n\nLRM.add(keras.layers.MaxPooling2D((2, 2), strides = (2, 2)))\n\n###################################################################################################\n\nLRM.add(keras.layers.Convolution2D(8, (7, 7), activation = 'relu'))\nLRM.add(keras.layers.Convolution2D(8, (5, 5), activation = 'relu'))\nLRM.add(keras.layers.Convolution2D(16, (5, 5), activation = 'relu'))\nLRM.add(keras.layers.Dropout(0.2))\n\n###################################################################################################\n\nLRM.add(keras.layers.MaxPooling2D((2, 2), strides = (1, 1)))\n\n###################################################################################################\n\nLRM.add(keras.layers.Convolution2D(16, (4, 4), activation = 'relu'))\nLRM.add(keras.layers.Convolution2D(32, (4, 4), activation = 'relu'))\nLRM.add(keras.layers.Convolution2D(32, (3, 3), activation = 'relu'))\nLRM.add(keras.layers.Dropout(0.2))\n\n###################################################################################################\n\nLRM.add(keras.layers.MaxPooling2D((2, 2), strides = (2, 2)))\n\n###################################################################################################\n\nLRM.add(keras.layers.Convolution2D(64, (3, 3), activation = 'relu'))\nLRM.add(keras.layers.Convolution2D(64, (2, 2), activation = 'relu'))\nLRM.add(keras.layers.Dropout(0.2))\n\n###################################################################################################\n\nLRM.add(keras.layers.MaxPooling2D((2, 2), strides = (1, 1)))\n\n###################################################################################################\n\n#Flatten and add hidden layers\nLRM.add(keras.layers.Flatten())\nLRM.add(keras.layers.Dense(64, activation = 'sigmoid'))\nLRM.add(keras.layers.Dropout(0.5))\nLRM.add(keras.layers.Dense(120, activation = 'softmax'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2485db42ef2c8a9affee373e9bc0789c4b0af4e3"},"cell_type":"code","source":"#Insert train data to train model\n\n#LRM.load_weights(\"anjCheck2.hdf5\") #if loading weights\n\n#compile using AdamOptimizer; measure by loss by categorical cross entropy\nLRM.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])\n\n#fit train data into model\nimgs = np.reshape(img, (-1, 128, 128, 3))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"005eedc08e219a24e2bd7674f50d9246003e418e"},"cell_type":"code","source":"#Create callbacks for efficiency while training\n\n#save model weights after each epoch\n#used if needed to stop kernel, then continue at a later time\nmodel_checkpt = keras.callbacks.ModelCheckpoint(\"anjCheck5.hdf5\", monitor = \"loss\", verbose = 1, save_best_only = True)\n\n#if no improvement after 1 epochs, reduce learning rate\nreduce_lr = keras.callbacks.ReduceLROnPlateau(monitor=\"loss\", factor = 0.4, patience = 1, min_lr = 0.001)\n\n#stop if no improvement after 3 epochs\nearly_stop = keras.callbacks.EarlyStopping(monitor=\"loss\", min_delta = 0, patience = 3, verbose = 1, mode = \"auto\", baseline = None, restore_best_weights = True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8c33dba33d3ed0088f1e8d6ae749917cd9b52c32"},"cell_type":"code","source":"#Train model\n\nLRM.fit(imgs, one_hot_encoded, epochs = 15, batch_size = 32, callbacks = [model_checkpt, reduce_lr, early_stop])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"37efa7c48ec45a7db4c038a3dcb657ae66ad654c"},"cell_type":"code","source":"#Evaluate model\n\nLRM.evaluate(imgs, train_target)\nLRM.save(\"..\\\\Keras_model2.h5\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c2efe0741f83b97c468d4a951c406eb483e21a88"},"cell_type":"code","source":"#Insert test data into trained model\n\ntest_csv = \"..\\\\sample_submission.csv\"\ntest_path = \"..\\\\test\\\\\"\n\nfile2 = pd.read_csv(test_csv)\nfile2 = np.array(file2)\nfile2 = shuffle(file2)\ntest_data = file2[:,0]\n\ntest = []\nfor i in range(0, len(test_data)):\n    test_file = test_path + test_data[i] + \".jpg\"\n    test_file = cv2.imread(test_file, 0)\n    test_file = cv2.resize(test_file, (128, 128))\n    test.append(test_file)\n\nresults = np.reshape(test, (-1, 128, 128, 1))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"39679e2ad363de16c4f6bde82dff79b4892fa51b"},"cell_type":"code","source":"#Insert test data into trained model (continued)\n\nprediction = LRM.predict(results, verbose = 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3441e37a159cad777b0642cb2728fd96b67415aa"},"cell_type":"code","source":"#View test samples\n\nprint(prediction.shape)\nprint(prediction[7089])\nprint(prediction[2314])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"09d1553e5c989de1569b2183882762599fde7d7d"},"cell_type":"code","source":"#Insert test results into CSV file\n\ndf = pd.DataFrame(prediction)\ndf.to_csv(\"Submit2.csv\")","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}