{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\n# import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n# import cv2, \nimport random\nimport json\nimport csv\n\nfrom matplotlib import pyplot as plt\n%matplotlib inline\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\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\n# print(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"np.random.seed(1337)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"72b5f576e3c6d20f6762601b71b63043bac62a16"},"cell_type":"code","source":"TRAIN_DIR = '../input/train/'\nTEST_DIR = '../input/test/'\n\nROWS = 150\nCOLS = 150\nCHANNELS = 3\n\nBATCH_SIZE=128","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a962a69c4a7cea8ec2bab9b837e64124746c331a"},"cell_type":"code","source":"\noriginal_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,"_uuid":"4917f1c3a870b10b2746585aef1c58488f94394e"},"cell_type":"code","source":"len(train_images)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2e196095f1830cb18f92ff06c9488bf0e357e093"},"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,"_uuid":"af7a089cadf933fdd24ce4293284a0ef387dc1f0"},"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\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"993f98e83874421776dec191c6613a5d5de4274e"},"cell_type":"code","source":"X_train, y_train = prep_data(train_images)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9204d9cdc3a90a1bfc007b8aa1bc718639782b5a"},"cell_type":"code","source":"X_validation, y_validation = prep_data(validation_images)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"755f51d4fddb7a7d25f7333f34416de7c128b80d"},"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,"_uuid":"a8b7fdb6d2e20e4f41a2cfb67d7d65de99a255b6"},"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,"_uuid":"8df441de551a91b5ffae9b01784e93477c04e3b5"},"cell_type":"code","source":"# Based model from https://www.kaggle.com/keogh24/dogs-v-cats-keras\ndef create_model():\n    model = Sequential()\n    model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(ROWS, COLS, CHANNELS)))\n    model.add(Conv2D(32, (3, 3), activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2, 2)))\n    model.add(Conv2D(64, (3, 3), activation='relu'))\n#     model.add(Conv2D(64, (3, 3), activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2,2)))\n    model.add(Conv2D(128, (3, 3), activation='relu'))\n#     model.add(Conv2D(128, (3, 3), activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2,2)))\n    model.add(Conv2D(128, (3, 3), activation='relu'))\n#     model.add(MaxPooling2D(pool_size=(2,2)))\n#     model.add(Conv2D(256, (3, 3), activation='relu'))\n#     model.add(Conv2D(256, (3, 3), activation='relu'))\n    model.add(MaxPooling2D(pool_size=(2,2)))\n    # model.add(Dropout(0.5))\n\n    model.add(Flatten())\n    model.add(Dropout(0.5))\n    model.add(Dense(512, activation='relu'))\n    # model.add(Dense(1024, activation='relu'))\n    # model.add(Dense(1000, activation='relu'))\n    # model.add(Dropout(0.5))\n    model.add(Dense(1, activation='sigmoid'))\n    \n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7e2be404c23191fb60801d9da68b0e5d7472604d","scrolled":false},"cell_type":"code","source":"model = create_model()\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e33253c1d913dd98390ae223168ccbc0a19d9f5e"},"cell_type":"code","source":"model.compile(loss='binary_crossentropy',\n             optimizer=optimizers.RMSprop(lr=1e-4),\n             metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6bdb762d98172f40d986c1d279fe3270663874d2","scrolled":false},"cell_type":"code","source":"train_steps = len(train_images)/BATCH_SIZE\nvalidation_steps = len(validation_images)/BATCH_SIZE\n\nhistory = model.fit_generator(\n    train_generator,\n    steps_per_epoch=train_steps,\n    epochs=100,\n    validation_data=validation_generator,\n    validation_steps=validation_steps,\n    verbose=2)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9fd36721e94df624df1b589611fb37be269d3fb5"},"cell_type":"code","source":"acc = history.history['acc']\nval_acc = history.history['val_acc']\nloss = history.history['loss']\nval_loss = history.history['val_loss']\nepochs = range(1, len(acc) + 1)\nplt.plot(epochs, acc, 'bo', label='Training acc')\nplt.plot(epochs, val_acc, 'b', label='Validation acc')\nplt.title('Training and validation accuracy')\nplt.legend()\n\nplt.figure()\n\nplt.plot(epochs, loss, 'bo', label='Training loss')\nplt.plot(epochs, val_loss, 'b', label='Validation loss')\nplt.title('Training and validation loss')\nplt.legend()\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c19fa5c22fd7db031ec033f41b57aa03afc352c7"},"cell_type":"code","source":"model.save('dogs-v-cat-data-augmentation-04.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e7b0f9f091ff5bffc421a431f08c696ad9156623"},"cell_type":"code","source":"with open('dogs-v-cat-data-augmentation-04-history.json', 'w') as f:\n    json.dump(history.history, f)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4f07ac96245b7ae3f32201f4160fe738fe662b98"},"cell_type":"code","source":"evaluation_images = train_dogs[12000:12500] + train_cats[12000:12500]\nrandom.shuffle(evaluation_images)\n\nX_evaluation, y_evaluation = prep_data(evaluation_images)\nX_evaluation /= 255","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ed19a64215fce41de8c9096ef3ed1cafcae1629f"},"cell_type":"code","source":"evaluation = model.evaluate(X_evaluation, y_evaluation)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"42f5591d8489b2dc30f4dc9808576f7d1496df7c"},"cell_type":"code","source":"evaluation","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"647e44453b08e5d80c2a391894d68295793b8ea3"},"cell_type":"code","source":"X_test, _ = prep_data(test_images)\nX_test /= 255.","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d430d5483accc3e2f84348da49f28ca9ba474e3c"},"cell_type":"code","source":"predictions = model.predict(X_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":false,"_uuid":"120e735dcb81a09e9ce3d881436d11cb5d7b36aa"},"cell_type":"code","source":"for i in range(0,10):\n    if predictions[i, 0] >= 0.5: \n        print('I am {:.2%} sure this is a Dog'.format(predictions[i][0]))\n    else: \n        print('I am {:.2%} sure this is a Cat'.format(1-predictions[i][0]))\n\n    plt.imshow(image.array_to_img(X_test[i]))\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4e66901355fefb3921cf0ee61b450d0c8e9bcde5"},"cell_type":"code","source":"with open('dogs-v-cat-data-augmentation-04-results.csv', 'w') as csvfile:\n    writer = csv.writer(csvfile, delimiter=',',\n                        quotechar='|', quoting=csv.QUOTE_MINIMAL)\n    writer.writerow(['id', 'label'])\n    for i, path in enumerate(test_images):\n        basename = os.path.basename(path)\n        name = os.path.splitext(basename)[0]\n        writer.writerow([name, predictions[i, 0]])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e58a0f58a71f8e63f72e9f28e7b3bf39711a1576"},"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}