{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport math\nimport IPython.display as ipd\nimport keras\nfrom keras.models import *\nfrom keras.callbacks import *\nfrom keras.layers import *\nfrom keras.preprocessing.image import random_brightness,random_rotation,random_shear,random_shift,random_zoom\nimport sklearn\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.metrics import classification_report\nfrom sklearn.metrics import confusion_matrix\nfrom sklearn.metrics import log_loss\nfrom sklearn.model_selection import train_test_split\nimport skimage\nimport skimage.transform\nimport skimage.color\nimport imageio\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport os\n\nTRAIN_DIR = \"../input/train/\"\nTEST_DIR = \"../input/test/\"\n\ntrain = pd.DataFrame()\ntrain['file'] = os.listdir(TRAIN_DIR)\ntrain['class'] = train['file'].apply(lambda x: x.split('.')[0])\ntrain['class_id'] = train['class'].apply(lambda x: 0 if x=='cat' else 1)\ntest = pd.DataFrame()\ntest['file'] = os.listdir(TEST_DIR)\ntest['id'] = test['file'].apply(lambda x: x.split('.')[0])\ntest['label'] = 0.5\n\ntrain.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"31664df46b854eacd1ee180aeea40ed41fd3f0a3"},"cell_type":"code","source":"sns.countplot(x='class', data=train);","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true,"collapsed":true},"cell_type":"code","source":"def image_generator(files, base_dir, labels=None, size=(256,256), batch_size=32, random_preproc=False, rotation_range=0, shear_range=0, shift_range=(0,0), zoom_range=(1,1)):\n    while True:\n        for i in range(0, len(files), batch_size):\n            img_batch = []\n            label_batch = []\n            for j in range(i, min(len(files), i+batch_size)):\n                img = imageio.imread(base_dir+files[j])\n                img = skimage.transform.resize(img, size, mode='reflect')\n                img = skimage.color.rgb2gray(img).reshape(size[0], size[1], 1)\n                if random_preproc:\n                    img = random_zoom(img, zoom_range,row_axis=0,col_axis=1,channel_axis=2)\n                    img = random_shear(img, shear_range,row_axis=0,col_axis=1,channel_axis=2)\n                    img = random_shift(img, shift_range[0],shift_range[1],row_axis=0,col_axis=1,channel_axis=2)\n                    img = random_rotation(img, rotation_range,row_axis=0,col_axis=1,channel_axis=2)\n                img_batch.append(img)\n                if labels is not None:\n                    label_batch.append(labels[j])\n            \n            if labels is not None:\n                yield np.array(img_batch), np.array(label_batch)\n            else:\n                yield np.array(img_batch)\n        ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"56efcb98706b42193147ff052eafca1eb448b887","collapsed":true},"cell_type":"code","source":"def make_model(size=(256,256)):\n    def make_cnn(kernel_nums, x):\n        for n in kernel_nums:\n            x = Conv2D(n, kernel_size=3, strides=1, activation='relu', padding='same')(x)\n            x = MaxPooling2D(pool_size=2, strides=2, padding='same')(x)\n            x = BatchNormalization()(x)\n            x = SpatialDropout2D(0.3)(x)\n        return Flatten()(x)\n    inp = Input((size[0],size[1],1))\n    kernel_nums = [64, 64,128,128,256,256,512,512]\n    scaled = inp\n    cnn_outs = []\n    for i in range(6):\n        scaled = AveragePooling2D(pool_size=2**i, strides=2**i)(inp)\n        cnn_outs.append(make_cnn(kernel_nums[:len(kernel_nums)-i], scaled))\n    x = concatenate(cnn_outs)\n    x = Dense(512, activation='relu')(x)\n    x = Dropout(0.3)(x)\n    out = Dense(1, activation='sigmoid')(x)\n    return Model(inp, out)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2599e41935f7446d8ccf431048d2e9b2999f43e0"},"cell_type":"code","source":"SIZE = (256,256)\nmodel = make_model(size=SIZE)\nmodel.summary()\n#keras.utils.plot_model(model, to_file='model.png', show_shapes=True)\n#ipd.Image(filename='model.png')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"863c1f3dabeabfe37223ffd0e4a477bc36bd8fba"},"cell_type":"code","source":"model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])\nbatch_size=150\nX_train, X_valid, y_train, y_valid = train_test_split(train['file'].values, train['class_id'].values, test_size=0.1)\nmodel.fit_generator(image_generator(X_train, TRAIN_DIR, labels=y_train, size=SIZE, batch_size=batch_size, random_preproc=False, rotation_range=10, shear_range=5, shift_range=(0.1,0.1), zoom_range=(0.8,1.2)),\n                    epochs=25,\n                    steps_per_epoch=int(math.ceil(len(y_train)/batch_size)),\n                    validation_data=image_generator(X_valid, TRAIN_DIR, labels=y_valid, size=SIZE, batch_size=batch_size, random_preproc=False),\n                    validation_steps=int(math.ceil(len(y_valid)/batch_size)),\n                    callbacks=[EarlyStopping(monitor='val_loss',patience=3,verbose=0)],\n                    verbose=1\n                   )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"85f122f7486f060e0c335efb4c9f6b6637128da5"},"cell_type":"code","source":"predicted_probs = model.predict_generator(image_generator(X_valid, TRAIN_DIR, size=SIZE, batch_size=batch_size, random_preproc=False),\n                                             steps=int(math.ceil(len(y_valid)/batch_size))\n                                            )\npredicted = np.round(predicted_probs)\nprint(classification_report(y_valid, predicted))\nprint(log_loss(y_valid, predicted_probs))\nsns.heatmap(confusion_matrix(y_valid, predicted), annot=True);","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"collapsed":true,"_uuid":"f82384667cf93586794fcaac283f4bf33cdc7282"},"cell_type":"code","source":"predicted_probs = model.predict_generator(image_generator(test['file'], TEST_DIR, size=SIZE, batch_size=batch_size, random_preproc=False),\n                                             steps=int(math.ceil(len(test['file'])/batch_size))\n                                            )\ntest['label'] = predicted_probs\ntest[['id','label']].to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}