{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# [Given a picture, would you be able to identify which camera took it?](https://www.kaggle.com/c/sp-society-camera-model-identification)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Kaggle competition overview reads\n", "\n", "\"Finding footage of a crime caught on tape is an investigator's dream. But even with crystal clear, damning evidence, one critical question always remains–is the footage real?\n", "\n", "Today, one way to help authenticate footage is to identify the camera that the image was taken with. Forgeries often require splicing together content from two different cameras. But, unfortunately, the most common way to do this now is using image metadata, which can be easily falsified itself.\n", "\n", "This problem is actively studied by several researchers around the world. Many machine learning solutions have been proposed in the past: least-squares estimates of a camera's color demosaicing filters as classification features, co-occurrences of pixel value prediction errors as features that are passed to sophisticated ensemble classifiers, and using CNNs to learn camera model identification features. However, this is a problem yet to be sufficiently solved.\n", "\n", "For this competition, the IEEE Signal Processing Society is challenging you to build an algorithm that identifies which camera model captured an image by using traces intrinsically left in the image. Helping to solve this problem would have a big impact on the verification of evidence used in criminal and civil trials and even news reporting.\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Importing packages " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using TensorFlow backend.\n", "/home/paperspace/anaconda3/lib/python3.6/importlib/_bootstrap.py:205: RuntimeWarning: compiletime version 3.5 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.6\n", " return f(*args, **kwds)\n" ] } ], "source": [ "import numpy as np\n", "import os\n", "import pandas as pd\n", "import shutil\n", "from PIL import Image\n", "import matplotlib.pyplot as plt\n", "from sklearn.model_selection import StratifiedKFold\n", "from sklearn.metrics import accuracy_score, classification_report, confusion_matrix\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.decomposition import PCA\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.cross_validation import cross_val_score\n", "from sklearn.svm import SVC\n", "\n", "from bayes_opt import BayesianOptimization\n", "\n", "from keras.preprocessing.image import ImageDataGenerator, array_to_img\n", "from keras.applications.vgg16 import VGG16\n", "from keras.applications.resnet50 import ResNet50\n", "from keras.applications.inception_v3 import InceptionV3\n", "from keras.applications.xception import Xception\n", "from keras.models import Model, Sequential\n", "from keras.layers import Dense, BatchNormalization, Flatten, Dropout, Convolution2D, Activation, MaxPooling2D, GlobalAveragePooling2D\n", "from random import shuffle\n", "\n", "from keras.callbacks import Callback\n", "from keras.callbacks import ModelCheckpoint\n", "from keras.callbacks import LearningRateScheduler\n", "import math\n", "\n", "from keras.optimizers import SGD, Adam\n", "from keras import losses\n", "from keras.preprocessing.image import ImageDataGenerator, array_to_img\n", "\n", "master_path = \"/home/paperspace/IEEE\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "** Is there a GPU on the machine? **" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[name: \"/device:CPU:0\"\n", "device_type: \"CPU\"\n", "memory_limit: 268435456\n", "locality {\n", "}\n", "incarnation: 4289362492012536167\n", ", name: \"/device:GPU:0\"\n", "device_type: \"GPU\"\n", "memory_limit: 7773745972\n", "locality {\n", " bus_id: 1\n", "}\n", "incarnation: 13617983144464762836\n", "physical_device_desc: \"device: 0, name: Quadro M4000, pci bus id: 0000:00:05.0, compute capability: 5.2\"\n", "]\n" ] } ], "source": [ "from tensorflow.python.client import device_lib\n", "print(device_lib.list_local_devices())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Helper Functions" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def read_crop_save(frompath, topath):\n", " img = Image.open(frompath)\n", " w, h = img.size\n", " img = img.crop((w // 2 - 256, h // 2 - 256, w // 2 + 256, h // 2 + 256)) \n", " new_array = np.array(img)\n", " plt.imsave(topath, new_array)\n", " return\n", "\n", "#################################################################\n", "#################################################################\n", "\n", "def copy_images(df, directory):\n", " destination_directory = os.path.join(os.path.sep, master_path, 'crossval', directory)\n", " print(\"copying {} files to {}...\".format(directory, destination_directory))\n", "\n", " if os.path.exists(destination_directory):\n", " shutil.rmtree(destination_directory)\n", "\n", " if not os.path.exists(destination_directory):\n", " os.makedirs(destination_directory)\n", "\n", " for c in set(list(df['class'])):\n", " if not os.path.exists(os.path.join(os.path.sep, destination_directory, c)):\n", " os.makedirs(os.path.join(os.path.sep, destination_directory, c))\n", "\n", " for i, row in df.iterrows():\n", " try:\n", " path_from = row['filename']\n", " path_to = os.path.join(os.path.sep, destination_directory, row['class'])\n", "\n", " shutil.copy(path_from, path_to)\n", " except Exception as e:\n", " print(\"Error when copying {}: {}\".format(row['filename'], str(e)))\n", "\n", "#################################################################\n", "################################################################# \n", " \n", "def preprocess_input_vgg16(x):\n", " from keras.applications.vgg16 import preprocess_input\n", " X = np.expand_dims(x, axis=0)\n", " X = preprocess_input(X)\n", " return X[0]\n", "\n", "#################################################################\n", "#################################################################\n", "\n", "def preprocess_input_inception_v3(x):\n", " from keras.applications.inception_v3 import preprocess_input\n", " X = np.expand_dims(x, axis=0)\n", " X = preprocess_input(X)\n", " return X[0]\n", "\n", "#################################################################\n", "#################################################################\n", "\n", "def preprocess_input_xception(x):\n", " from keras.applications.xception import preprocess_input\n", " X = np.expand_dims(x, axis=0)\n", " X = preprocess_input(X)\n", " return X[0]\n", "\n", "#################################################################\n", "#################################################################\n", "\n", "def preprocess_input_resnet50(x):\n", " from keras.applications.resnet50 import preprocess_input\n", " X = np.expand_dims(x, axis=0)\n", " X = preprocess_input(X)\n", " return X[0]\n", "\n", "#################################################################\n", "#################################################################\n", "\n", "class CheckLr(Callback):\n", " def on_epoch_end(self, epoch, logs=None):\n", " lr = self.model.optimizer.lr\n", " decay = self.model.optimizer.decay\n", " iterations = self.model.optimizer.iterations\n", " lr_with_decay = lr / (1. + decay * K.cast(iterations, K.dtype(decay)))\n", " print(K.eval(lr_with_decay))\n", "\n", "#################################################################\n", "################################################################# \n", " \n", "def step_decay(epoch):\n", " initial_lrate = 0.1\n", " drop = 0.5\n", " epochs_drop = 10.0\n", " lrate = initial_lrate * math.pow(drop, math.floor((1+epoch)/epochs_drop))\n", " return lrate\n", "\n", "#################################################################\n", "#################################################################\n", "\n", "def build_on_bottleneck(which_net):\n", " \n", " if which_net == 'vgg16':\n", " base_model = VGG16(weights='imagenet')\n", " elif which_net == 'resnet50':\n", " base_model = ResNet50(weights='imagenet')\n", " elif which_net == 'xception':\n", " base_model = Xception(weights='imagenet', include_top=False)\n", " elif which_net == 'inception_v3':\n", " base_model = InceptionV3(weights='imagenet', include_top=False)\n", " \n", " if which_net not in ['inception_v3', 'xception']:\n", " j = [i for i, layer in enumerate(base_model.layers) if 'flatten' in layer.name][-1]\n", " \n", " x = base_model.layers[j].output\n", " x = BatchNormalization()(x)\n", " x = Dense(400, activation='relu')(x)\n", " x = BatchNormalization()(x)\n", " x = Dropout(0.5)(x)\n", " x = Dense(200, activation='relu')(x)\n", " x = BatchNormalization()(x)\n", " x = Dropout(0.5)(x)\n", " x = Dense(100, activation='relu')(x)\n", " x = Dense(10, activation='softmax')(x)\n", " \n", " model = Model(input=base_model.input, output=x)\n", " for i, layer in enumerate(model.layers):\n", " if i <= j: layer.trainable = False\n", " else:\n", " x = base_model.output\n", " x = GlobalAveragePooling2D()(x)\n", " x = BatchNormalization()(x)\n", " x = Dense(400, activation='relu')(x)\n", " x = BatchNormalization()(x)\n", " x = Dropout(0.5)(x)\n", " x = Dense(200, activation='relu')(x)\n", " x = BatchNormalization()(x)\n", " x = Dropout(0.5)(x)\n", " x = Dense(100, activation='relu')(x)\n", " x = Dense(10, activation='softmax')(x)\n", " \n", " model = Model(input=base_model.input, output=x)\n", " for layer in base_model.layers:\n", " layer.trainable = False\n", " \n", " model.compile(optimizer='adam', loss=losses.categorical_crossentropy, metrics=['accuracy'])\n", " \n", " filepath = os.path.join(os.path.sep, master_path, which_net + \"BottleneckWeights.best.hdf5\")\n", " checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')\n", " callbacks_list = [checkpoint]\n", " \n", " return model, callbacks_list\n", "\n", "#################################################################\n", "#################################################################\n", "\n", "def fine_tune(which_net, freeze_up_to):\n", " \n", " if which_net == 'vgg16':\n", " base_model = VGG16(weights='imagenet')\n", " elif which_net == 'resnet50':\n", " base_model = ResNet50(weights='imagenet')\n", " elif which_net == 'xception':\n", " base_model = Xception(weights='imagenet', include_top=False)\n", " elif which_net == 'inception_v3':\n", " base_model = InceptionV3(weights='imagenet', include_top=False)\n", " \n", " if which_net not in ['inception_v3', 'xception']:\n", " j = [i for i, layer in enumerate(base_model.layers) if 'flatten' in layer.name][-1]\n", " \n", " x = base_model.layers[j].output\n", " x = BatchNormalization()(x)\n", " x = Dense(400, activation='relu')(x)\n", " x = BatchNormalization()(x)\n", " x = Dropout(0.5)(x)\n", " x = Dense(200, activation='relu')(x)\n", " x = BatchNormalization()(x)\n", " x = Dropout(0.5)(x)\n", " x = Dense(100, activation='relu')(x)\n", " x = Dense(10, activation='softmax')(x)\n", " \n", " model = Model(input=base_model.input, output=x)\n", " \n", " else:\n", " x = base_model.output\n", " x = GlobalAveragePooling2D()(x)\n", " x = BatchNormalization()(x)\n", " x = Dense(400, activation='relu')(x)\n", " x = BatchNormalization()(x)\n", " x = Dropout(0.5)(x)\n", " x = Dense(200, activation='relu')(x)\n", " x = BatchNormalization()(x)\n", " x = Dropout(0.5)(x)\n", " x = Dense(100, activation='relu')(x)\n", " x = Dense(10, activation='softmax')(x)\n", " \n", " model = Model(input=base_model.input, output=x)\n", " \n", " model.load_weights(os.path.join(os.path.sep, master_path, which_net + \"BottleneckWeights.best.hdf5\"))\n", " \n", " for layer in model.layers[:freeze_up_to]:\n", " layer.trainable = False\n", " for layer in model.layers[freeze_up_to:]:\n", " layer.trainable = True\n", " \n", " filepath = os.path.join(os.path.sep, master_path, which_net + \"FineTuneWeights.best.hdf5\")\n", " checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max')\n", " callbacks_list = [checkpoint]\n", " \n", " return model, callbacks_list \n", "\n", "#################################################################\n", "#################################################################\n", "\n", "def save_bottleneck_features(batch_size, which_net):\n", " \n", " if which_net == 'vgg16': \n", " model = VGG16(weights='imagenet', include_top=False)\n", " target_size = [224, 224]\n", " preprocessing_function=preprocess_input_vgg16\n", " elif which_net == 'resnet50': \n", " model = ResNet50(weights='imagenet', include_top=False)\n", " target_size = [224, 224]\n", " preprocessing_function=preprocess_input_resnet50\n", " elif which_net == 'inception_v3':\n", " model = InceptionV3(weights='imagenet', include_top=False)\n", " target_size = [299, 299]\n", " preprocessing_function=preprocess_input_inception_v3\n", " \n", " \n", " datagen = ImageDataGenerator(preprocessing_function=preprocessing_function)\n", "\n", " generator = datagen.flow_from_directory(os.path.join(os.path.sep, master_path, 'crossval', 'training'),\n", " target_size=target_size,\n", " batch_size=batch_size,\n", " class_mode=None,\n", " shuffle=False)\n", " bottleneck_features_train = model.predict_generator(generator, nb_train_samples // batch_size)\n", " np.save(os.path.join(os.sep, master_path, which_net+'bottleneck_features_train.npy'), \n", " bottleneck_features_train)\n", "\n", " generator = datagen.flow_from_directory(os.path.join(os.path.sep, master_path, 'crossval', 'validation'),\n", " target_size=target_size,\n", " batch_size=batch_size,\n", " class_mode=None,\n", " shuffle=False)\n", " bottleneck_features_validation = model.predict_generator(generator, nb_validation_samples // batch_size)\n", " np.save(os.path.join(os.sep, master_path, which_net+'bottleneck_features_val.npy'), \n", " bottleneck_features_validation)\n", " \n", " return bottleneck_features_train, bottleneck_features_validation\n", "\n", "#################################################################\n", "################################################################# \n", " \n", "def define_generators(batch_size, which_net):\n", " \n", " if which_net == 'vgg16': \n", " target_size = [224, 224]\n", " preprocessing_function=preprocess_input_vgg16\n", " elif which_net == 'resnet50': \n", " target_size = [224, 224]\n", " preprocessing_function=preprocess_input_resnet50\n", " elif which_net == 'inception_v3': \n", " target_size = [299, 299]\n", " preprocessing_function=preprocess_input_inception_v3\n", " elif which_net == 'xception': \n", " target_size = [299, 299]\n", " preprocessing_function=preprocess_input_xception\n", " \n", " train_datagen = ImageDataGenerator(preprocessing_function=preprocessing_function,\n", " rotation_range=15,\n", " width_shift_range=0.2,\n", " height_shift_range=0.2,\n", " shear_range=0.2,\n", " zoom_range=0.2,\n", " horizontal_flip=True,\n", " fill_mode='nearest')\n", "\n", " train_generator = train_datagen.flow_from_directory(directory=os.path.join(os.path.sep, master_path, 'crossval', 'training'),\n", " target_size=target_size,\n", " batch_size=batch_size,\n", " class_mode='categorical')\n", "\n", " validation_datagen = ImageDataGenerator(preprocessing_function=preprocessing_function)\n", " \n", " validation_generator = validation_datagen.flow_from_directory(directory=os.path.join(os.path.sep, master_path, 'crossval', 'validation'),\n", " target_size=target_size,\n", " batch_size=batch_size,\n", " class_mode='categorical')\n", " return train_generator, validation_generator\n", "\n", "#################################################################\n", "################################################################# \n", "\n", "def get_unshuffled_labels(X, class_indices):\n", " s = X.str.split(os.sep).str[-2]\n", " t1 = s.groupby(s).size().to_dict()\n", " for i, k in enumerate(class_indices.keys()):\n", " t1[i] = t1.pop(k)\n", "\n", " t2 = [y for x in [[k] * v for k, v in t1.items()] for y in x]\n", " return t2\n", "\n", "#################################################################\n", "################################################################# \n", "\n", "def reshape_and_concat_features(features):\n", " reshaped_ = []\n", " for f in features:\n", " a, b, c, d = f.shape\n", " new_f = f.reshape((a, b*c*d))\n", " reshaped_.append(new_f)\n", " \n", " return np.hstack(reshaped_)\n", "\n", "#################################################################\n", "################################################################# \n", "\n", "def rfccv(n_estimators, min_samples_split, max_features):\n", " clf = RandomForestClassifier(n_estimators=int(n_estimators),\n", " min_samples_split=int(min_samples_split),\n", " max_features=min(max_features, 0.999),\n", " random_state=2).fit(bft_shrink, y_t_unshuf)\n", " return clf.score(bfv_shrink, y_v_unshuf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "** Center Cropping the training data **\n", "\n", "Test images are 512 x 512 pictures which were center cropped from the originals.\n", "\n", "We apply the same process to all our training set." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": true }, "outputs": [], "source": [ "list_paths = []\n", "for subdir, dirs, files in os.walk(master_path + os.sep + \"data\"):\n", " for file in files:\n", " filepath = subdir + os.sep + file\n", " list_paths.append(filepath)\n", "\n", "list_classes = list(set([os.path.dirname(filepath).split(os.sep)[-1] for filepath in list_paths if \"train\" in filepath]))\n", "\n", "dest_dir = os.path.join(os.path.sep, master_path, 'resized')\n", "\n", "for c in list_classes:\n", " if not os.path.exists(os.path.join(os.path.sep, dest_dir, c)):\n", " os.makedirs(os.path.join(os.path.sep, dest_dir, c))\n", " \n", "for i, row in data.iterrows():\n", " frompath = row['filename']\n", " topath = os.path.join(os.path.sep, dest_dir, row['class'], row['filename'].split(os.sep)[-1]).replace('tif', 'jpg')\n", " read_crop_save(frompath, topath)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "** Loading images' paths and labels into a pandas dataframe **\n", "\n", "This simplifies the way we handle the split between train and validation set." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(2750, 2)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
classfilename
0Samsung-Galaxy-Note3/home/paperspace/IEEE/resized/Samsung-Galaxy-N...
1Samsung-Galaxy-Note3/home/paperspace/IEEE/resized/Samsung-Galaxy-N...
2Samsung-Galaxy-Note3/home/paperspace/IEEE/resized/Samsung-Galaxy-N...
3Samsung-Galaxy-Note3/home/paperspace/IEEE/resized/Samsung-Galaxy-N...
4Samsung-Galaxy-Note3/home/paperspace/IEEE/resized/Samsung-Galaxy-N...
\n", "
" ], "text/plain": [ " class filename\n", "0 Samsung-Galaxy-Note3 /home/paperspace/IEEE/resized/Samsung-Galaxy-N...\n", "1 Samsung-Galaxy-Note3 /home/paperspace/IEEE/resized/Samsung-Galaxy-N...\n", "2 Samsung-Galaxy-Note3 /home/paperspace/IEEE/resized/Samsung-Galaxy-N...\n", "3 Samsung-Galaxy-Note3 /home/paperspace/IEEE/resized/Samsung-Galaxy-N...\n", "4 Samsung-Galaxy-Note3 /home/paperspace/IEEE/resized/Samsung-Galaxy-N..." ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list_paths = []\n", "for subdir, dirs, files in os.walk(master_path + os.sep + \"resized\"):\n", " for file in files:\n", " filepath = subdir + os.sep + file\n", " list_paths.append(filepath)\n", " \n", "list_train = [filepath for filepath in list_paths if \"resized\" in filepath and 'ipynb' not in filepath]\n", "\n", "labels = [os.path.dirname(filepath).split(os.sep)[-1] for filepath in list_train]\n", "data = pd.DataFrame({'filename': list_train, 'class': labels})\n", "\n", "print(data.shape)\n", "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "** Splitting dataset into Train and Validation **\n", "\n", "We fix them now and don't change anymore, i.e. we train and validate always on the same images. A better option consists in applying a cross validated approach, which is of course more expensive, especially in a Deep Learning environment. In our specific case, the dataset is so small that we could probably afford it. For the sake of fast experimenting we decide to go for a fixed split instead." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(2062,) (688,)\n", "copying training files to /home/paperspace/IEEE/crossval/training...\n", "copying validation files to /home/paperspace/IEEE/crossval/validation...\n" ] } ], "source": [ "X_train, X_val, y_train, y_val = train_test_split(data['filename'], data['class'], test_size=0.25, random_state=42)\n", "\n", "print(X_train.shape, X_val.shape)\n", "\n", "train = pd.concat([X_train, y_train], axis=1)\n", "validation = pd.concat([X_val, y_val], axis = 1)\n", "\n", "copy_images(train, 'training')\n", "copy_images(validation, 'validation')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The code in the below cell is what you would use to perform cross validation when dealing with images (just comment the *break* at the end). It basically consists in defining a KFold and overwriting in each iteration the contents of the train/validation folders where Keras would go and fetch pictures during training. Every time a new split is defined, the network learns from a new set of images and performance is assessed on the rest. CV accuracy is the average of validation scores." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train Shape: (1830, 2)\n", "Validation Shape: (920, 2)\n", "copying training files to /home/paperspace/IEEE/crossval/training...\n", "copying validation files to /home/paperspace/IEEE/crossval/validation...\n" ] } ], "source": [ "df_y = data['class']\n", "df_x = data['filename']\n", "\n", "skf = StratifiedKFold(n_splits = 3)\n", "\n", "for i, (train_index, test_index) in enumerate(skf.split(df_x, df_y)):\n", " x_train, x_val = df_x.iloc[train_index], df_x.iloc[test_index]\n", " y_train, y_val = df_y.iloc[train_index], df_y.iloc[test_index]\n", "\n", " train = pd.concat([x_train, y_train], axis=1)\n", " validation = pd.concat([x_val, y_val], axis = 1)\n", " print('Train Shape:', train.shape)\n", " print('Validation Shape:', validation.shape)\n", " \n", " # copy the images according to the fold\n", " copy_images(train, 'training')\n", " copy_images(validation, 'validation')\n", " \n", " break" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "** Checking if the image augmented generators work as expected **" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found 2062 images belonging to 10 classes.\n", "Found 688 images belonging to 10 classes.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "t, v = define_generators(64, 'xception')\n", "plt.imshow(next(t)[0][3])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "** and here the classes we need to predict... **" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'HTC-1-M7': 0,\n", " 'LG-Nexus-5x': 1,\n", " 'Motorola-Droid-Maxx': 2,\n", " 'Motorola-Nexus-6': 3,\n", " 'Motorola-X': 4,\n", " 'Samsung-Galaxy-Note3': 5,\n", " 'Samsung-Galaxy-S4': 6,\n", " 'Sony-NEX-7': 7,\n", " 'iPhone-4s': 8,\n", " 'iPhone-6': 9}" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t.class_indices" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Use pre-trained networks as feature extractors, train a Random Forest classifier on top of them and take advantage of Bayesian Optimization to tune hyperparameters: only ~30% accuracy\n" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found 2062 images belonging to 10 classes.\n", "Found 688 images belonging to 10 classes.\n", "(2062, 7, 7, 512)\n", "(688, 7, 7, 512)\n" ] }, { "data": { "text/plain": [ "(2062, 25088)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nb_train_samples = X_train.shape[0]\n", "nb_validation_samples = X_val.shape[0]\n", "\n", "bft_vgg16, bfv_vgg16 = save_bottleneck_features(1, 'vgg16')\n", "\n", "print(bft_vgg16.shape)\n", "print(bfv_vgg16.shape)\n", "\n", "a, b, c, d = bft_vgg16.shape\n", "bft_vgg16.reshape((a, b*c*d)).shape" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found 2062 images belonging to 10 classes.\n", "Found 688 images belonging to 10 classes.\n", "(2062, 1, 1, 2048)\n", "(688, 1, 1, 2048)\n" ] }, { "data": { "text/plain": [ "(2062, 2048)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bft_resnet50, bfv_resnet50 = save_bottleneck_features(1, 'resnet50')\n", "\n", "print(bft_resnet50.shape)\n", "print(bfv_resnet50.shape)\n", "\n", "a, b, c, d = bft_resnet50.shape\n", "bft_resnet50.reshape((a, b*c*d)).shape" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found 2062 images belonging to 10 classes.\n", "Found 688 images belonging to 10 classes.\n", "(2062, 8, 8, 2048)\n", "(688, 8, 8, 2048)\n" ] }, { "data": { "text/plain": [ "(2062, 131072)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bft_inception_v3, bfv_inception_v3 = save_bottleneck_features(1, 'inception_v3')\n", "\n", "print(bft_inception_v3.shape)\n", "print(bfv_inception_v3.shape)\n", "\n", "a, b, c, d = bft_inception_v3.shape\n", "bft_inception_v3.reshape((a, b*c*d)).shape" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2062 688\n" ] } ], "source": [ "y_t_unshuf = get_unshuffled_labels(X_train, t.class_indices)\n", "y_v_unshuf = get_unshuffled_labels(X_val, t.class_indices)\n", "\n", "print(len(y_t_unshuf), len(y_v_unshuf))" ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2062, 158208)" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bft = reshape_and_concat_features([bft_vgg16, bft_resnet50, bft_inception_v3])\n", "\n", "bft.shape" ] }, { "cell_type": "code", "execution_count": 128, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2062, 1000)" ] }, "execution_count": 128, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pca = PCA(n_components=1000)\n", "bft_shrink = pca.fit_transform(bft)\n", "\n", "bft_shrink.shape" ] }, { "cell_type": "code", "execution_count": 133, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(688, 158208) (688, 1000)\n" ] } ], "source": [ "bfv = reshape_and_concat_features([bfv_vgg16, bfv_resnet50, bfv_inception_v3])\n", "\n", "bfv_shrink = pca.transform(bfv)\n", "\n", "print(bfv.shape, bfv_shrink.shape)" ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.17877906976744187" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rf = RandomForestClassifier()\n", "rf.fit(bft_shrink, y_t_unshuf)\n", "rf.score(bfv_shrink, y_v_unshuf)" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.99709020368574197" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rf.score(bft_shrink, y_t_unshuf)" ] }, { "cell_type": "code", "execution_count": 140, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[31mInitialization\u001b[0m\n", "\u001b[94m-------------------------------------------------------------------------------------\u001b[0m\n", " Step | Time | Value | max_features | min_samples_split | n_estimators | \n", " 1 | 00m51s | \u001b[35m 0.27180\u001b[0m | \u001b[32m 0.9713\u001b[0m | \u001b[32m 2.7241\u001b[0m | \u001b[32m 27.9527\u001b[0m | \n", " 2 | 02m18s | \u001b[35m 0.30087\u001b[0m | \u001b[32m 0.9068\u001b[0m | \u001b[32m 14.4502\u001b[0m | \u001b[32m 90.6709\u001b[0m | \n", " 3 | 02m54s | 0.29215 | 0.7443 | 5.5636 | 134.1986 | \n", " 4 | 13m36s | \u001b[35m 0.30233\u001b[0m | \u001b[32m 0.9768\u001b[0m | \u001b[32m 2.4425\u001b[0m | \u001b[32m 416.6764\u001b[0m | \n", " 5 | 03m04s | \u001b[35m 0.32703\u001b[0m | \u001b[32m 0.3015\u001b[0m | \u001b[32m 5.2045\u001b[0m | \u001b[32m 274.9507\u001b[0m | \n", "\u001b[31mBayesian Optimization\u001b[0m\n", "\u001b[94m-------------------------------------------------------------------------------------\u001b[0m\n", " Step | Time | Value | max_features | min_samples_split | n_estimators | \n", " 6 | 05m48s | \u001b[35m 0.33140\u001b[0m | \u001b[32m 0.1000\u001b[0m | \u001b[32m 25.0000\u001b[0m | \u001b[32m 1000.0000\u001b[0m | \n", " 7 | 17m12s | 0.31541 | 0.4669 | 24.9657 | 781.5017 | \n", " 8 | 02m28s | 0.32703 | 0.1735 | 24.9600 | 311.1939 | \n", " 9 | 21m01s | 0.32122 | 0.5309 | 2.0185 | 914.4627 | \n", " 10 | 09m11s | 0.32703 | 0.3018 | 2.1002 | 999.8172 | \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\pochetti\\WorkDocs\\Anaconda3\\lib\\site-packages\\sklearn\\gaussian_process\\gpr.py:427: UserWarning: fmin_l_bfgs_b terminated abnormally with the state: {'grad': array([ -1.06767989e-05]), 'task': b'ABNORMAL_TERMINATION_IN_LNSRCH', 'funcalls': 51, 'nit': 5, 'warnflag': 2}\n", " \" state: %s\" % convergence_dict)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 11 | 19m30s | 0.30669 | 0.7625 | 24.8365 | 998.4711 | \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\pochetti\\WorkDocs\\Anaconda3\\lib\\site-packages\\sklearn\\gaussian_process\\gpr.py:427: UserWarning: fmin_l_bfgs_b terminated abnormally with the state: {'grad': array([ -1.36646559e-05]), 'task': b'ABNORMAL_TERMINATION_IN_LNSRCH', 'funcalls': 48, 'nit': 4, 'warnflag': 2}\n", " \" state: %s\" % convergence_dict)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 12 | 03m44s | \u001b[35m 0.35320\u001b[0m | \u001b[32m 0.1492\u001b[0m | \u001b[32m 2.0491\u001b[0m | \u001b[32m 670.4516\u001b[0m | \n", " 13 | 02m56s | 0.33576 | 0.1664 | 24.9791 | 599.5480 | \n", " 14 | 04m38s | 0.33140 | 0.2317 | 2.0789 | 618.6007 | \n", " 15 | 05m08s | 0.32703 | 0.2764 | 24.8676 | 678.6992 | \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\pochetti\\WorkDocs\\Anaconda3\\lib\\site-packages\\sklearn\\gaussian_process\\gpr.py:427: UserWarning: fmin_l_bfgs_b terminated abnormally with the state: {'grad': array([ 0.00010058]), 'task': b'ABNORMAL_TERMINATION_IN_LNSRCH', 'funcalls': 53, 'nit': 7, 'warnflag': 2}\n", " \" state: %s\" % convergence_dict)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 16 | 02m26s | 0.31250 | 0.3952 | 24.9034 | 218.4993 | \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\pochetti\\WorkDocs\\Anaconda3\\lib\\site-packages\\sklearn\\gaussian_process\\gpr.py:427: UserWarning: fmin_l_bfgs_b terminated abnormally with the state: {'grad': array([ 2.83566833e-05]), 'task': b'ABNORMAL_TERMINATION_IN_LNSRCH', 'funcalls': 52, 'nit': 5, 'warnflag': 2}\n", " \" state: %s\" % convergence_dict)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 17 | 03m52s | \u001b[35m 0.35610\u001b[0m | \u001b[32m 0.1439\u001b[0m | \u001b[32m 2.0073\u001b[0m | \u001b[32m 751.9634\u001b[0m | \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\pochetti\\WorkDocs\\Anaconda3\\lib\\site-packages\\sklearn\\gaussian_process\\gpr.py:427: UserWarning: fmin_l_bfgs_b terminated abnormally with the state: {'grad': array([ -3.13805358e-05]), 'task': b'ABNORMAL_TERMINATION_IN_LNSRCH', 'funcalls': 53, 'nit': 6, 'warnflag': 2}\n", " \" state: %s\" % convergence_dict)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 18 | 05m10s | 0.35465 | 0.1843 | 2.1071 | 808.8887 | \n", " 19 | 02m19s | 0.33430 | 0.1626 | 24.9712 | 507.5198 | \n", " 20 | 03m44s | 0.34012 | 0.1464 | 2.0558 | 714.7820 | \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\pochetti\\WorkDocs\\Anaconda3\\lib\\site-packages\\sklearn\\gaussian_process\\gpr.py:427: UserWarning: fmin_l_bfgs_b terminated abnormally with the state: {'grad': array([ -3.80673168e-05]), 'task': b'ABNORMAL_TERMINATION_IN_LNSRCH', 'funcalls': 52, 'nit': 5, 'warnflag': 2}\n", " \" state: %s\" % convergence_dict)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 21 | 03m03s | 0.35465 | 0.1085 | 2.0974 | 783.5423 | \n", " 22 | 06m29s | 0.33430 | 0.2353 | 2.0131 | 835.2332 | \n", " 23 | 11m00s | 0.33430 | 0.2817 | 2.1267 | 779.8945 | \n", " 24 | 05m22s | 0.34012 | 0.1314 | 2.0241 | 758.1813 | \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\pochetti\\WorkDocs\\Anaconda3\\lib\\site-packages\\sklearn\\gaussian_process\\gpr.py:427: UserWarning: fmin_l_bfgs_b terminated abnormally with the state: {'grad': array([ -2.26457790e-05]), 'task': b'ABNORMAL_TERMINATION_IN_LNSRCH', 'funcalls': 51, 'nit': 6, 'warnflag': 2}\n", " \" state: %s\" % convergence_dict)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 25 | 06m35s | 0.34738 | 0.1057 | 2.0944 | 682.2377 | \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\pochetti\\WorkDocs\\Anaconda3\\lib\\site-packages\\sklearn\\gaussian_process\\gpr.py:427: UserWarning: fmin_l_bfgs_b terminated abnormally with the state: {'grad': array([ 2.45781266e-05]), 'task': b'ABNORMAL_TERMINATION_IN_LNSRCH', 'funcalls': 47, 'nit': 5, 'warnflag': 2}\n", " \" state: %s\" % convergence_dict)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 26 | 03m17s | 0.34302 | 0.1298 | 2.2535 | 678.3015 | \n", " 27 | 03m16s | 0.35174 | 0.1204 | 2.0285 | 794.0485 | \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\pochetti\\WorkDocs\\Anaconda3\\lib\\site-packages\\sklearn\\gaussian_process\\gpr.py:427: UserWarning: fmin_l_bfgs_b terminated abnormally with the state: {'grad': array([-0.00028527]), 'task': b'ABNORMAL_TERMINATION_IN_LNSRCH', 'funcalls': 54, 'nit': 5, 'warnflag': 2}\n", " \" state: %s\" % convergence_dict)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 28 | 04m00s | 0.34738 | 0.1402 | 2.2040 | 789.7084 | \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\pochetti\\WorkDocs\\Anaconda3\\lib\\site-packages\\sklearn\\gaussian_process\\gpr.py:427: UserWarning: fmin_l_bfgs_b terminated abnormally with the state: {'grad': array([ -3.50420048e-05]), 'task': b'ABNORMAL_TERMINATION_IN_LNSRCH', 'funcalls': 54, 'nit': 4, 'warnflag': 2}\n", " \" state: %s\" % convergence_dict)\n", "C:\\Users\\pochetti\\WorkDocs\\Anaconda3\\lib\\site-packages\\sklearn\\gaussian_process\\gpr.py:427: UserWarning: fmin_l_bfgs_b terminated abnormally with the state: {'grad': array([ 5.91054777e-05]), 'task': b'ABNORMAL_TERMINATION_IN_LNSRCH', 'funcalls': 53, 'nit': 8, 'warnflag': 2}\n", " \" state: %s\" % convergence_dict)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 29 | 04m34s | 0.34302 | 0.1651 | 2.0146 | 794.8547 | \n", " 30 | 03m02s | 0.34157 | 0.1129 | 2.0489 | 784.7359 | \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\pochetti\\WorkDocs\\Anaconda3\\lib\\site-packages\\sklearn\\gaussian_process\\gpr.py:427: UserWarning: fmin_l_bfgs_b terminated abnormally with the state: {'grad': array([ 3.57400572e-05]), 'task': b'ABNORMAL_TERMINATION_IN_LNSRCH', 'funcalls': 50, 'nit': 3, 'warnflag': 2}\n", " \" state: %s\" % convergence_dict)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "-----------------------------------------------------\n", "Final Results\n", "RFC: 0.356105\n" ] } ], "source": [ "gp_params = {\"alpha\": 1e-5}\n", "\n", "rfcBO = BayesianOptimization(\n", " rfccv,\n", " {'n_estimators': (10, 1000),\n", " 'min_samples_split': (2, 25),\n", " 'max_features': (0.1, 0.999)}\n", ")\n", "\n", "rfcBO.maximize(n_iter=25, **gp_params)\n", "print('-' * 53)\n", "print('Final Results')\n", "print('RFC: %f' % rfcBO.res['max']['max_val'])" ] }, { "cell_type": "code", "execution_count": 146, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'max_params': {'max_features': 0.14387961696996915,\n", " 'min_samples_split': 2.0072803719512726,\n", " 'n_estimators': 751.96343403263938},\n", " 'max_val': 0.35610465116279072}" ] }, "execution_count": 146, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rfcBO.res['max']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fine tune a pre-trained Xception network: only ~50% accuracy" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/paperspace/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:143: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor(\"in..., outputs=Tensor(\"de...)`\n" ] } ], "source": [ "xception_b, callbacks_xception_b = build_on_bottleneck('xception')" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found 2062 images belonging to 10 classes.\n", "Found 688 images belonging to 10 classes.\n", "Epoch 1/15\n", "Epoch 00000: val_acc improved from -inf to 0.20312, saving model to /home/paperspace/IEEE/xceptionBottleneckWeights.best.hdf5\n", "84s - loss: 2.7374 - acc: 0.1274 - val_loss: 2.2158 - val_acc: 0.2031\n", "Epoch 2/15\n", "Epoch 00001: val_acc improved from 0.20312 to 0.23237, saving model to /home/paperspace/IEEE/xceptionBottleneckWeights.best.hdf5\n", "54s - loss: 2.2249 - acc: 0.2271 - val_loss: 2.1488 - val_acc: 0.2324\n", "Epoch 3/15\n", "Epoch 00002: val_acc did not improve\n", "54s - loss: 2.0715 - acc: 0.2809 - val_loss: 2.1048 - val_acc: 0.2308\n", "Epoch 4/15\n", "Epoch 00003: val_acc improved from 0.23237 to 0.26923, saving model to /home/paperspace/IEEE/xceptionBottleneckWeights.best.hdf5\n", "55s - loss: 1.9897 - acc: 0.3000 - val_loss: 2.0065 - val_acc: 0.2692\n", "Epoch 5/15\n", "Epoch 00004: val_acc improved from 0.26923 to 0.28045, saving model to /home/paperspace/IEEE/xceptionBottleneckWeights.best.hdf5\n", "54s - loss: 1.8635 - acc: 0.3307 - val_loss: 1.9365 - val_acc: 0.2804\n", "Epoch 6/15\n", "Epoch 00005: val_acc improved from 0.28045 to 0.30929, saving model to /home/paperspace/IEEE/xceptionBottleneckWeights.best.hdf5\n", "55s - loss: 1.8139 - acc: 0.3547 - val_loss: 1.8747 - val_acc: 0.3093\n", "Epoch 7/15\n", "Epoch 00006: val_acc improved from 0.30929 to 0.37019, saving model to /home/paperspace/IEEE/xceptionBottleneckWeights.best.hdf5\n", "54s - loss: 1.7522 - acc: 0.3798 - val_loss: 1.7540 - val_acc: 0.3702\n", "Epoch 8/15\n", "Epoch 00007: val_acc improved from 0.37019 to 0.40865, saving model to /home/paperspace/IEEE/xceptionBottleneckWeights.best.hdf5\n", "54s - loss: 1.7149 - acc: 0.3979 - val_loss: 1.6786 - val_acc: 0.4087\n", "Epoch 9/15\n", "Epoch 00008: val_acc did not improve\n", "53s - loss: 1.6528 - acc: 0.4226 - val_loss: 1.6411 - val_acc: 0.4087\n", "Epoch 10/15\n", "Epoch 00009: val_acc did not improve\n", "54s - loss: 1.6016 - acc: 0.4333 - val_loss: 1.6126 - val_acc: 0.4054\n", "Epoch 11/15\n", "Epoch 00010: val_acc improved from 0.40865 to 0.44231, saving model to /home/paperspace/IEEE/xceptionBottleneckWeights.best.hdf5\n", "55s - loss: 1.5632 - acc: 0.4512 - val_loss: 1.5886 - val_acc: 0.4423\n", "Epoch 12/15\n", "Epoch 00011: val_acc did not improve\n", "54s - loss: 1.5222 - acc: 0.4593 - val_loss: 1.5840 - val_acc: 0.4343\n", "Epoch 13/15\n", "Epoch 00012: val_acc improved from 0.44231 to 0.45192, saving model to /home/paperspace/IEEE/xceptionBottleneckWeights.best.hdf5\n", "54s - loss: 1.4413 - acc: 0.4802 - val_loss: 1.5774 - val_acc: 0.4519\n", "Epoch 14/15\n", "Epoch 00013: val_acc improved from 0.45192 to 0.50481, saving model to /home/paperspace/IEEE/xceptionBottleneckWeights.best.hdf5\n", "54s - loss: 1.4811 - acc: 0.4802 - val_loss: 1.5228 - val_acc: 0.5048\n", "Epoch 15/15\n", "Epoch 00014: val_acc did not improve\n", "54s - loss: 1.4350 - acc: 0.5127 - val_loss: 1.5176 - val_acc: 0.4808\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "batch_size = 64\n", "train_gen, valid_gen = define_generators(batch_size, 'xception')\n", " \n", "xception_b.fit_generator(train_gen,\n", " steps_per_epoch=X_train.shape[0]//batch_size,\n", " epochs=15,\n", " validation_data=valid_gen,\n", " verbose=2,\n", " validation_steps=X_val.shape[0]//batch_size,\n", " callbacks=callbacks_xception_b)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/paperspace/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:198: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor(\"in..., outputs=Tensor(\"de...)`\n" ] } ], "source": [ "xception_ft, callbacks_xception_ft = fine_tune('xception', 75)\n", "xception_ft.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy'])" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Found 2062 images belonging to 10 classes.\n", "Found 688 images belonging to 10 classes.\n", "Epoch 1/15\n", "Epoch 00000: val_acc improved from -inf to 0.46875, saving model to /home/paperspace/IEEE/xceptionFineTuneWeights.best.hdf5\n", "112s - loss: 1.4426 - acc: 0.4985 - val_loss: 1.5985 - val_acc: 0.4688\n", "Epoch 2/15\n", "Epoch 00001: val_acc improved from 0.46875 to 0.47917, saving model to /home/paperspace/IEEE/xceptionFineTuneWeights.best.hdf5\n", "83s - loss: 1.3930 - acc: 0.5220 - val_loss: 1.5762 - val_acc: 0.4792\n", "Epoch 3/15\n", "Epoch 00002: val_acc improved from 0.47917 to 0.48878, saving model to /home/paperspace/IEEE/xceptionFineTuneWeights.best.hdf5\n", "83s - loss: 1.4472 - acc: 0.4939 - val_loss: 1.5745 - val_acc: 0.4888\n", "Epoch 4/15\n", "Epoch 00003: val_acc did not improve\n", "83s - loss: 1.3866 - acc: 0.5154 - val_loss: 1.5896 - val_acc: 0.4672\n", "Epoch 5/15\n", "Epoch 00004: val_acc did not improve\n", "83s - loss: 1.3906 - acc: 0.5179 - val_loss: 1.5414 - val_acc: 0.4808\n", "Epoch 6/15\n", "Epoch 00005: val_acc did not improve\n", "83s - loss: 1.3772 - acc: 0.5100 - val_loss: 1.5437 - val_acc: 0.4776\n", "Epoch 7/15\n", "Epoch 00006: val_acc did not improve\n", "82s - loss: 1.3586 - acc: 0.5279 - val_loss: 1.5480 - val_acc: 0.4872\n", "Epoch 8/15\n", "Epoch 00007: val_acc did not improve\n", "83s - loss: 1.3693 - acc: 0.5215 - val_loss: 1.5888 - val_acc: 0.4471\n", "Epoch 9/15\n", "Epoch 00008: val_acc did not improve\n", "83s - loss: 1.3448 - acc: 0.5303 - val_loss: 1.5436 - val_acc: 0.4840\n", "Epoch 10/15\n", "Epoch 00009: val_acc did not improve\n", "83s - loss: 1.3627 - acc: 0.5222 - val_loss: 1.5800 - val_acc: 0.4712\n", "Epoch 11/15\n", "Epoch 00010: val_acc did not improve\n", "83s - loss: 1.3119 - acc: 0.5323 - val_loss: 1.5369 - val_acc: 0.4824\n", "Epoch 12/15\n", "Epoch 00011: val_acc did not improve\n", "83s - loss: 1.3698 - acc: 0.5269 - val_loss: 1.5392 - val_acc: 0.4792\n", "Epoch 13/15\n", "Epoch 00012: val_acc did not improve\n", "82s - loss: 1.3219 - acc: 0.5418 - val_loss: 1.5976 - val_acc: 0.4519\n", "Epoch 14/15\n", "Epoch 00013: val_acc improved from 0.48878 to 0.49519, saving model to /home/paperspace/IEEE/xceptionFineTuneWeights.best.hdf5\n", "83s - loss: 1.2876 - acc: 0.5569 - val_loss: 1.4956 - val_acc: 0.4952\n", "Epoch 15/15\n", "Epoch 00014: val_acc did not improve\n", "84s - loss: 1.3351 - acc: 0.5276 - val_loss: 1.5366 - val_acc: 0.4781\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "batch_size = 64\n", "train_gen, valid_gen = define_generators(batch_size, 'xception')\n", "\n", "xception_ft.fit_generator(train_gen,\n", " steps_per_epoch=X_train.shape[0]//batch_size,\n", " epochs=15,\n", " validation_data=valid_gen,\n", " verbose=2,\n", " validation_steps=X_val.shape[0]//batch_size,\n", " callbacks=callbacks_xception_ft)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/3\n", "Epoch 00000: val_acc did not improve\n", "89s - loss: 1.3148 - acc: 0.5462 - val_loss: 1.5609 - val_acc: 0.4679\n", "Epoch 2/3\n", "Epoch 00001: val_acc improved from 0.49519 to 0.50481, saving model to /home/paperspace/IEEE/xceptionFineTuneWeights.best.hdf5\n", "84s - loss: 1.2939 - acc: 0.5436 - val_loss: 1.4784 - val_acc: 0.5048\n", "Epoch 3/3\n", "Epoch 00002: val_acc did not improve\n", "83s - loss: 1.2585 - acc: 0.5631 - val_loss: 1.4582 - val_acc: 0.4968\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xception_ft.compile(optimizer=SGD(lr=0.001, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy'])\n", "\n", "xception_ft.fit_generator(train_gen,\n", " steps_per_epoch=X_train.shape[0]//batch_size,\n", " epochs=3,\n", " validation_data=valid_gen,\n", " verbose=2,\n", " validation_steps=X_val.shape[0]//batch_size,\n", " callbacks=callbacks_xception_ft)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fine tune a pre-trained VGG16 network: only ~40% accuracy" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/paperspace/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:84: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor(\"in..., outputs=Tensor(\"de...)`\n" ] } ], "source": [ "vgg16_b, callbacks_vgg16_b = build_on_bottleneck('vgg16')\n", "#vgg16_b.summary()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train Shape: (1830, 2)\n", "Validation Shape: (920, 2)\n", "copying training files to /home/paperspace/IEEE/crossval/training...\n", "copying validation files to /home/paperspace/IEEE/crossval/validation...\n", "**** Running fold 0\n", "Found 1830 images belonging to 10 classes.\n", "Found 920 images belonging to 10 classes.\n", "Epoch 1/10\n", "Epoch 00000: val_acc improved from -inf to 0.20536, saving model to /home/paperspace/IEEE/vgg16BottleneckWeights.best.hdf5\n", "51s - loss: 2.7839 - acc: 0.1401 - val_loss: 4.1940 - val_acc: 0.2054\n", "Epoch 2/10\n", "Epoch 00001: val_acc improved from 0.20536 to 0.25234, saving model to /home/paperspace/IEEE/vgg16BottleneckWeights.best.hdf5\n", "40s - loss: 2.2474 - acc: 0.2324 - val_loss: 2.7579 - val_acc: 0.2523\n", "Epoch 3/10\n", "Epoch 00002: val_acc improved from 0.25234 to 0.30257, saving model to /home/paperspace/IEEE/vgg16BottleneckWeights.best.hdf5\n", "36s - loss: 2.1540 - acc: 0.2572 - val_loss: 2.1595 - val_acc: 0.3026\n", "Epoch 4/10\n", "Epoch 00003: val_acc improved from 0.30257 to 0.33178, saving model to /home/paperspace/IEEE/vgg16BottleneckWeights.best.hdf5\n", "35s - loss: 1.9397 - acc: 0.3225 - val_loss: 1.9966 - val_acc: 0.3318\n", "Epoch 5/10\n", "Epoch 00004: val_acc improved from 0.33178 to 0.35631, saving model to /home/paperspace/IEEE/vgg16BottleneckWeights.best.hdf5\n", "36s - loss: 1.9178 - acc: 0.3363 - val_loss: 1.8721 - val_acc: 0.3563\n", "Epoch 6/10\n", "Epoch 00005: val_acc did not improve\n", "35s - loss: 1.8016 - acc: 0.3716 - val_loss: 1.8356 - val_acc: 0.3481\n", "Epoch 7/10\n", "Epoch 00006: val_acc improved from 0.35631 to 0.38201, saving model to /home/paperspace/IEEE/vgg16BottleneckWeights.best.hdf5\n", "35s - loss: 1.7309 - acc: 0.3943 - val_loss: 1.7347 - val_acc: 0.3820\n", "Epoch 8/10\n", "Epoch 00007: val_acc improved from 0.38201 to 0.40654, saving model to /home/paperspace/IEEE/vgg16BottleneckWeights.best.hdf5\n", "35s - loss: 1.6630 - acc: 0.4176 - val_loss: 1.7314 - val_acc: 0.4065\n", "Epoch 9/10\n", "Epoch 00008: val_acc improved from 0.40654 to 0.40888, saving model to /home/paperspace/IEEE/vgg16BottleneckWeights.best.hdf5\n", "35s - loss: 1.5867 - acc: 0.4615 - val_loss: 1.7325 - val_acc: 0.4089\n", "Epoch 10/10\n", "Epoch 00009: val_acc did not improve\n", "34s - loss: 1.5506 - acc: 0.4592 - val_loss: 1.7085 - val_acc: 0.3995\n" ] } ], "source": [ "df_y = data['class']\n", "df_x = data['filename']\n", "batch_size = 64\n", "\n", "skf = StratifiedKFold(n_splits = 3)\n", "#total_actual = []\n", "#total_predicted = []\n", "#total_val_accuracy = []\n", "#total_val_loss = []\n", "#total_test_accuracy = []\n", "\n", "for i, (train_index, test_index) in enumerate(skf.split(df_x, df_y)):\n", " x_train, x_val = df_x.iloc[train_index], df_x.iloc[test_index]\n", " y_train, y_val = df_y.iloc[train_index], df_y.iloc[test_index]\n", "\n", " train = pd.concat([x_train, y_train], axis=1)\n", " validation = pd.concat([x_val, y_val], axis = 1)\n", " print('Train Shape:', train.shape)\n", " print('Validation Shape:', validation.shape)\n", " #print(validation.groupby(['class'])['class'].count())\n", " \n", " # copy the images according to the fold\n", " copy_images(train, 'training')\n", " copy_images(validation, 'validation')\n", "\n", " print('**** Running fold '+ str(i))\n", " \n", " train_gen, valid_gen = define_generators(batch_size, 'vgg16')\n", " \n", " vgg16_b.fit_generator(train_gen,\n", " steps_per_epoch=x_train.shape[0]//batch_size,\n", " epochs=10,\n", " validation_data=valid_gen,\n", " verbose=2,\n", " validation_steps=x_val.shape[0]//batch_size,\n", " callbacks=callbacks_vgg16_b)\n", " break" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fine tune a pre-trained ResNet50 network: playing around with learning rates, optimizers, freezing/un-freezing layers we jump to ~90% accuracy" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/paperspace/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:127: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor(\"in..., outputs=Tensor(\"de...)`\n" ] } ], "source": [ "resnet50_b, callbacks_resnet50_b = build_on_bottleneck('resnet50')\n", "#resnet50_b.summary()" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train Shape: (2060, 2)\n", "Validation Shape: (690, 2)\n", "copying training files to /home/paperspace/IEEE/crossval/training...\n", "copying validation files to /home/paperspace/IEEE/crossval/validation...\n", "**** Running fold 0\n", "Found 2060 images belonging to 10 classes.\n", "Found 690 images belonging to 10 classes.\n", "Epoch 1/10\n", "Epoch 00000: val_acc improved from -inf to 0.25312, saving model to /home/paperspace/IEEE/resnet50BottleneckWeights.best.hdf5\n", "85s - loss: 2.5937 - acc: 0.1802 - val_loss: 2.1059 - val_acc: 0.2531\n", "Epoch 2/10\n", "Epoch 00001: val_acc improved from 0.25312 to 0.36875, saving model to /home/paperspace/IEEE/resnet50BottleneckWeights.best.hdf5\n", "37s - loss: 2.0246 - acc: 0.3113 - val_loss: 1.7969 - val_acc: 0.3688\n", "Epoch 3/10\n", "Epoch 00002: val_acc improved from 0.36875 to 0.44844, saving model to /home/paperspace/IEEE/resnet50BottleneckWeights.best.hdf5\n", "39s - loss: 1.7949 - acc: 0.3825 - val_loss: 1.6114 - val_acc: 0.4484\n", "Epoch 4/10\n", "Epoch 00003: val_acc improved from 0.44844 to 0.51094, saving model to /home/paperspace/IEEE/resnet50BottleneckWeights.best.hdf5\n", "39s - loss: 1.6230 - acc: 0.4262 - val_loss: 1.5092 - val_acc: 0.5109\n", "Epoch 5/10\n", "Epoch 00004: val_acc improved from 0.51094 to 0.52656, saving model to /home/paperspace/IEEE/resnet50BottleneckWeights.best.hdf5\n", "39s - loss: 1.4828 - acc: 0.4840 - val_loss: 1.4292 - val_acc: 0.5266\n", "Epoch 6/10\n", "Epoch 00005: val_acc improved from 0.52656 to 0.53281, saving model to /home/paperspace/IEEE/resnet50BottleneckWeights.best.hdf5\n", "39s - loss: 1.3505 - acc: 0.5380 - val_loss: 1.3934 - val_acc: 0.5328\n", "Epoch 7/10\n", "Epoch 00006: val_acc improved from 0.53281 to 0.56563, saving model to /home/paperspace/IEEE/resnet50BottleneckWeights.best.hdf5\n", "39s - loss: 1.3140 - acc: 0.5524 - val_loss: 1.3456 - val_acc: 0.5656\n", "Epoch 8/10\n", "Epoch 00007: val_acc did not improve\n", "38s - loss: 1.2304 - acc: 0.5712 - val_loss: 1.3569 - val_acc: 0.5578\n", "Epoch 9/10\n", "Epoch 00008: val_acc improved from 0.56563 to 0.58750, saving model to /home/paperspace/IEEE/resnet50BottleneckWeights.best.hdf5\n", "39s - loss: 1.2275 - acc: 0.5729 - val_loss: 1.2808 - val_acc: 0.5875\n", "Epoch 10/10\n", "Epoch 00009: val_acc did not improve\n", "38s - loss: 1.0789 - acc: 0.6342 - val_loss: 1.3163 - val_acc: 0.5844\n" ] } ], "source": [ "df_y = data['class']\n", "df_x = data['filename']\n", "batch_size = 64\n", "\n", "skf = StratifiedKFold(n_splits = 4)\n", "#total_actual = []\n", "#total_predicted = []\n", "#total_val_accuracy = []\n", "#total_val_loss = []\n", "#total_test_accuracy = []\n", "\n", "for i, (train_index, test_index) in enumerate(skf.split(df_x, df_y)):\n", " x_train, x_val = df_x.iloc[train_index], df_x.iloc[test_index]\n", " y_train, y_val = df_y.iloc[train_index], df_y.iloc[test_index]\n", "\n", " train = pd.concat([x_train, y_train], axis=1)\n", " validation = pd.concat([x_val, y_val], axis = 1)\n", " print('Train Shape:', train.shape)\n", " print('Validation Shape:', validation.shape)\n", " #print(validation.groupby(['class'])['class'].count())\n", " \n", " # copy the images according to the fold\n", " copy_images(train, 'training')\n", " copy_images(validation, 'validation')\n", "\n", " print('**** Running fold '+ str(i))\n", " \n", " train_gen, valid_gen = define_generators(batch_size, 'resnet50')\n", " \n", " resnet50_b.fit_generator(train_gen,\n", " steps_per_epoch=x_train.shape[0]//batch_size,\n", " epochs=10,\n", " validation_data=valid_gen,\n", " verbose=2,\n", " validation_steps=x_val.shape[0]//batch_size,\n", " callbacks=callbacks_resnet50_b)\n", " break" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/paperspace/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:183: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor(\"in..., outputs=Tensor(\"de...)`\n" ] } ], "source": [ "resnet50_ft, callbacks_resnet50_ft = fine_tune('resnet50', 78)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true }, "outputs": [], "source": [ "resnet50_ft.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy'])" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train Shape: (2060, 2)\n", "Validation Shape: (690, 2)\n", "copying training files to /home/paperspace/IEEE/crossval/training...\n", "copying validation files to /home/paperspace/IEEE/crossval/validation...\n", "**** Running fold 0\n", "Found 2060 images belonging to 10 classes.\n", "Found 690 images belonging to 10 classes.\n", "Epoch 1/10\n", "Epoch 00000: val_acc improved from -inf to 0.72656, saving model to /home/paperspace/IEEE/resnet50FineTuneWeights.best.hdf5\n", "79s - loss: 1.2352 - acc: 0.5806 - val_loss: 0.7912 - val_acc: 0.7266\n", "Epoch 2/10\n", "Epoch 00001: val_acc did not improve\n", "47s - loss: 1.2185 - acc: 0.5782 - val_loss: 0.8044 - val_acc: 0.7250\n", "Epoch 3/10\n", "Epoch 00002: val_acc did not improve\n", "47s - loss: 1.1842 - acc: 0.5927 - val_loss: 0.8223 - val_acc: 0.7141\n", "Epoch 4/10\n", "Epoch 00003: val_acc improved from 0.72656 to 0.73438, saving model to /home/paperspace/IEEE/resnet50FineTuneWeights.best.hdf5\n", "52s - loss: 1.1990 - acc: 0.5932 - val_loss: 0.7922 - val_acc: 0.7344\n", "Epoch 5/10\n", "Epoch 00004: val_acc did not improve\n", "49s - loss: 1.1178 - acc: 0.6222 - val_loss: 0.7984 - val_acc: 0.7203\n", "Epoch 6/10\n", "Epoch 00005: val_acc did not improve\n", "52s - loss: 1.1697 - acc: 0.5977 - val_loss: 0.8075 - val_acc: 0.7250\n", "Epoch 7/10\n", "Epoch 00006: val_acc did not improve\n", "45s - loss: 1.1132 - acc: 0.6256 - val_loss: 0.7905 - val_acc: 0.7297\n", "Epoch 8/10\n", "Epoch 00007: val_acc did not improve\n", "50s - loss: 1.1118 - acc: 0.6167 - val_loss: 0.7882 - val_acc: 0.7312\n", "Epoch 9/10\n", "Epoch 00008: val_acc did not improve\n", "51s - loss: 1.1602 - acc: 0.5993 - val_loss: 0.7926 - val_acc: 0.7281\n", "Epoch 10/10\n", "Epoch 00009: val_acc improved from 0.73438 to 0.74062, saving model to /home/paperspace/IEEE/resnet50FineTuneWeights.best.hdf5\n", "51s - loss: 1.0469 - acc: 0.6355 - val_loss: 0.7832 - val_acc: 0.7406\n" ] } ], "source": [ "df_y = data['class']\n", "df_x = data['filename']\n", "batch_size = 64\n", "\n", "skf = StratifiedKFold(n_splits = 4)\n", "\n", "for i, (train_index, test_index) in enumerate(skf.split(df_x, df_y)):\n", " x_train, x_val = df_x.iloc[train_index], df_x.iloc[test_index]\n", " y_train, y_val = df_y.iloc[train_index], df_y.iloc[test_index]\n", "\n", " train = pd.concat([x_train, y_train], axis=1)\n", " validation = pd.concat([x_val, y_val], axis = 1)\n", " print('Train Shape:', train.shape)\n", " print('Validation Shape:', validation.shape)\n", " \n", " # copy the images according to the fold\n", " copy_images(train, 'training')\n", " copy_images(validation, 'validation')\n", "\n", " print('**** Running fold '+ str(i))\n", " \n", " train_gen, valid_gen = define_generators(batch_size, 'resnet50')\n", " \n", " resnet50_ft.fit_generator(train_gen,\n", " steps_per_epoch=x_train.shape[0]//batch_size,\n", " epochs=10,\n", " validation_data=valid_gen,\n", " verbose=2,\n", " validation_steps=x_val.shape[0]//batch_size,\n", " callbacks=callbacks_resnet50_ft)\n", " break" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/10\n", "Epoch 00000: val_acc improved from 0.74062 to 0.75625, saving model to /home/paperspace/IEEE/resnet50FineTuneWeights.best.hdf5\n", "59s - loss: 1.1126 - acc: 0.6264 - val_loss: 0.7633 - val_acc: 0.7562\n", "Epoch 2/10\n", "Epoch 00001: val_acc did not improve\n", "48s - loss: 1.0778 - acc: 0.6300 - val_loss: 0.7697 - val_acc: 0.7438\n", "Epoch 3/10\n", "Epoch 00002: val_acc did not improve\n", "49s - loss: 1.0699 - acc: 0.6438 - val_loss: 0.7648 - val_acc: 0.7422\n", "Epoch 4/10\n", "Epoch 00003: val_acc did not improve\n", "52s - loss: 1.0371 - acc: 0.6361 - val_loss: 0.7574 - val_acc: 0.7328\n", "Epoch 5/10\n", "Epoch 00004: val_acc did not improve\n", "46s - loss: 1.0404 - acc: 0.6343 - val_loss: 0.7702 - val_acc: 0.7391\n", "Epoch 6/10\n", "Epoch 00005: val_acc did not improve\n", "49s - loss: 1.0141 - acc: 0.6603 - val_loss: 0.7790 - val_acc: 0.7375\n", "Epoch 7/10\n", "Epoch 00006: val_acc did not improve\n", "48s - loss: 1.0205 - acc: 0.6469 - val_loss: 0.7450 - val_acc: 0.7531\n", "Epoch 8/10\n", "Epoch 00007: val_acc did not improve\n", "48s - loss: 1.0168 - acc: 0.6670 - val_loss: 0.7585 - val_acc: 0.7406\n", "Epoch 9/10\n", "Epoch 00008: val_acc did not improve\n", "52s - loss: 0.9808 - acc: 0.6643 - val_loss: 0.7611 - val_acc: 0.7438\n", "Epoch 10/10\n", "Epoch 00009: val_acc improved from 0.75625 to 0.76094, saving model to /home/paperspace/IEEE/resnet50FineTuneWeights.best.hdf5\n", "52s - loss: 0.9879 - acc: 0.6485 - val_loss: 0.7247 - val_acc: 0.7609\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "resnet50_ft.fit_generator(train_gen,\n", " steps_per_epoch=x_train.shape[0]//batch_size,\n", " epochs=10,\n", " validation_data=valid_gen,\n", " verbose=2,\n", " validation_steps=x_val.shape[0]//batch_size,\n", " callbacks=callbacks_resnet50_ft)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/3\n", "Epoch 00000: val_acc did not improve\n", "66s - loss: 1.7690 - acc: 0.4601 - val_loss: 14.2435 - val_acc: 0.1016\n", "Epoch 2/3\n", "Epoch 00001: val_acc did not improve\n", "46s - loss: 1.5898 - acc: 0.4697 - val_loss: 14.6031 - val_acc: 0.0891\n", "Epoch 3/3\n", "Epoch 00002: val_acc did not improve\n", "50s - loss: 1.3333 - acc: 0.5672 - val_loss: 12.4576 - val_acc: 0.1406\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "resnet50_ft.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n", "\n", "resnet50_ft.fit_generator(train_gen,\n", " steps_per_epoch=x_train.shape[0]//batch_size,\n", " epochs=3,\n", " validation_data=valid_gen,\n", " verbose=2,\n", " validation_steps=x_val.shape[0]//batch_size,\n", " callbacks=callbacks_resnet50_ft)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/3\n", "Epoch 00000: val_acc did not improve\n", "66s - loss: 0.9577 - acc: 0.6733 - val_loss: 0.7205 - val_acc: 0.7562\n", "Epoch 2/3\n", "Epoch 00001: val_acc improved from 0.76094 to 0.76406, saving model to /home/paperspace/IEEE/resnet50FineTuneWeights.best.hdf5\n", "54s - loss: 0.9129 - acc: 0.6923 - val_loss: 0.6986 - val_acc: 0.7641\n", "Epoch 3/3\n", "Epoch 00002: val_acc improved from 0.76406 to 0.77344, saving model to /home/paperspace/IEEE/resnet50FineTuneWeights.best.hdf5\n", "52s - loss: 0.8689 - acc: 0.7087 - val_loss: 0.6929 - val_acc: 0.7734\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "resnet50_ft.load_weights('./IEEE/resnet50FineTuneWeights.best.hdf5')\n", "\n", "resnet50_ft.compile(optimizer=SGD(lr=0.001, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy'])\n", "\n", "resnet50_ft.fit_generator(train_gen,\n", " steps_per_epoch=x_train.shape[0]//batch_size,\n", " epochs=3,\n", " validation_data=valid_gen,\n", " verbose=2,\n", " validation_steps=x_val.shape[0]//batch_size,\n", " callbacks=callbacks_resnet50_ft)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/3\n", "Epoch 00000: val_acc improved from 0.77344 to 0.77812, saving model to /home/paperspace/IEEE/resnet50FineTuneWeights.best.hdf5\n", "62s - loss: 0.7810 - acc: 0.7421 - val_loss: 0.6566 - val_acc: 0.7781\n", "Epoch 2/3\n", "Epoch 00001: val_acc did not improve\n", "48s - loss: 0.7668 - acc: 0.7365 - val_loss: 0.6822 - val_acc: 0.7719\n", "Epoch 3/3\n", "Epoch 00002: val_acc did not improve\n", "50s - loss: 0.6666 - acc: 0.7744 - val_loss: 0.6849 - val_acc: 0.7609\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "resnet50_ft.fit_generator(train_gen,\n", " steps_per_epoch=x_train.shape[0]//batch_size,\n", " epochs=3,\n", " validation_data=valid_gen,\n", " verbose=2,\n", " validation_steps=x_val.shape[0]//batch_size,\n", " callbacks=callbacks_resnet50_ft)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/paperspace/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:183: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor(\"in..., outputs=Tensor(\"de...)`\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Found 2062 images belonging to 10 classes.\n", "Found 688 images belonging to 10 classes.\n", "Epoch 1/10\n", "Epoch 00000: val_acc improved from -inf to 0.89286, saving model to /home/paperspace/IEEE/resnet50FineTuneWeights.best.hdf5\n", "110s - loss: 0.6448 - acc: 0.7891 - val_loss: 0.3514 - val_acc: 0.8929\n", "Epoch 2/10\n", "Epoch 00001: val_acc did not improve\n", "65s - loss: 0.6412 - acc: 0.7806 - val_loss: 0.3767 - val_acc: 0.8857\n", "Epoch 3/10\n", "Epoch 00002: val_acc did not improve\n", "65s - loss: 0.6310 - acc: 0.7801 - val_loss: 0.3637 - val_acc: 0.8918\n", "Epoch 4/10\n", "Epoch 00003: val_acc improved from 0.89286 to 0.89482, saving model to /home/paperspace/IEEE/resnet50FineTuneWeights.best.hdf5\n", "66s - loss: 0.5940 - acc: 0.7941 - val_loss: 0.3553 - val_acc: 0.8948\n", "Epoch 5/10\n", "Epoch 00004: val_acc did not improve\n", "65s - loss: 0.6123 - acc: 0.7927 - val_loss: 0.3704 - val_acc: 0.8918\n", "Epoch 6/10\n", "Epoch 00005: val_acc improved from 0.89482 to 0.89939, saving model to /home/paperspace/IEEE/resnet50FineTuneWeights.best.hdf5\n", "66s - loss: 0.6148 - acc: 0.7990 - val_loss: 0.3351 - val_acc: 0.8994\n", "Epoch 7/10\n", "Epoch 00006: val_acc improved from 0.89939 to 0.90854, saving model to /home/paperspace/IEEE/resnet50FineTuneWeights.best.hdf5\n", "66s - loss: 0.5695 - acc: 0.7969 - val_loss: 0.3085 - val_acc: 0.9085\n", "Epoch 8/10\n", "Epoch 00007: val_acc did not improve\n", "65s - loss: 0.5680 - acc: 0.8106 - val_loss: 0.3304 - val_acc: 0.9009\n", "Epoch 9/10\n", "Epoch 00008: val_acc did not improve\n", "65s - loss: 0.5492 - acc: 0.8193 - val_loss: 0.3088 - val_acc: 0.9024\n", "Epoch 10/10\n", "Epoch 00009: val_acc did not improve\n", "65s - loss: 0.5407 - acc: 0.8178 - val_loss: 0.3126 - val_acc: 0.9055\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "batch_size = 32\n", "\n", "resnet50_ft, callbacks_resnet50_ft = fine_tune('resnet50', 2)\n", "\n", "resnet50_ft.load_weights('./IEEE/resnet50FineTuneWeights.best.hdf5')\n", "\n", "train_gen, valid_gen = define_generators(batch_size, 'resnet50')\n", "\n", "resnet50_ft.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy'])\n", "\n", "resnet50_ft.fit_generator(train_gen,\n", " steps_per_epoch=X_train.shape[0]//batch_size,\n", " epochs=10,\n", " validation_data=valid_gen,\n", " verbose=2,\n", " validation_steps=X_val.shape[0]//batch_size,\n", " callbacks=callbacks_resnet50_ft)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fine tune a pre-trained Inception V3 network: only ~60% accuracy" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/paperspace/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:104: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor(\"in..., outputs=Tensor(\"de...)`\n" ] } ], "source": [ "inception_v3_b, callbacks_inception_v3_b = build_on_bottleneck('inception_v3')\n", "#inception_v3_b.summary()" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train Shape: (2060, 2)\n", "Validation Shape: (690, 2)\n", "copying training files to /home/paperspace/IEEE/crossval/training...\n", "copying validation files to /home/paperspace/IEEE/crossval/validation...\n", "**** Running fold 0\n", "Found 2060 images belonging to 10 classes.\n", "Found 690 images belonging to 10 classes.\n", "Epoch 1/10\n", "Epoch 00000: val_acc improved from -inf to 0.23750, saving model to /home/paperspace/IEEE/inception_v3BottleneckWeights.best.hdf5\n", "183s - loss: 2.4807 - acc: 0.1567 - val_loss: 2.0683 - val_acc: 0.2375\n", "Epoch 2/10\n", "Epoch 00001: val_acc improved from 0.23750 to 0.33125, saving model to /home/paperspace/IEEE/inception_v3BottleneckWeights.best.hdf5\n", "60s - loss: 1.9887 - acc: 0.3120 - val_loss: 1.9132 - val_acc: 0.3312\n", "Epoch 3/10\n", "Epoch 00002: val_acc improved from 0.33125 to 0.37500, saving model to /home/paperspace/IEEE/inception_v3BottleneckWeights.best.hdf5\n", "69s - loss: 1.8264 - acc: 0.3344 - val_loss: 1.7917 - val_acc: 0.3750\n", "Epoch 4/10\n", "Epoch 00003: val_acc improved from 0.37500 to 0.40469, saving model to /home/paperspace/IEEE/inception_v3BottleneckWeights.best.hdf5\n", "66s - loss: 1.7050 - acc: 0.4027 - val_loss: 1.7293 - val_acc: 0.4047\n", "Epoch 5/10\n", "Epoch 00004: val_acc did not improve\n", "67s - loss: 1.6090 - acc: 0.4394 - val_loss: 1.7701 - val_acc: 0.3719\n", "Epoch 6/10\n", "Epoch 00005: val_acc improved from 0.40469 to 0.42812, saving model to /home/paperspace/IEEE/inception_v3BottleneckWeights.best.hdf5\n", "69s - loss: 1.5774 - acc: 0.4412 - val_loss: 1.7248 - val_acc: 0.4281\n", "Epoch 7/10\n", "Epoch 00006: val_acc did not improve\n", "65s - loss: 1.5267 - acc: 0.4706 - val_loss: 1.6873 - val_acc: 0.4073\n", "Epoch 8/10\n", "Epoch 00007: val_acc did not improve\n", "67s - loss: 1.4416 - acc: 0.5034 - val_loss: 1.6841 - val_acc: 0.4073\n", "Epoch 9/10\n", "Epoch 00008: val_acc improved from 0.42812 to 0.43610, saving model to /home/paperspace/IEEE/inception_v3BottleneckWeights.best.hdf5\n", "67s - loss: 1.4700 - acc: 0.4804 - val_loss: 1.6648 - val_acc: 0.4361\n", "Epoch 10/10\n", "Epoch 00009: val_acc improved from 0.43610 to 0.45527, saving model to /home/paperspace/IEEE/inception_v3BottleneckWeights.best.hdf5\n", "70s - loss: 1.4540 - acc: 0.4942 - val_loss: 1.6073 - val_acc: 0.4553\n" ] } ], "source": [ "df_y = data['class']\n", "df_x = data['filename']\n", "batch_size = 64\n", "\n", "skf = StratifiedKFold(n_splits = 4)\n", "#total_actual = []\n", "#total_predicted = []\n", "#total_val_accuracy = []\n", "#total_val_loss = []\n", "#total_test_accuracy = []\n", "\n", "for i, (train_index, test_index) in enumerate(skf.split(df_x, df_y)):\n", " x_train, x_val = df_x.iloc[train_index], df_x.iloc[test_index]\n", " y_train, y_val = df_y.iloc[train_index], df_y.iloc[test_index]\n", "\n", " train = pd.concat([x_train, y_train], axis=1)\n", " validation = pd.concat([x_val, y_val], axis = 1)\n", " print('Train Shape:', train.shape)\n", " print('Validation Shape:', validation.shape)\n", " #print(validation.groupby(['class'])['class'].count())\n", " \n", " # copy the images according to the fold\n", " copy_images(train, 'training')\n", " copy_images(validation, 'validation')\n", "\n", " print('**** Running fold '+ str(i))\n", " \n", " train_gen, valid_gen = define_generators(batch_size, 'inception_v3')\n", " \n", " inception_v3_b.fit_generator(train_gen,\n", " steps_per_epoch=x_train.shape[0]//batch_size,\n", " epochs=10,\n", " validation_data=valid_gen,\n", " verbose=2,\n", " validation_steps=x_val.shape[0]//batch_size,\n", " callbacks=callbacks_inception_v3_b)\n", " break" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/paperspace/anaconda3/lib/python3.6/site-packages/ipykernel_launcher.py:145: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor(\"in..., outputs=Tensor(\"de...)`\n" ] } ], "source": [ "inception_v3_ft, callbacks_inception_v3_ft = fine_tune('inception_v3', 249)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": true }, "outputs": [], "source": [ "inception_v3_ft.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy'])" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train Shape: (2060, 2)\n", "Validation Shape: (690, 2)\n", "copying training files to /home/paperspace/IEEE/crossval/training...\n", "copying validation files to /home/paperspace/IEEE/crossval/validation...\n", "**** Running fold 0\n", "Found 2060 images belonging to 10 classes.\n", "Found 690 images belonging to 10 classes.\n", "Epoch 1/15\n", "Epoch 00000: val_acc improved from -inf to 0.54844, saving model to /home/paperspace/IEEE/inception_v3FineTuneWeights.best.hdf5\n", "157s - loss: 1.3783 - acc: 0.5288 - val_loss: 1.3231 - val_acc: 0.5484\n", "Epoch 2/15\n", "Epoch 00001: val_acc improved from 0.54844 to 0.56094, saving model to /home/paperspace/IEEE/inception_v3FineTuneWeights.best.hdf5\n", "60s - loss: 1.3452 - acc: 0.5335 - val_loss: 1.3107 - val_acc: 0.5609\n", "Epoch 3/15\n", "Epoch 00002: val_acc did not improve\n", "63s - loss: 1.3090 - acc: 0.5637 - val_loss: 1.3056 - val_acc: 0.5547\n", "Epoch 4/15\n", "Epoch 00003: val_acc improved from 0.56094 to 0.56406, saving model to /home/paperspace/IEEE/inception_v3FineTuneWeights.best.hdf5\n", "69s - loss: 1.3572 - acc: 0.5350 - val_loss: 1.2883 - val_acc: 0.5641\n", "Epoch 5/15\n", "Epoch 00004: val_acc did not improve\n", "64s - loss: 1.2663 - acc: 0.5634 - val_loss: 1.3020 - val_acc: 0.5625\n", "Epoch 6/15\n", "Epoch 00005: val_acc improved from 0.56406 to 0.56875, saving model to /home/paperspace/IEEE/inception_v3FineTuneWeights.best.hdf5\n", "69s - loss: 1.3017 - acc: 0.5623 - val_loss: 1.2878 - val_acc: 0.5687\n", "Epoch 7/15\n", "Epoch 00006: val_acc improved from 0.56875 to 0.57031, saving model to /home/paperspace/IEEE/inception_v3FineTuneWeights.best.hdf5\n", "66s - loss: 1.3008 - acc: 0.5654 - val_loss: 1.2905 - val_acc: 0.5703\n", "Epoch 8/15\n", "Epoch 00007: val_acc improved from 0.57031 to 0.57987, saving model to /home/paperspace/IEEE/inception_v3FineTuneWeights.best.hdf5\n", "69s - loss: 1.2609 - acc: 0.5804 - val_loss: 1.2781 - val_acc: 0.5799\n", "Epoch 9/15\n", "Epoch 00008: val_acc improved from 0.57987 to 0.58147, saving model to /home/paperspace/IEEE/inception_v3FineTuneWeights.best.hdf5\n", "67s - loss: 1.2435 - acc: 0.5770 - val_loss: 1.2601 - val_acc: 0.5815\n", "Epoch 10/15\n", "Epoch 00009: val_acc did not improve\n", "68s - loss: 1.2151 - acc: 0.5918 - val_loss: 1.2863 - val_acc: 0.5751\n", "Epoch 11/15\n", "Epoch 00010: val_acc improved from 0.58147 to 0.58946, saving model to /home/paperspace/IEEE/inception_v3FineTuneWeights.best.hdf5\n", "66s - loss: 1.2369 - acc: 0.5756 - val_loss: 1.2533 - val_acc: 0.5895\n", "Epoch 12/15\n", "Epoch 00011: val_acc did not improve\n", "65s - loss: 1.2517 - acc: 0.5841 - val_loss: 1.3020 - val_acc: 0.5671\n", "Epoch 13/15\n", "Epoch 00012: val_acc did not improve\n", "64s - loss: 1.1952 - acc: 0.5912 - val_loss: 1.2760 - val_acc: 0.5639\n", "Epoch 14/15\n", "Epoch 00013: val_acc improved from 0.58946 to 0.60383, saving model to /home/paperspace/IEEE/inception_v3FineTuneWeights.best.hdf5\n", "68s - loss: 1.2052 - acc: 0.5979 - val_loss: 1.2208 - val_acc: 0.6038\n", "Epoch 15/15\n", "Epoch 00014: val_acc did not improve\n", "64s - loss: 1.2222 - acc: 0.5906 - val_loss: 1.2640 - val_acc: 0.5879\n" ] } ], "source": [ "df_y = data['class']\n", "df_x = data['filename']\n", "batch_size = 64\n", "\n", "skf = StratifiedKFold(n_splits = 4)\n", "\n", "for i, (train_index, test_index) in enumerate(skf.split(df_x, df_y)):\n", " x_train, x_val = df_x.iloc[train_index], df_x.iloc[test_index]\n", " y_train, y_val = df_y.iloc[train_index], df_y.iloc[test_index]\n", "\n", " train = pd.concat([x_train, y_train], axis=1)\n", " validation = pd.concat([x_val, y_val], axis = 1)\n", " print('Train Shape:', train.shape)\n", " print('Validation Shape:', validation.shape)\n", " \n", " # copy the images according to the fold\n", " copy_images(train, 'training')\n", " copy_images(validation, 'validation')\n", "\n", " print('**** Running fold '+ str(i))\n", " \n", " train_gen, valid_gen = define_generators(batch_size, 'inception_v3')\n", " \n", " inception_v3_ft.fit_generator(train_gen,\n", " steps_per_epoch=x_train.shape[0]//batch_size,\n", " epochs=15,\n", " validation_data=valid_gen,\n", " verbose=2,\n", " validation_steps=x_val.shape[0]//batch_size,\n", " callbacks=callbacks_inception_v3_ft)\n", " break" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Kaggle submission using ResNet50" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": true }, "outputs": [], "source": [ "list_paths_t = []\n", "for subdir, dirs, files in os.walk(master_path + os.sep + \"data\" + os.sep + 'test'): #\"data\n", " for file in files:\n", " filepath = subdir + os.sep + file\n", " list_paths_t.append(filepath)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": true }, "outputs": [], "source": [ "list_test = [filepath for filepath in list_paths_t if \"test/test\" in filepath and '.ipynb' not in filepath]\n", "classes = {v:k for k,v in t.class_indices.items()}" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from keras.preprocessing import image\n", "from keras.applications.resnet50 import preprocess_input\n", "\n", "final_dict = {}\n", "\n", "for img_path in list_test:\n", " img = image.load_img(img_path, target_size=(224, 224))\n", " x = image.img_to_array(img)\n", " x = np.expand_dims(x, axis=0)\n", " x = preprocess_input(x)\n", "\n", " pred = resnet50_ft.predict(x)\n", " c = classes[np.argmax(pred, axis=1)[0]]\n", " final_dict[img_path.split(os.sep)[-1]] = c" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
fnamecamera
0img_60fa981_manip.tifMotorola-Nexus-6
1img_ae09094_manip.tifMotorola-Nexus-6
2img_cf68c4b_manip.tifLG-Nexus-5x
3img_d39f0ff_unalt.tifLG-Nexus-5x
4img_b38df95_unalt.tifiPhone-4s
5img_7487183_manip.tifiPhone-6
6img_3954571_manip.tifMotorola-Droid-Maxx
7img_327b547_unalt.tifMotorola-X
8img_ea8864a_manip.tifMotorola-Nexus-6
9img_ee72d58_manip.tifMotorola-X
\n", "
" ], "text/plain": [ " fname camera\n", "0 img_60fa981_manip.tif Motorola-Nexus-6\n", "1 img_ae09094_manip.tif Motorola-Nexus-6\n", "2 img_cf68c4b_manip.tif LG-Nexus-5x\n", "3 img_d39f0ff_unalt.tif LG-Nexus-5x\n", "4 img_b38df95_unalt.tif iPhone-4s\n", "5 img_7487183_manip.tif iPhone-6\n", "6 img_3954571_manip.tif Motorola-Droid-Maxx\n", "7 img_327b547_unalt.tif Motorola-X\n", "8 img_ea8864a_manip.tif Motorola-Nexus-6\n", "9 img_ee72d58_manip.tif Motorola-X" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kaggle = pd.DataFrame.from_dict(final_dict, orient='index').reset_index()\n", "kaggle.columns = ['fname', 'camera']\n", "kaggle.to_csv('./IEEE/for_kaggle.csv', index=False)\n", "kaggle.head(10)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2640, 2)" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kaggle.shape" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 2 }