{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","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":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"print(os.listdir(\"../input/dogs-vs-cats-redux-kernels-edition/\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true},"cell_type":"code","source":"!unzip -q ../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":"import tensorflow as tf\nimport tensorflow.keras as keras","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from 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","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"datagen = image.ImageDataGenerator(horizontal_flip=True, zoom_range=0.5, shear_range=0.25, rotation_range=0.35, height_shift_range=0.25, \n                                   width_shift_range=0.25, brightness_range=(0.15, 0.30))\ntrn_batches = datagen.flow_from_directory('train/', target_size = (224, 224), class_mode = 'categorical', shuffle = True, batch_size = 64)\n\nval_batches = datagen.flow_from_directory('valid/', target_size = (224, 224), class_mode = 'categorical', shuffle = True, batch_size = 64)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true},"cell_type":"code","source":"model = Sequential()\n\nmodel.add(Conv2D(32, (3, 3), padding = 'same', activation = 'relu', input_shape = (224, 224, 3)))\nmodel.add(Conv2D(32, (3, 3), padding = 'same', activation = 'relu'))\nmodel.add(MaxPooling2D((2, 2), strides = (2, 2)))\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(Flatten())\nmodel.add(Dense(1024, activation = 'relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(1024, activation = 'relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(2, activation = 'softmax'))\n\nmodel.compile(optimizer = Adam(lr = 0.001), loss = 'categorical_crossentropy', metrics = ['accuracy'])\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit_generator(trn_batches, steps_per_epoch = trn_batches.n / 128, epochs = 1, validation_data = val_batches, validation_steps = val_batches.n / 128)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.save_weights('model_weight.h5')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.read_csv('../input/dogs-vs-cats-redux-kernels-edition/sample_submission.csv')\ndf.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!unzip -q ../input/dogs-vs-cats-redux-kernels-edition/test.zip","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!mkdir test/unk/","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!mv test/*.jpg test/unk/","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test = datagen.flow_from_directory('test/', target_size=(224, 224), batch_size=64)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"results = model.predict_generator(test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"results","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"filenames = [file.split('/')[1].replace('.jpg', '') for file in test.filenames]\nfilenames[:2]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"results_df = pd.DataFrame(data={'id': filenames, 'label': list(results[:, 1])})\nresults_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"results_df.to_csv(\"submissions.csv\", index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from IPython.display import FileLink\n\nFileLink('submissions.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"markdown","source":"!wget https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels.h5"},{"metadata":{"trusted":true},"cell_type":"markdown","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"},{"metadata":{"trusted":true},"cell_type":"markdown","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 = 'vgg16_weights_tf_dim_ordering_tf_kernels.h5'\nmodel.load_weights(fname)"},{"metadata":{"trusted":true,"collapsed":true},"cell_type":"markdown","source":"model.summary()"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"model.pop()\nfor layer in model.layers[:]: layer.trainable = False\nmodel.compile(optimizer = Adam(lr = 0.001), loss = 'categorical_crossentropy', metrics = ['accuracy'])"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"model.summary()"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"model.add(Dense(2, activation = 'softmax'))\nmodel.compile(optimizer = Adam(lr = 0.001), loss = 'categorical_crossentropy', metrics = ['accuracy'])"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"model.summary()"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"model.fit_generator(trn_batches, steps_per_epoch = trn_batches.n / 64, epochs = 1, validation_data = val_batches, validation_steps = val_batches.n / 64)"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"model.fit_generator(trn_batches, steps_per_epoch = trn_batches.n / 64, epochs = 10, validation_data = val_batches, validation_steps = val_batches.n / 64)"},{"metadata":{"trusted":true},"cell_type":"markdown","source":""}],"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}