{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np # linear algebra\nimport random\nimport json\nimport csv\n\nfrom matplotlib import pyplot as plt\n%matplotlib inline\n\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout, Flatten\nfrom keras.layers import Conv2D, MaxPooling2D\nfrom keras.preprocessing import image\nfrom keras import optimizers\n\nimport os","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!rm -rf ../train\n!rm -rf ../test\n!unzip -oj ../input/dogs-vs-cats/train.zip -d ../train/\n!unzip -oj ../input/dogs-vs-cats/test1.zip -d ../test/","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"TRAIN_DIR = '../train/'\nTEST_DIR = '../test/'\n\nROWS = 150\nCOLS = 150\nCHANNELS = 3\n\nBATCH_SIZE=128\nEPOCHS=10","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"original_train_images = [TRAIN_DIR+i for i in os.listdir(TRAIN_DIR)] # use this for full dataset\ntrain_dogs =   [TRAIN_DIR+i for i in os.listdir(TRAIN_DIR) if 'dog' in i]\ntrain_cats =   [TRAIN_DIR+i for i in os.listdir(TRAIN_DIR) if 'cat' in i]\n\ntest_images =  [TEST_DIR+i for i in os.listdir(TEST_DIR)]\n\n# slice datasets for memory efficiency on Kaggle Kernels, delete if using full dataset\noriginal_train_images = train_dogs[:12000] + train_cats[:12000]\nrandom.shuffle(original_train_images)\n# test_images =  test_images[:100]\n\n# section = int(len(original_train_images) * 0.8)\ntrain_images = original_train_images[:18000]\nvalidation_images = original_train_images[18000:]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def plot_arr(arr):\n    plt.figure()\n    plt.imshow(image.array_to_img(arr))\n    plt.show()\n\ndef plot(img):\n    plt.figure()\n    plt.imshow(img)\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def prep_data(images):\n    count = len(images)\n    X = np.ndarray((count, ROWS, COLS, CHANNELS), dtype=np.float32)\n    y = np.zeros((count,), dtype=np.float32)\n    \n    for i, image_file in enumerate(images):\n        img = image.load_img(image_file, target_size=(ROWS, COLS))\n        X[i] = image.img_to_array(img)\n        if 'dog' in image_file:\n            y[i] = 1.\n        if i%1000 == 0: print('Processed {} of {}'.format(i, count))\n    \n    return X, y","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train, y_train = prep_data(train_images)\nX_validation, y_validation = prep_data(validation_images)\nX_test, y_test = prep_data(test_images)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(f\"Total train: {len(X_train)}; Total test: {len(X_validation)}; Total test: {len(X_test)}\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_datagen = image.ImageDataGenerator(\n    rescale=1./255,\n    rotation_range=40,\n    width_shift_range=0.2,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,)\n\nvalidation_datagen = image.ImageDataGenerator(rescale=1./255)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_generator = train_datagen.flow(\n    X_train,\n    y_train,\n    batch_size=BATCH_SIZE)\n\nvalidation_generator = validation_datagen.flow(\n    X_validation,\n    y_validation,\n    batch_size=BATCH_SIZE)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_tmp = np.array(X_train[100:101])\ny_tmp = np.array(y_train[100:101])\n\nexample_generator = train_datagen.flow(\n    X_tmp, \n    y_tmp,\n    batch_size=BATCH_SIZE\n)\n\nplt.figure(figsize=(12, 12))\nfor i in range(0, 9):\n    plt.subplot(3, 3, i+1)\n    for X_batch, Y_batch in example_generator:\n        image = X_batch[0]\n        plt.imshow(image)\n        break\nplt.tight_layout()\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras.applications import VGG16\nfrom keras.models import Model\n\ndef create_vgg16():\n    pre_trained_model = VGG16(input_shape=(ROWS, COLS, CHANNELS), include_top=False, weights=\"imagenet\")\n\n    for layer in pre_trained_model.layers[:15]:\n        layer.trainable = False\n\n    for layer in pre_trained_model.layers[15:]:\n        layer.trainable = True\n\n    last_layer = pre_trained_model.get_layer('block5_pool')\n    last_output = last_layer.output\n\n    x = MaxPooling2D()(last_output)\n    x = Flatten()(x)\n    x = Dropout(0.25)(x)\n    x = Dense(512, activation='relu')(x)\n    x = Dense(1, activation='sigmoid')(x)\n    \n    vgg16model = Model(pre_trained_model.input, x)\n    \n    return vgg16model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"vgg16model = create_vgg16()\nvgg16model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"vgg16model.compile(loss='binary_crossentropy',\n              optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),\n              metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_steps = len(train_images)/BATCH_SIZE\nvalidation_steps = len(validation_images)/BATCH_SIZE\n\nhistory = vgg16model.fit(\n    X_train, \n    y_train, \n    epochs=EPOCHS, \n    batch_size=128, \n    verbose=2, \n    validation_data=(X_validation, y_validation)\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd\ntest_generator = validation_datagen.flow(\n    X_test,\n    y_test,\n    batch_size=BATCH_SIZE)\n\n\ntest_filenames = os.listdir(\"../test/\")\ntest_df = pd.DataFrame({\n    'filename': test_filenames\n})\nnb_samples = test_df.shape[0]\nnb_samples","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predict = vgg16model.predict(X_test)\nthreshold = 0.5\ntest_df['category'] = np.where(predict > threshold, 1,0)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Submission"},{"metadata":{"trusted":true},"cell_type":"code","source":"import seaborn as sns\nsubmission_df = test_df.copy()\nsubmission_df['id'] = submission_df['filename'].str.split('.').str[0]\nsubmission_df['label'] = submission_df['category']\nsubmission_df.drop(['filename', 'category'], axis=1, inplace=True)\nsubmission_df.to_csv('submission.csv', index=False)\n\nplt.figure(figsize=(10,5))\nsns.countplot(submission_df['label'])\nplt.title(\"(Test data)\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.chdir(\"/kaggle/working/\")\nsubmission_df.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}