{"cells":[{"metadata":{"_uuid":"65d94bb190641a74373840e55e6dcda51edca7e6"},"cell_type":"markdown","source":"## Dogs vs. Cats\n-2018. 12. 25 <br>\n-Image Binary Classification"},{"metadata":{"_uuid":"d7d65fa4865546ce530a4d7dd55945800f0abe6b"},"cell_type":"markdown","source":"#### Library Importing"},{"metadata":{"trusted":true,"_uuid":"8e98a89ce51d7a60a1e5c5ff8ba4518ddfdbd809"},"cell_type":"code","source":"import keras\nimport numpy as np\nimport pandas as pd\nfrom PIL import Image as img","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"82bd2073e2e702fb1a2b9212faf263155492d70e"},"cell_type":"code","source":"import glob\nfrom tqdm import tqdm\nimport matplotlib.pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e825a3033682621a86bd249dfe4b79fa5e648ac7"},"cell_type":"markdown","source":"#### Change Image Data Format"},{"metadata":{"trusted":true,"_uuid":"b29c2d46a49f9beb91c8f69040a477205c183a2f"},"cell_type":"code","source":"keras.backend.image_data_format()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"724f94a5ab02bc11cf6c44603349074382dc53d7"},"cell_type":"code","source":"keras.backend.set_image_data_format(\"channels_first\")\nkeras.backend.image_data_format()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"3ffcfd61f1898782527d8574cba77f3edfde79c9"},"cell_type":"markdown","source":"#### Data Preview"},{"metadata":{"trusted":true,"_uuid":"6fe2247a196ac0a98799b44400e18a039c632c44"},"cell_type":"code","source":"img.open(\"../input/train/train/dog.10001.jpg\").resize((64, 64)).convert(\"L\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"44ef72f2296139ab123f786f958bd8b5f57a2311"},"cell_type":"code","source":"img.open(\"../input/train/train/cat.10001.jpg\").resize((64, 64)).convert(\"L\")","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"4d1b16b05c50caa7e61b24c886f2d56347121474"},"cell_type":"markdown","source":"#### Data Load(for Training)"},{"metadata":{"trusted":true,"_uuid":"7d99bae32e3a32271df7af9c2c3b4426b83bf41b"},"cell_type":"code","source":"dog_train_list = glob.glob(\"../input/train/train/dog.*.jpg\")\ncat_train_list = glob.glob(\"../input/train/train/cat.*.jpg\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5b245680db316c2a73d5cf5aa80d2b7012b92991"},"cell_type":"code","source":"x_train = []\n\nfor i in tqdm(dog_train_list):\n    temp = img.open(i).resize((64, 64))\n    temp = temp.convert(\"L\")\n    \n    x_train.append((np.array(temp) - np.mean(temp)) / np.std(temp))\n    x_train.append((np.array(temp.rotate(90)) - np.mean(temp)) / np.std(temp))\n    x_train.append((np.array(temp.rotate(180)) - np.mean(temp)) / np.std(temp))\n    x_train.append((np.array(temp.rotate(270)) - np.mean(temp)) / np.std(temp))\n    \n#    if not idx % 200:\n#        print(idx)\n\ny_train = np.tile(1, len(dog_train_list)*4)\nprint(\"dog's images loading is done\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0fe2a8e7b2267cc677f0264352a28f4148b407a0"},"cell_type":"code","source":"for i in tqdm(cat_train_list):\n    temp = img.open(i).resize((64, 64))\n    temp = temp.convert(\"L\")\n    \n    x_train.append((np.array(temp) - np.mean(temp)) / np.std(temp))\n    x_train.append((np.array(temp.rotate(90)) - np.mean(temp)) / np.std(temp))\n    x_train.append((np.array(temp.rotate(180)) - np.mean(temp)) / np.std(temp))\n    x_train.append((np.array(temp.rotate(270)) - np.mean(temp)) / np.std(temp))\n    \ny_train = np.concatenate((y_train, np.tile(0, len(cat_train_list)*4))).astype(\"uint8\")\nprint(\"cat's images loading is done\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"94be11a57e484b1d25c4dc4a9fa3cbb5445e446d"},"cell_type":"code","source":"a = np.asarray(x_train)\nx_train = a.reshape(a.shape[0], 1, a.shape[1], a.shape[2])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4c1db669091d670cddebbab00e5b3ff51c3a7770"},"cell_type":"code","source":"del(a)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b2884a7e9f33925d702b3bdca5fcaf1310f4e853"},"cell_type":"code","source":"x_train.shape","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"87dfa52fdf2b1d500403dab5a9fbec212c00c43a"},"cell_type":"markdown","source":"---"},{"metadata":{"_uuid":"e5feca7bb92c0eb4dab5f81db29e19f7a1efde47"},"cell_type":"markdown","source":"#### Model Generate"},{"metadata":{"trusted":true,"_uuid":"22df099e64774a50850c3fb673ef472e07535a36"},"cell_type":"code","source":"LeakyReLU = keras.layers.LeakyReLU(alpha=0.01)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3d5ec229e319ae036ea398e21150aaa13c14fb6c"},"cell_type":"code","source":"model = keras.models.Sequential()\n\nmodel.add(keras.layers.Conv2D(filters=32, kernel_size=(2, 2), input_shape=(1, 64, 64)))\nmodel.add(LeakyReLU)\nmodel.add(keras.layers.Dropout(rate=0.3))\n\nmodel.add(keras.layers.Conv2D(filters=32, kernel_size=(3, 3)))\nmodel.add(LeakyReLU)\nmodel.add(keras.layers.Dropout(rate=0.3))\n\nmodel.add(keras.layers.Conv2D(filters=64, activation=\"relu\", kernel_size=(3, 3)))\nmodel.add(keras.layers.MaxPooling2D(pool_size=(3, 3)))\nmodel.add(keras.layers.Dropout(rate=0.3))\n\nmodel.add(keras.layers.Flatten())\nmodel.add(keras.layers.Dense(units=12, activation=\"relu\"))\nmodel.add(keras.layers.Dense(units=1, activation=\"sigmoid\"))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6a92b5b9c9a3632456b6587bf883d3553bd5462a"},"cell_type":"code","source":"model.compile(optimizer=keras.optimizers.SGD(), loss=keras.losses.binary_crossentropy, metrics=[\"binary_accuracy\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8ed4393f75be2f89a6e232fdc609b22f3912c423"},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"23f7a898f35767ccf86c65448ca9fab17670f86c"},"cell_type":"markdown","source":"#### Model Training"},{"metadata":{"trusted":true,"_uuid":"4833f4377f403570deb8f5f83c7e9b031458b688"},"cell_type":"code","source":"model.fit(x=x_train, y=y_train, epochs=10, validation_split=0.1, shuffle=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c9f7c48a254fea1691dbb799d9a88aa943c1b5b7"},"cell_type":"code","source":"model.save(\"Dogs_Cats_model_01.h5\")","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"7533738d81984b63b51a8c9cc2acb313f5db672b"},"cell_type":"markdown","source":"#### Extra Model Training"},{"metadata":{"trusted":true,"_uuid":"620eeace3a5e81eac85d52cdb623a3206c73134b"},"cell_type":"code","source":"model = keras.models.load_model(\"Dogs_Cats_model_01.h5\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f509135411b2a8e43125accdf36bcac5120bcfe4"},"cell_type":"code","source":"model.fit(x=x_train, y=y_train, epochs=2, validation_split=0.1, shuffle=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3ecb4338cb5056476e0197e93ffedddb2a947468"},"cell_type":"code","source":"len(model.history.history[\"binary_accuracy\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c7c4e3ecdb8000340c498d702e9b890e6c28d7e1"},"cell_type":"markdown","source":"#### Model Training History"},{"metadata":{"trusted":true,"_uuid":"401d4c81e06c56ce5fb603052975ed7903c5e7b3"},"cell_type":"code","source":"np.arange(1, len(model.history.history[\"binary_accuracy\"])+1, 1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"79d9a3a3d92e0440fb9a2def54c19b35545bfe2b"},"cell_type":"code","source":"plt.figure(figsize=(20, 7))\nplt.subplot(1, 2, 1)\nplt.plot(model.history.history[\"binary_accuracy\"])\nplt.plot(model.history.history[\"val_binary_accuracy\"])\nplt.title(\"Model Accuracy\")\nplt.ylabel(\"Accuracy\")\nplt.xlabel(\"Epoch\")\nplt.legend([\"Train\", \"Val\"], loc=\"upper left\")\n#plt.xticks(np.arange(0, len(model.history.history[\"binary_accuracy\"]), 1))\n\nplt.xticks(np.arange(len(model.history.history[\"binary_accuracy\"])), np.arange(1, len(model.history.history[\"binary_accuracy\"])+1, 1))\n\nplt.subplot(1, 2, 2)\nplt.plot(model.history.history[\"loss\"])\nplt.plot(model.history.history[\"val_loss\"])\nplt.title(\"Model Loss\")\nplt.ylabel(\"Loss\")\nplt.xlabel(\"Epoch\")\nplt.legend([\"Train\", \"Val\"], loc=\"upper right\")\nplt.xticks(np.arange(len(model.history.history[\"loss\"])), np.arange(1, len(model.history.history[\"loss\"])+1, 1))\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f16ee2772c75b38815e0fe0f894e2017a62ab96c"},"cell_type":"markdown","source":"---"},{"metadata":{"_uuid":"65f6fc068cc65f455bbf3ecb2742af0cc7e09274"},"cell_type":"markdown","source":"#### Data Load(for Test)"},{"metadata":{"trusted":true,"_uuid":"3fc08c899427a1222840540ac7242f1326294132"},"cell_type":"code","source":"test_list = glob.glob(\"../input/test1/test1/*.jpg\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"30a28ff89b83a5066becc7963ddd6a049b01b5d4"},"cell_type":"code","source":"x_test = []\n\nfor i in tqdm(test_list):\n    temp = img.open(i).resize((64, 64))\n    temp = temp.convert(\"L\")\n    x_test.append((np.array(temp) - np.mean(temp)) / np.std(temp))\n\nprint(\"test images loading is done\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"95f05592233351c8a1c505cc8718da8cc10d86cc"},"cell_type":"code","source":"a = np.asarray(x_test)\nx_test = a.reshape(a.shape[0], 1, a.shape[1], a.shape[2])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"dff23c712665c31c023bf96321ffcd2baf045114"},"cell_type":"code","source":"del(a)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c3d3f5ed63d95b27ccfb72cdba637f9522b6f77e"},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"848c1dcd4aa4bee440270fa01c774a912fbd5300"},"cell_type":"markdown","source":"#### Predict"},{"metadata":{"trusted":true,"_uuid":"84dbb935751f294401fb88fd78ce5c3501cc3482"},"cell_type":"code","source":"result = model.predict(x=x_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b1e37c5b68ccfeaebc8fc5f84dda284906dda1e0"},"cell_type":"code","source":"idx = []\nfor i in test_list:\n    idx.append(i[21:-4])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"67d916137dda9f65974ea0e0b503b2949e5b855b"},"cell_type":"code","source":"result = result.reshape(result.shape[0])\nresult[result>0.5] = 1\nresult[result<0.5] = 0","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7b5569de50e6d2d10023532ff22e32d976f2575d"},"cell_type":"code","source":"submission = {\"id\": idx, \"label\": result}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"862f14d37259bdffa7b95c9bfa9ad8d7742fa038"},"cell_type":"code","source":"pd.DataFrame(submission).to_csv(\"submission.csv\", index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"acd0ea9caa71c49051de7f925321a606ce05213a"},"cell_type":"code","source":"pd.DataFrame(submission)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"813a08e53b7a25ab81845e2e8e1c92d36c1cd338"},"cell_type":"markdown","source":"The end of this notebook"}],"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}