{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport keras\nimport os\nimport cv2\nimport csv\nimport shutil\nfrom glob import glob\nfrom PIL import Image\nfrom IPython.display import FileLink","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(os.listdir(\"../input/dogs-vs-cats-redux-kernels-edition/\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!unzip ../input/dogs-vs-cats-redux-kernels-edition/train.zip","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!ls train/ | wc -l","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.mkdir('valid/')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.mkdir('train/cats/')\nos.mkdir('train/dogs/')\nos.mkdir('valid/cats/')\nos.mkdir('valid/dogs/')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cats = glob('train/cat*.jpg')\nshuf = np.random.permutation(cats)\n\nfor i in range(len(cats)): shutil.move(shuf[i], 'train/cats/')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!ls train/cats | wc -l","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!ls train/dogs | wc -l","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!ls train/ | wc -l","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dogs = glob('train/dog*.jpg')\nshuf = np.random.permutation(dogs)\n\nfor i in range(len(dogs)): shutil.move(shuf[i], 'train/dogs/')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!ls train/dogs | wc -l","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!ls train/ | wc -l","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cats_valid = glob('train/cats/*.jpg')\nshuf = np.random.permutation(cats_valid)\n\nfor i in range(int(len(cats_valid) / 10)): shutil.move(shuf[i], 'valid/cats/')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dogs_valid = glob('train/dogs/*.jpg')\nshuf = np.random.permutation(dogs_valid)\n\nfor i in range(int(len(dogs_valid) / 10)): shutil.move(shuf[i], 'valid/dogs/')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!ls train/cats | wc -l","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!ls train/dogs | wc -l","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from __future__ import division, print_function\n\nimport os, json\nfrom glob import glob\nimport numpy as np\nfrom scipy import misc, ndimage\nfrom scipy.ndimage.interpolation import zoom\n\nfrom keras import backend as K\nfrom keras.layers.normalization import BatchNormalization\nfrom keras.utils.data_utils import get_file\nfrom keras.models import Sequential\nfrom keras.layers.core import Flatten, Dense, Dropout, Lambda\nfrom keras.layers.convolutional import MaxPooling2D, ZeroPadding2D, Conv2D\nfrom keras.layers.pooling import GlobalAveragePooling2D\nfrom keras.optimizers import SGD, RMSprop, Adam\nfrom keras.preprocessing import image\nfrom keras.models import model_from_json\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!wget https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels.h5\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"path = 'data/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"vgg_mean = np.array([123.68, 116.779, 103.939], dtype=np.float32)\nvgg_mean.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def vgg_preprocess(x):\n    \"\"\"\n        Subtracts the mean RGB value, and transposes RGB to BGR.\n        The mean RGB was computed on the image set used to train the VGG model.\n        Args: \n            x: Image array (height x width x channels)\n        Returns:\n            Image array (height x width x transposed_channels)\n    \"\"\"\n    vgg_mean = np.array([123.68, 116.779, 103.939], dtype=np.float32)\n    x = x - vgg_mean\n    return x[:, ::-1] # reverse axis rgb->bgr","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = Sequential()\nmodel.add(Lambda(vgg_preprocess, input_shape = (224, 224, 3), output_shape = (224, 224, 3)))\n\nmodel.add(Conv2D(64, (3, 3), padding = 'same', activation = 'relu'))\nmodel.add(Conv2D(64, (3, 3), padding = 'same', activation = 'relu'))\nmodel.add(MaxPooling2D((2, 2), strides = (2, 2)))\n\nmodel.add(Conv2D(128, (3, 3), padding = 'same', activation = 'relu'))\nmodel.add(Conv2D(128, (3, 3), padding = 'same', activation = 'relu'))\nmodel.add(MaxPooling2D((2, 2), strides = (2, 2)))\n\nmodel.add(Conv2D(256, (3, 3), padding = 'same', activation = 'relu'))\nmodel.add(Conv2D(256, (3, 3), padding = 'same', activation = 'relu'))\nmodel.add(Conv2D(256, (3, 3), padding = 'same', activation = 'relu'))\nmodel.add(MaxPooling2D((2, 2), strides = (2, 2)))\n\nmodel.add(Conv2D(512, (3, 3), padding = 'same', activation = 'relu'))\nmodel.add(Conv2D(512, (3, 3), padding = 'same', activation = 'relu'))\nmodel.add(Conv2D(512, (3, 3), padding = 'same', activation = 'relu'))\nmodel.add(MaxPooling2D((2, 2), strides = (2, 2)))\n\nmodel.add(Conv2D(512, (3, 3), padding = 'same', activation = 'relu'))\nmodel.add(Conv2D(512, (3, 3), padding = 'same', activation = 'relu'))\nmodel.add(Conv2D(512, (3, 3), padding = 'same', activation = 'relu'))\nmodel.add(MaxPooling2D((2, 2), strides = (2, 2)))\n\nmodel.add(Flatten())\nmodel.add(Dense(4096, activation = 'relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(4096, activation = 'relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(1000, activation = 'softmax'))\n\nmodel.compile(optimizer = Adam(lr = 0.001), loss = 'categorical_crossentropy', metrics = ['accuracy'])\n\nfname = 'weights/vgg16_weights_tf_dim_ordering_tf_kernels.h5'\nmodel.load_weights(fname)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.pop()\nfor layer in model.layers[:-1]: layer.trainable = False\nmodel.compile(optimizer = Adam(lr = 0.001), loss = 'categorical_crossentropy', metrics = ['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.add(Dense(2, activation = 'softmax'))\nmodel.compile(optimizer = Adam(lr = 0.001), loss = 'categorical_crossentropy', metrics = ['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_size = 128","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"datagen = image.ImageDataGenerator()\ntrn_batches = datagen.flow_from_directory('train/', target_size = (224, 224),\n            class_mode = 'categorical', shuffle = True, batch_size = batch_size)\n\nval_batches = datagen.flow_from_directory('valid/', target_size = (224, 224),\n            class_mode = 'categorical', shuffle = True, batch_size = batch_size)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit_generator(trn_batches, steps_per_epoch = trn_batches.n / batch_size, epochs = 1, validation_data = val_batches, \n                    validation_steps = val_batches.n / batch_size)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit_generator(trn_batches, steps_per_epoch = trn_batches.n / batch_size, epochs = 5, validation_data = val_batches, \n                    validation_steps = val_batches.n / batch_size)\n","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":1}