{"cells":[{"metadata":{"trusted":true,"_uuid":"f54c620f8591e4a93b46a9db41cd3ee760f3eb38"},"cell_type":"code","source":"import sys\nimport os\nimport argparse\nfrom glob import glob\n\nimport random\nfrom random import shuffle\n\nimport time\nimport datetime\n\nfrom collections import Counter\n\n# from numpy.random import seed\n# seed(101)\n# from tensorflow import set_random_seed\n# set_random_seed(101)\n\n\nimport numpy as np\nimport pandas as pd\n\nimport shutil\nfrom tqdm import tqdm\n\nimport itertools\n\n\n# import inspect\nimport gc\n\nimport re\n\nfrom PIL import Image\nimport cv2\n\nimport keras\n\n# from keras.utils import np_utils\n\nfrom keras.preprocessing.image import ImageDataGenerator\n\n# from imgaug import augmenters as iaa\n# import imgaug as ia\n\n\nfrom keras import models\nfrom keras.models import Model\nfrom keras.models import Sequential\n\n\nfrom keras.layers import Convolution1D, concatenate, SpatialDropout1D, GlobalMaxPool1D, GlobalAvgPool1D, Embedding, \\\n    Conv2D, SeparableConv1D, Add, BatchNormalization, Activation, GlobalAveragePooling2D, LeakyReLU, Flatten\nfrom keras.layers import Dense, Input, Dropout, MaxPooling2D, Concatenate, GlobalMaxPooling2D, GlobalAveragePooling2D, \\\n    Lambda, Multiply, LSTM, Bidirectional, PReLU, MaxPooling1D\nfrom keras.layers.pooling import _GlobalPooling1D\n\n\nfrom keras.applications.xception import Xception\nfrom keras.applications.resnet50 import ResNet50\nfrom keras.applications.inception_v3 import InceptionV3\nfrom keras.applications.inception_resnet_v2 import InceptionResNetV2\nfrom keras.applications.densenet import DenseNet201\nfrom keras.applications.nasnet import NASNetMobile, NASNetLarge\n\nfrom keras.applications.nasnet import preprocess_input\n\n\n\n# from keras.constraints import maxnorm\n\n\nfrom keras import optimizers\nfrom keras.optimizers import Adam, SGD , RMSprop\n\nfrom keras.losses import mae, sparse_categorical_crossentropy, binary_crossentropy\n\n\nfrom keras import backend as K\n# K.set_image_dim_ordering('th')\n\n\nfrom keras.callbacks import ModelCheckpoint, EarlyStopping, TensorBoard, ReduceLROnPlateau\n\n# from keras.wrappers.scikit_learn import KerasClassifier\n\nfrom sklearn.utils import shuffle\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.utils import class_weight as cw\n\n\nfrom sklearn.metrics import precision_score, recall_score, f1_score, roc_auc_score, confusion_matrix, classification_report\n\n\nfrom mlxtend.plotting import plot_confusion_matrix\n\nimport tensorflow as tf\n\n\n\nfrom IPython.display import display\n\nimport seaborn as sns\n\nfrom matplotlib.pyplot import figure\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\n\n%matplotlib inline","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"339d2c89f5968775e17eb731100b04bdea4f1bd8"},"cell_type":"code","source":"print(os.listdir(r\"../input\"))","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"input_directory = r\"../input/\"\n\ntraining_dir = input_directory + r\"train\"\ntesting_dir = input_directory + r\"test\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"dd5b7d89a0b24869634fabc9e097be5d379c0dfc"},"cell_type":"code","source":"train_files = os.listdir(training_dir)\ntest_files = os.listdir(testing_dir)\n\ntrain_labels = []\n\nfor file in train_files:\n    train_labels.append(file.split(\".\")[0])\n    \ndf_train = pd.DataFrame({\"id\": train_files, \"label\": train_labels})\n\ndf_train.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"eb61825c7b462bae44e8ccdd6b40b91235361caa"},"cell_type":"code","source":"df_test = pd.DataFrame({\"id\": test_files})\ndf_test[\"label\"] = [\"cat\"]*(len(test_files))\ndf_test.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4258b2761c24cdc84e7f3f0107421ca097fe34ea"},"cell_type":"code","source":"# print date and time for given type of representation\ndef date_time(x):\n    if x==1:\n        return 'Timestamp: {:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now())\n    if x==2:    \n        return 'Timestamp: {:%Y-%b-%d %H:%M:%S}'.format(datetime.datetime.now())\n    if x==3:  \n        return 'Date now: %s' % datetime.datetime.now()\n    if x==4:  \n        return 'Date today: %s' % datetime.date.today()\n    \n# prints a integer for degugging\ndef debug(x):\n    print(\"-\"*40, x, \"-\"*40)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4f6725f9a751446100ef3e1816623b96fa09b926"},"cell_type":"code","source":"def get_class_files(df, file=\"id\", label = \"label\", count=5):\n    label_map = {}\n    \n    for l in set(df[label]):\n        label_map[l] = []\n\n    for i in range(len(df)):\n        label_map[df[label][i]].append(df[file][i])\n    \n    return label_map\n\ndef select_image_by_label(label_map, image_count_per_label):\n    label_map_select = {}\n    \n    for l in label_map:\n        label_map_select[l] = []\n        \n    \n    for i in label_map:\n        num_image = len(label_map[i])\n        image_mem = {}\n        for j in range(image_count_per_label):\n            image_index = random.randint(0, num_image - 1)\n            while image_index in image_mem:\n                image_index = random.randint(0, num_image - 1)\n            label_map_select[i].append(label_map[i][image_index])\n            \n    return label_map_select\n\n\ndef plot_sample_image(label_map_select, directory=training_dir, nrows=2, ncols=5, figsize=(16, 4), aspect=None):\n    fig, ax = plt.subplots(nrows=nrows, ncols=ncols, figsize=(16, 4))    \n    i=0\n    \n    for label in label_map_select:\n        print(label)\n        j=0\n        \n        for file in label_map_select[label]:\n            plt.subplot(i+1, ncols, j+1)\n            plot_image(file, directory, aspect=aspect)\n            j=j+1\n            \n        plt.tight_layout()\n        plt.show()\n        \n        i+=1\n        \ndef plot_sample_test_image(directory=testing_dir, count=5, nrows=1, ncols=5, figsize=(16, 4), aspect=None):\n    selected_files = random.sample(os.listdir(testing_dir), count)\n    fig, ax = plt.subplots(nrows=nrows, ncols=ncols, figsize=(16, 4))\n    \n    i=0\n    \n    for file in selected_files:        \n        plt.subplot(1, ncols, i+1)\n        path = directory + file\n        plot_image(file, directory, aspect=aspect)\n\n        i=i+1\n\n    plt.tight_layout()\n    plt.show()\n    \n    \ndef plot_image(file, directory=None, sub=False, aspect=None):\n    path = directory + file\n    \n    img = plt.imread(path)\n    \n    plt.imshow(img, aspect=aspect)\n    \n    plt.xticks([])\n    plt.yticks([])\n    \n    plt.title(path.split(\"/\")[-1])\n    \n    if sub:\n        plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"64c6af63b15c4332714631b5144e743ec401231c"},"cell_type":"code","source":"print(\"Trainning\")\nlabel_map = get_class_files(df_train)\nimage_count_per_label = 5\naspect = 'auto'\nlabel_map_select = select_image_by_label(label_map, image_count_per_label)\nplot_sample_image(label_map_select, training_dir+\"/\", aspect=aspect)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c5c293deaa5a42a40007e53b4e97e5ade4e04f49"},"cell_type":"code","source":"print(\"Testing\")\naspect = None\nplot_sample_test_image(directory=testing_dir+\"/\", aspect=aspect)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9bc776c7ee2c773f629c281fb076e9298a1fe273"},"cell_type":"code","source":"sns.countplot(df_train[\"label\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e6ea3a6e44b471d6e37d48bae528f88ef203d34c"},"cell_type":"code","source":"# reset tensorflow graph tp free up memory and resource allocation \ndef reset_graph(model=None):\n    if model:\n        try:\n            del model\n        except:\n            return False\n    \n    tf.reset_default_graph()\n    \n    K.clear_session()\n    \n    gc.collect()\n    \n    return True\n\n\n# reset callbacks \ndef reset_callbacks(checkpoint=None, reduce_lr=None, early_stopping=None, tensorboard=None):\n    checkpoint = None\n    reduce_lr = None\n    early_stopping = None\n    tensorboard = None\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"32e6e3a4ea9090b0619e7385c1ec539322f9b275"},"cell_type":"code","source":"# reset_graph()\n# reset_callbacks()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8724733550ef36fb1f67a974f8ebe8f01b11fa88"},"cell_type":"code","source":"classes = ['cat', 'dog']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2d892dee5715614a17a8641c4b41c2de1d5f2fab"},"cell_type":"code","source":"def get_data(batch_size=32, target_size=(96,96), class_mode=\"categorical\", training_dir=training_dir, testing_dir=testing_dir, classes=classes, df_train=df_train, df_test=df_test):\n    print(\"Generating data following preprocessing...\\n\")\n    \n    rescale = 1.0/255\n\n    train_batch_size = batch_size\n    test_batch_size = batch_size\n\n    train_shuffle = True\n    val_shuffle = True\n    test_shuffle = False\n    \n    train_datagen = ImageDataGenerator(\n        horizontal_flip=True,\n#         vertical_flip=True,\n#         rotation_range=45,\n        shear_range=0.2,\n        zoom_range=0.2,\n        rescale=rescale,\n        validation_split=0.25\n    )\n\n    train_generator = train_datagen.flow_from_dataframe(\n        df_train, \n        training_dir, \n        x_col='id',\n        y_col='label', \n        has_ext=True, \n        target_size=target_size, \n        classes = classes,\n        class_mode=class_mode, \n        batch_size=batch_size, \n        shuffle=True, \n        seed=42,\n        subset='training')\n    \n    validation_generator = train_datagen.flow_from_dataframe(\n        df_train, \n        training_dir, \n        x_col='id',\n        y_col='label', \n        has_ext=True, \n        target_size=target_size, \n        classes = classes,\n        class_mode=class_mode, \n        batch_size=batch_size, \n        shuffle=True, \n        seed=42,\n        subset='validation')\n\n\n    test_datagen = ImageDataGenerator(rescale=rescale)\n    test_generator = test_datagen.flow_from_dataframe(\n        df_test, \n        testing_dir, \n        x_col='id',\n        y_col='label', \n        has_ext=True, \n        target_size=target_size, \n        classes = classes,\n        class_mode=class_mode, \n        batch_size=batch_size, \n        shuffle=False\n#         seed=42\n    )\n    \n    class_weights = get_weight(train_generator.classes)\n    \n    steps_per_epoch = len(train_generator)\n    validation_steps = len(validation_generator)\n    \n    print(\"\\nData batches generated.\")\n    \n    return train_generator, validation_generator, test_generator, class_weights, steps_per_epoch, validation_steps\n\n\ndef get_weight(y):\n    class_weight_current =  cw.compute_class_weight('balanced', np.unique(y), y)\n    return class_weight_current","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"630a7b78055d3bd452fc9031de5f82b710ee6347"},"cell_type":"code","source":"def get_conv_model():\n    model = Sequential()\n    model.add(Conv2D(16, (3, 3), activation='relu', padding=\"same\", input_shape=(3,96,96)))\n    model.add(Conv2D(16, (3, 3), padding=\"same\", activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n\n    model.add(Conv2D(32, (3, 3), activation='relu', padding=\"same\"))\n    model.add(Conv2D(32, (3, 3), padding=\"same\", activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n\n    model.add(Conv2D(64, (3, 3), activation='relu', padding=\"same\"))\n    model.add(Conv2D(64, (3, 3), padding=\"same\", activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n\n    model.add(Conv2D(96, (3, 3), dilation_rate=(2, 2), activation='relu', padding=\"same\"))\n    model.add(Conv2D(96, (3, 3), padding=\"valid\", activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n\n    model.add(Conv2D(128, (3, 3), dilation_rate=(2, 2), activation='relu', padding=\"same\"))\n    model.add(Conv2D(128, (3, 3), padding=\"valid\", activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n\n    model.add(Flatten())\n\n    model.add(Dense(64, activation='relu'))\n    model.add(Dropout(0.2))\n    model.add(Dense(2 , activation='softmax'))\n\n\n    print(model.summary())\n    \n    return model\n\n\ndef get_model(model_name, input_shape=(96, 96, 3)):\n    inputs = Input(input_shape)\n    \n    if model_name == \"Xception\":\n        base_model = Xception(include_top=False, input_shape=input_shape)\n    elif model_name == \"ResNet50\":\n        base_model = ResNet50(include_top=False, input_shape=input_shape)\n    elif model_name == \"InceptionV3\":\n        # base_model = InceptionV3(include_top=False, input_shape=input_shape)\n        # included weights\n        base_model = InceptionV3(weights='imagenet', include_top=False, input_shape=input_shape) \n    elif model_name == \"InceptionResNetV2\":\n        base_model = InceptionResNetV2(include_top=False, input_shape=input_shape)\n    if model_name == \"DenseNet201\":\n        base_model = DenseNet201(include_top=False, input_shape=input_shape)\n    if model_name == \"NASNetMobile\":\n        base_model = NASNetMobile(include_top=False, input_shape=input_shape)\n    if model_name == \"NASNetLarge\":\n        base_model = NASNetLarge(include_top=False, input_shape=input_shape)\n\n    for layer in base_model.layers:\n        layer.trainable = False\n\n    # this is the model we will train\n    model = Model(inputs=base_model.input, outputs=predictions)\n\n    model.summary()\n    \n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"68a8205c3582ab1c137a59add47d686cd5e76e45"},"cell_type":"code","source":"def auroc(y_true, y_pred):\n    return tf.py_func(roc_auc_score, (y_true, y_pred), tf.double)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e31903f6acb858cf1f8866f518427fcdc23d9430"},"cell_type":"code","source":"def plot_performance(history=None, figure_directory=None):\n    xlabel = 'Epoch'\n    legends = ['Training', 'Validation']\n\n    ylim_pad = [0.01, 0.1]\n\n\n    plt.figure(figsize=(15, 5))\n\n    # Plot training & validation Accuracy values\n\n    y1 = history.history['acc']\n    y2 = history.history['val_acc']\n\n    min_y = min(min(y1), min(y2))-ylim_pad[0]\n    max_y = max(max(y1), max(y2))+ylim_pad[0]\n\n\n    plt.subplot(121)\n\n    plt.plot(y1)\n    plt.plot(y2)\n\n    plt.title('Model Accuracy\\n'+date_time(1), fontsize=17)\n    plt.xlabel(xlabel, fontsize=15)\n    plt.ylabel('Accuracy', fontsize=15)\n    plt.ylim(min_y, max_y)\n    plt.legend(legends, loc='upper left')\n    plt.grid()\n\n\n    # Plot training & validation loss values\n\n    y1 = history.history['loss']\n    y2 = history.history['val_loss']\n\n    min_y = min(min(y1), min(y2))-ylim_pad[1]\n    max_y = max(max(y1), max(y2))+ylim_pad[1]\n\n\n    plt.subplot(122)\n\n    plt.plot(y1)\n    plt.plot(y2)\n\n    plt.title('Model Loss\\n'+date_time(1), fontsize=17)\n    plt.xlabel(xlabel, fontsize=15)\n    plt.ylabel('Loss', fontsize=15)\n    plt.ylim(min_y, max_y)\n    plt.legend(legends, loc='upper left')\n    plt.grid()\n#     plt.savefig(figure_directory+\"/history\")\n\n    plt.show()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"84172321e8740f2dfb249615e7a99f815354a08a"},"cell_type":"code","source":"main_model_dir = r\"models/\"\nmain_log_dir = r\"logs/\"\n\ntry:\n    shutil.rmtree(main_model_dir)\nexcept:\n    pass\ntry:\n    shutil.rmtree(main_log_dir)\nexcept:\n    pass\n\nos.mkdir(main_model_dir)\nos.mkdir(main_log_dir)\n\nos.listdir()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2c46c5208b23bd2617c6a8250962616ee2115193"},"cell_type":"code","source":"model_dir = main_model_dir + time.strftime('%Y-%m-%d %H-%M-%S') + \"/\"\nlog_dir = main_log_dir + time.strftime('%Y-%m-%d %H-%M-%S')\n\nos.mkdir(model_dir)\nos.mkdir(log_dir)\n\nmodel_file = model_dir + \"{epoch:02d}-val_acc-{val_acc:.2f}-val_loss-{val_loss:.2f}.hdf5\"\n\nmodel_dir, os.listdir(model_dir), log_dir, os.listdir(log_dir)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8dd99fcd466c2c23f0a927b4551ca7e38536bdd7"},"cell_type":"code","source":"# reset_graph()\n# reset_callbacks()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ea0d1ec317862ab128e65e4326847e39d02eaf89"},"cell_type":"code","source":"print(\"Settting Callbacks\")\n\ncheckpoint = ModelCheckpoint(\n    model_file, \n    monitor='val_acc', \n    save_best_only=True)\n\n\ntensorboard = TensorBoard(\n    log_dir=log_dir,\n    update_freq='batch')\n\n\nearly_stopping = EarlyStopping(\n    monitor='val_loss',\n    patience=2,\n    verbose=1,\n    restore_best_weights=True)\n\n\nreduce_lr = ReduceLROnPlateau(\n    monitor='val_loss',\n    factor=0.5,\n    patience=1,\n    verbose=1)\n\ncallbacks = [reduce_lr, early_stopping, checkpoint]\n\nprint(\"Completed\")\nmodel_dir, os.listdir(model_dir), log_dir, os.listdir(log_dir)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"21badd789f2496d862ba2a481de02cb56366e9c3"},"cell_type":"code","source":"# print(\"Getting Base Model...\")\n# model = get_model(\"Xception\")\n# model = get_model(\"ResNet50\")\n# model = get_model(\"InceptionV3\")\n# model = get_model(\"InceptionResNetV2\")\n# model = get_model(\"DenseNet201\")\n# model = get_model(\"NASNetMobile\")\n# model = get_model(\"NASNetLarge\")\n# print(\"complete\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"310a37f1188e8cdd560a7c19a9f5250b36eac320"},"cell_type":"code","source":"print(\"Starting...\\n\")\nstart_time = time.time()\n# print(date_time(1))\n\nbatch_size = 32\ntarget_size = (299, 299)\n\ntrain_generator, validation_generator, test_generator, class_weights, steps_per_epoch, validation_steps = get_data(batch_size=batch_size, target_size=target_size, classes=classes, df_test=df_test)\nprint(\"\\n\\nCompleted ...\\n\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e1294aa19e8f3d5741de009fc2c1bf8c2e143f2c"},"cell_type":"code","source":"loss = 'categorical_crossentropy'\nmetrics = ['accuracy']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"95e14868f9fbddbc19c41452b0757cd1e56ed3f1"},"cell_type":"code","source":"print(\"Starting...\\n\")\nstart_time = time.time()\n# print(date_time(1))\n\n\n# create the base pre-trained model\n# input_shape = (96, 96, 3)\n# base_model = InceptionV3(weights='imagenet', include_top=False, input_shape=input_shape)\nbase_model = InceptionV3(weights='imagenet', include_top=False)\n\n# add a global spatial average pooling layer\nx = base_model.output\nx = GlobalAveragePooling2D()(x)\n# let's add a fully-connected layer\nx = Dense(1024, activation='relu')(x)\n# and a logistic layer -- let's say we have 200 classes\npredictions = Dense(2, activation='softmax')(x)\n\n# this is the model we will train\nmodel = Model(inputs=base_model.input, outputs=predictions)\n\n# first: train only the top layers (which were randomly initialized)\n# i.e. freeze all convolutional InceptionV3 layers\nfor layer in base_model.layers:\n    layer.trainable = False\n\nprint(\"\\n\\nCompliling Model ...\\n\")\nlearning_rate = 0.0001\noptimizer = Adam(learning_rate)\nmodel.compile(optimizer=optimizer, loss=loss, metrics=metrics)\n\n# train the model on the new data for a few epochs\nverbose = 1\nepochs = 30\n\nprint(\"Trainning Model ...\\n\")\nhistory = model.fit_generator(\n    train_generator,\n    steps_per_epoch=steps_per_epoch,\n    epochs=epochs,\n    verbose=verbose,\n    callbacks=callbacks,\n    validation_data=validation_generator,\n    validation_steps=validation_steps, \n    class_weight=class_weights)\n\n\nelapsed_time = time.time() - start_time\nelapsed_time = time.strftime(\"%H:%M:%S\", time.gmtime(elapsed_time))\n\nprint(\"\\nElapsed Time: \" + elapsed_time)\n# print(\"Completed\\n\", date_time(1))\nprint(\"\\n\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2fd4900fc437fde4a9e8865f581287bbab6490cc"},"cell_type":"code","source":"# print(\"Starting...\\n\")\n# start_time = time.time()\n# # print(date_time(1))\n\n\n# # for i, layer in enumerate(base_model.layers):\n# #    print(i, layer.name)\n\n# layer_to_Freeze=172 \n\n# for layer in model.layers[:layer_to_Freeze]:\n#     layer.trainable = False\n# for layer in model.layers[layer_to_Freeze:]:\n#     layer.trainable = True\n\n\n# print(\"\\n\\nCompliling Model ...\\n\")\n# learning_rate = 0.00001\n# optimizer = Adam(learning_rate)\n# model.compile(optimizer=optimizer, loss=loss, metrics=metrics)\n\n# verbose = 1\n# epochs = 30\n\n# print(\"Trainning Model ...\\n\")\n# history = model.fit_generator(\n#     train_generator,\n#     steps_per_epoch=steps_per_epoch,\n#     epochs=epochs,\n#     verbose=verbose,\n#     callbacks=callbacks,\n#     validation_data=validation_generator,\n#     validation_steps=validation_steps, \n#     class_weight=class_weights)\n\n\n# elapsed_time = time.time() - start_time\n# elapsed_time = time.strftime(\"%H:%M:%S\", time.gmtime(elapsed_time))\n\n# print(\"\\nElapsed Time: \" + elapsed_time)\n# # print(\"Completed\\n\", date_time(1))\n# print(\"\\n\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"05a45a0140681ef2b9e1fc8194bfd891caca27b9"},"cell_type":"code","source":"plot_performance(history=history)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"06a2b25ccd1ea314913de4552cf7bebcfadae06f"},"cell_type":"code","source":"def generate_result(model, test_generator, nsteps=len(test_generator)):\n    y_preds = model.predict_generator(test_generator, steps=nsteps, verbose=1) \n    return y_preds, y_preds[:,1]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7ab39d29d561cccd30b5be07702a81be4e1dcec6"},"cell_type":"code","source":"y_preds_all, y_preds = generate_result(model, test_generator)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"47b1a00a4033b7a9bb3c63b47778dd93c2f007a9"},"cell_type":"code","source":"df_test = pd.DataFrame({\"id\": test_generator.filenames, \"label\": y_preds})\ndf_test['id'] = df_test['id'].map(lambda x: x.split('.')[0])\ndf_test['id'] = df_test['id'].astype(int)\ndf_test = df_test.sort_values('id')\ndf_test.to_csv('submission.csv', index=False)\n# df_test.to_csv('submission.csv')\ndf_test.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1f8dea3d853e400739d71df0476209936cf08d7f"},"cell_type":"code","source":"df_test2 = pd.read_csv(\"submission.csv\")\ndf_test2.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"bc24f0b3c2f0498e52f9f39a4185e0a39f85842c"},"cell_type":"code","source":"import random\n\nl = {0: \"Cat\", 1: \"Dog\"} \n\nn = len(test_files)\nf = list(np.arange(1,n))\n\nc = 20\nr =random.sample(f, c)\nnrows = 4\nncols = 5\nfig, ax = plt.subplots(nrows=nrows, ncols=ncols, figsize=(nrows*5, ncols*5))    \nfor i in range(c):\n    file = str(df_test2['id'][r[i]])+\".jpg\"\n    path = testing_dir+\"/\"+file\n    img = plt.imread(path)\n    plt.subplot(4, 5, i+1)\n    plt.imshow(img, aspect='auto')\n    plt.xticks([])\n    plt.yticks([])\n    plt.title(str(df_test2['id'][i])+\".jpg\" +\"\\n\"+ str(round(df_test2['label'][i], 2)))\nplt.show()\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"99a9edc726142653b3963bd3beb0bc33816c0e56"},"cell_type":"code","source":"","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}