{"cells":[{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"b499003d-2283-fa75-fbe2-0515d3c97797"},"outputs":[],"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\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\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 subprocess import check_output\nprint(check_output([\"ls\", \"../input\"]).decode(\"utf8\"))\n\n# Any results you write to the current directory are saved as output."},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"3b8a2f09-6ad8-c3e8-ad76-ef7628466f25"},"outputs":[],"source":"from keras.preprocessing.image import ImageDataGenerator\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D, MaxPooling2D\nfrom keras.layers import Activation, Dense, Dropout, Flatten\nfrom keras.callbacks import ModelCheckpoint, TensorBoard\nfrom keras import optimizers\nimport pandas as pd\n\nimport os\n\nSTEPS_PER_EPOCH = 500\nBATCH_SIZE = 64\nEPOCHS = 20\nVAL_EPOCHS = 80\n\nOPTIMIZER = optimizers.RMSprop(lr=1e-4)\n\nLOGS_PATH = 'data/logs'\nTRAIN_PATH = '../input/train'\nTEST_PATH = '../input/test'\nSAVE_PATH = 'data/predictions.csv'\nWEIGHTS_PATH = 'data/weights/dogs_cats_net_{}_{}_{}.h5'.format(BATCH_SIZE, EPOCHS, OPTIMIZER)\nCHECK_POINT_PREFIX = 'data/check_points/dogs_cats_net_{}_{}_{}'.format(BATCH_SIZE, STEPS_PER_EPOCH, OPTIMIZER)\nCHECK_POINT_PATH = CHECK_POINT_PREFIX + '.{epoch:02d}-{val_loss:.4f}.pkl'\nWEIGHTS_PATH"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"03e950d2-5c00-3357-b5ee-4e7491d4b19b"},"outputs":[],"source":"model = Sequential()\n\nmodel.add(Conv2D(32, 3, input_shape=(150, 150, 3), activation='relu', padding='same'))\nmodel.add(Conv2D(32, 3, activation='relu', padding='same'))\nmodel.add(MaxPooling2D())\n\nmodel.add(Conv2D(64, 3, activation='relu', padding='same'))\nmodel.add(Conv2D(64, 3, activation='relu', padding='same'))\nmodel.add(MaxPooling2D())\n\nmodel.add(Conv2D(128, 3, activation='relu', padding='same'))\nmodel.add(Conv2D(128, 3, activation='relu', padding='same'))\nmodel.add(MaxPooling2D())\n\nmodel.add(Conv2D(256, 3, activation='relu', padding='same'))\nmodel.add(Conv2D(256, 3, activation='relu', padding='same'))\nmodel.add(MaxPooling2D())\n\nmodel.add(Flatten())\n\nmodel.add(Dense(256, activation='relu'))\nmodel.add(Dropout(0.5))\n\nmodel.add(Dense(256, activation='relu'))\nmodel.add(Dropout(0.5))\n\nmodel.add(Dense(1, activation='sigmoid'))\n\nfor layer in model.layers:\n    print('{:20s}'.format(layer.name), layer.input_shape, layer.output_shape)\n\nmodel.compile(loss='binary_crossentropy',\n              optimizer=OPTIMIZER,\n              metrics=['accuracy'])"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"ee2c7d22-7aaf-0b06-bb66-ba23878a6e80"},"outputs":[],"source":"train_datagen = ImageDataGenerator(\n    rescale=1./255,\n    horizontal_flip=True)\n\nval_datagen = ImageDataGenerator(rescale=1./255)\n\ntrain_generator = train_datagen.flow_from_directory(\n    TRAIN_PATH,\n    target_size=(150, 150),\n    batch_size=BATCH_SIZE,\n    class_mode='binary')\n\nval_generator = val_datagen.flow_from_directory(\n    VAL_PATH,\n    target_size=(150, 150),\n    batch_size=BATCH_SIZE,\n    class_mode='binary')"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"d1f5b913-ba2d-3705-ce68-79bb99f8c431"},"outputs":[],"source":"if not os.path.exists(WEIGHTS_PATH):\n    tb = TensorBoard(LOGS_PATH)\n    checkpoint = ModelCheckpoint(CHECK_POINT_PATH, save_best_only=True)\n    model.fit_generator(\n        train_generator,\n        steps_per_epoch=STEPS_PER_EPOCH,\n        epochs=EPOCHS,\n        verbose=1,\n        callbacks=[tb, checkpoint],\n        initial_epoch=0)\n    model.save_weights(WEIGHTS_PATH)\nelse:\n    model.load_weights(WEIGHTS_PATH)"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"3de4b8a9-724a-24a0-b948-d978894f3a83"},"outputs":[],"source":"test_datagen = ImageDataGenerator(rescale=1./255)\ntest_generator = test_datagen.flow_from_directory(\n    TEST_PATH,\n    target_size=(150, 150),\n    batch_size=1,\n    class_mode=None,\n    shuffle=False)\n\nraw_files = test_generator.filenames\nraw_data = model.predict_generator(test_generator, 12500, verbose=1)"}],"metadata":{"_change_revision":0,"_is_fork":false,"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.0"}},"nbformat":4,"nbformat_minor":0}