{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","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\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nfrom keras import layers\nfrom keras import models\nfrom keras import optimizers\nimport tensorflow as tf\nimport tensorflow.keras.layers as layers\nimport cv2\n\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 過学習を起こすであろうモデル","metadata":{}},{"cell_type":"markdown","source":"## データの下準備","metadata":{}},{"cell_type":"code","source":"# zipファイルの解凍\n!unzip /kaggle/input/dogs-vs-cats-redux-kernels-edition/test.zip\n!unzip /kaggle/input/dogs-vs-cats-redux-kernels-edition/train.zip","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# フォルダの作製\n!mkdir data\n!mkdir data/train\n!mkdir data/train/cats\n!mkdir data/train/dogs\n!mkdir data/vali\n!mkdir data/vali/cats\n!mkdir data/vali/dogs\n\nprint(\"finish\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 学習用画像枚数（変更可。合計は12500以下にすること）\ntrain_img = 2000\nvali_img = 1000\n\nprint(\"finish\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# データの振り分け先指定\n# train内にdogとcatの画像が混合しているためフォルダに応じて振り分ける\n# 移動元のフォルダ\noriginal_dataset_dir = \"/kaggle/working/train\"\n# 移動先のtrain_catフォルダ\ntrain_cats_dir = \"/kaggle/working/data/train/cats\"\n# 移動先のtrain_dogフォルダ\ntrain_dogs_dir = \"/kaggle/working/data/train/dogs\"\n\nprint(\"finish\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 画像振り分け\nimport shutil\nfnames = [\"cat.{}.jpg\".format(i) for i in range(train_img)]\n\nfor fname in fnames:\n    from_data = original_dataset_dir + \"/\" + fname\n    to_data = train_cats_dir + \"/\" + fname\n    shutil.copyfile(from_data, to_data)\n    \nfnames = [\"dog.{}.jpg\".format(i) for i in range(train_img)]\n\nfor fname in fnames:\n    from_data = original_dataset_dir + \"/\" + fname\n    to_data = train_dogs_dir + \"/\" + fname\n    shutil.copyfile(from_data, to_data)\n    \nprint(\"finish\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"original_dataset_dir = \"/kaggle/working/train\"\n# 移動先のvalidation_catフォルダ\nvali_cats_dir = \"/kaggle/working/data/vali/cats\"\n# 移動先のvalidation_catフォルダ\nvali_dogs_dir = \"/kaggle/working/data/vali/dogs\"\n\nprint(\"finish\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fnames = [\"cat.{}.jpg\".format(i+train_img) for i in range(vali_img)]\n\nfor fname in fnames:\n    from_data = original_dataset_dir + \"/\" + fname\n    to_data = vali_cats_dir + \"/\" + fname\n    shutil.copyfile(from_data, to_data)\n    \nfnames = [\"dog.{}.jpg\".format(i+train_img) for i in range(vali_img)]\n\nfor fname in fnames:\n    from_data = original_dataset_dir + \"/\" + fname\n    to_data = vali_dogs_dir + \"/\" + fname\n    shutil.copyfile(from_data, to_data)\n    \nprint(\"finish\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 画像枚数の確認\nprint(\"train cat:{}\".format(len(os.listdir(train_cats_dir))))\nprint(\"train dog:{}\".format(len(os.listdir(train_dogs_dir))))\n\nprint(\"vali cat:{}\".format(len(os.listdir(vali_cats_dir))))\nprint(\"vali dog:{}\".format(len(os.listdir(vali_dogs_dir))))\n\n# train cat:2000\n# train dog:2000\n# vali cat:1000\n# vali dog:1000","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 訓練データの前準備","metadata":{}},{"cell_type":"code","source":"from keras.preprocessing.image import ImageDataGenerator\n\n#訓練データ\ntrain_dir = ('/kaggle/working/data/train') \n#教師データ\nvalidation_dir = ('/kaggle/working/data/vali') \n\n#データの正規化 \ntrain_datagen = ImageDataGenerator(rescale=1./255)\nvalidation_datagen = ImageDataGenerator(rescale=1./255)\n\ntrain_generator = train_datagen.flow_from_directory(\n    train_dir,\n    target_size=(150,150),\n    batch_size=32,\n    class_mode=\"binary\"\n)\n\nvalidation_generator = validation_datagen.flow_from_directory(\n    validation_dir,\n    target_size=(150,150),\n    batch_size=32,\n    class_mode=\"binary\"\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# それぞれのラベルの確認\nprint(train_generator.class_indices)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# モデルの定義","metadata":{}},{"cell_type":"code","source":"import keras\nfrom keras.models import Sequential\nfrom keras.layers import Dense,Flatten\nfrom keras.layers import Conv2D,MaxPooling2D\nfrom keras import optimizers\n\nmodel = Sequential()\nmodel.add(Conv2D(32, kernel_size = (3, 3), activation = \"relu\", input_shape = (150, 150, 3)))\nmodel.add(MaxPooling2D(pool_size = (2, 2)))\nmodel.add(Conv2D(64, kernel_size = (3, 3), activation = \"relu\"))\nmodel.add(MaxPooling2D(pool_size = (2, 2)))\nmodel.add(Conv2D(128, kernel_size = (3, 3), activation = \"relu\"))\nmodel.add(MaxPooling2D(pool_size = (2, 2)))\nmodel.add(Conv2D(128, kernel_size = (3, 3), activation = \"relu\"))\nmodel.add(MaxPooling2D(pool_size = (2, 2)))\nmodel.add(Conv2D(256, kernel_size = (3, 3), activation = \"relu\"))\nmodel.add(MaxPooling2D(pool_size = (2, 2)))\nmodel.add(Flatten())\nmodel.add(Dense(512, activation = \"relu\"))\nmodel.add(Dense(1, activation = \"sigmoid\"))\n\nadam = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)\nmodel.compile(loss=\"binary_crossentropy\",\n             optimizer=adam,\n             metrics = [\"accuracy\"])\n\n# モデルの表示\nmodel.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 学習と学習モデルの保存","metadata":{}},{"cell_type":"code","source":"#学習開始\nhistory = model.fit_generator(train_generator,\n                              epochs = 50,\n                              verbose = 1,\n                              validation_data=(validation_generator),\n                              steps_per_epoch=(train_img * 2)/32,\n                              validation_steps=(vali_img)/32)\n\n#学習モデルの保存\nmodel.save('../working/dog_cat.h5')\n\nprint(\"finish\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 結果の表示（Loss）\nimport matplotlib.pyplot as plt\n\nloss = history.history[\"loss\"]\nval_loss = history.history[\"val_loss\"]\n\nlearning_count = len(loss) + 1\n\nplt.plot(range(1, learning_count), loss, marker = \"+\", label = \"loss\")\nplt.plot(range(1, learning_count), val_loss, marker = \".\", label = \"val_loss\")\nplt.legend(loc = \"best\", fontsize = 10)\nplt.xlabel(\"learning_count\")\nplt.ylabel(\"loss\")\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 結果の表示（正解率）\naccuracy = history.history[\"accuracy\"]\nval_accuracy = history.history[\"val_accuracy\"]\n\nkearning_count = len(loss) + 1\n\nplt.plot(range(1, learning_count), accuracy, marker = \"+\", label = \"laccuracyoss\")\nplt.plot(range(1, learning_count), val_accuracy, marker = \".\", label = \"val_accuracy\")\nplt.legend(loc = \"best\", fontsize = 10)\nplt.xlabel(\"learning_count\")\nplt.ylabel(\"accuracy\")\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# モデルを用いたテストデータの予測\n途中で終了することがあるのでcsvへの書き出しは半分ずつ分割で行う","metadata":{}},{"cell_type":"code","source":"import keras.utils as image\nfrom keras.utils import load_img, img_to_array\nimport re\nimport csv\nimport glob\n\n# テストデータのパスを取得\np = re.compile(r'\\d+')\nimcount = 1\ntest_list = glob.glob('/kaggle/working/test/*.jpg')\ntest_list = sorted(test_list,key=lambda s: int(p.search(s).group()))\n\n#モデルの読み込み\nmodel = models.load_model('/kaggle/working/dog_cat.h5')\n\n#csv書き込み（テストデータ1～テストデータ6250）\nwith open('../working/submission.csv', 'w') as f:\n  writer= csv.writer(f, lineterminator='\\n')\n  writer.writerow(['id', 'label'])\n  for i in range(6250):\n    j = test_list[i]\n    img = image.load_img(j, target_size=(150, 150))\n    x = img_to_array(img)\n    x = np.expand_dims(x, axis=0)\n    x = x / 255.0\n    result_predict = model.predict(x)\n    writer.writerow([imcount, result_predict[0][0]])\n    imcount += 1\n    print(i)\n    \nprint(\"finish\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#csv書き込み（テストデータ6250～テストデータ12500）\nwith open('../working/submission.csv', 'a') as f:\n  writer= csv.writer(f, lineterminator='\\n')\n  for i in range(6250, 12500):\n    j = test_list[i]\n    img = image.load_img(j, target_size=(150, 150))\n    x = img_to_array(img)\n    x = np.expand_dims(x, axis=0)\n    x = x / 255.0\n    result_predict = model.predict(x)\n    writer.writerow([imcount, result_predict[0][0]])\n    imcount += 1\n    print(i)\n    \nprint(\"finish\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"学習10000データ、検証2000データ  \nスコア0.88025","metadata":{}}]}