{"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","execution":{"iopub.status.busy":"2023-07-06T06:39:20.750546Z","iopub.execute_input":"2023-07-06T06:39:20.750844Z","iopub.status.idle":"2023-07-06T06:39:30.906660Z","shell.execute_reply.started":"2023-07-06T06:39:20.750816Z","shell.execute_reply":"2023-07-06T06:39:30.905671Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"https://medium.com/lsc-psd/python%E5%88%9D%E5%BF%83%E8%80%85%E3%81%8C%E4%BD%9C%E3%82%8B-%E7%8A%AC%E7%8C%AB%E8%AA%8D%E8%AD%98ai-fc96b34da571  \nコードはじめ  \ntrain画像2000枚  \nvali画像500枚  ","metadata":{}},{"cell_type":"markdown","source":"## zipファイルの解凍","metadata":{}},{"cell_type":"code","source":"!unzip /kaggle/input/dogs-vs-cats-redux-kernels-edition/test.zip","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:39:30.908383Z","iopub.execute_input":"2023-07-06T06:39:30.908936Z","iopub.status.idle":"2023-07-06T06:39:37.851731Z","shell.execute_reply.started":"2023-07-06T06:39:30.908909Z","shell.execute_reply":"2023-07-06T06:39:37.850602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!unzip /kaggle/input/dogs-vs-cats-redux-kernels-edition/train.zip","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:39:37.853611Z","iopub.execute_input":"2023-07-06T06:39:37.854314Z","iopub.status.idle":"2023-07-06T06:39:50.603982Z","shell.execute_reply.started":"2023-07-06T06:39:37.854274Z","shell.execute_reply":"2023-07-06T06:39:50.602873Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## フォルダ作製\n## 画像振り分け","metadata":{}},{"cell_type":"code","source":"!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","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:39:50.606959Z","iopub.execute_input":"2023-07-06T06:39:50.607488Z","iopub.status.idle":"2023-07-06T06:39:57.853004Z","shell.execute_reply.started":"2023-07-06T06:39:50.607445Z","shell.execute_reply":"2023-07-06T06:39:57.851748Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"original_dataset_dir = \"/kaggle/working/train\"\ntrain_cats_dir = \"/kaggle/working/data/train/cats\"\ntrain_dogs_dir = \"/kaggle/working/data/train/dogs\"","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:39:57.854813Z","iopub.execute_input":"2023-07-06T06:39:57.855775Z","iopub.status.idle":"2023-07-06T06:39:57.863841Z","shell.execute_reply.started":"2023-07-06T06:39:57.855743Z","shell.execute_reply":"2023-07-06T06:39:57.862939Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 画像振り分け\nimport shutil\nfnames = [\"cat.{}.jpg\".format(i) for i in range(2000)]\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(2000)]\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)","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:39:57.865296Z","iopub.execute_input":"2023-07-06T06:39:57.866038Z","iopub.status.idle":"2023-07-06T06:39:59.487725Z","shell.execute_reply.started":"2023-07-06T06:39:57.866001Z","shell.execute_reply":"2023-07-06T06:39:59.486692Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"original_dataset_dir = \"/kaggle/working/train\"\nvali_cats_dir = \"/kaggle/working/data/vali/cats\"\nvali_dogs_dir = \"/kaggle/working/data/vali/dogs\"","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:39:59.489186Z","iopub.execute_input":"2023-07-06T06:39:59.489894Z","iopub.status.idle":"2023-07-06T06:39:59.494972Z","shell.execute_reply.started":"2023-07-06T06:39:59.489859Z","shell.execute_reply":"2023-07-06T06:39:59.493877Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fnames = [\"cat.{}.jpg\".format(i+2000) for i in range(1000)]\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+2000) for i in range(1000)]\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)","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:39:59.496637Z","iopub.execute_input":"2023-07-06T06:39:59.497013Z","iopub.status.idle":"2023-07-06T06:39:59.744392Z","shell.execute_reply.started":"2023-07-06T06:39:59.496976Z","shell.execute_reply":"2023-07-06T06:39:59.743427Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"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))))","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:39:59.745958Z","iopub.execute_input":"2023-07-06T06:39:59.746671Z","iopub.status.idle":"2023-07-06T06:39:59.758012Z","shell.execute_reply.started":"2023-07-06T06:39:59.746637Z","shell.execute_reply":"2023-07-06T06:39:59.757322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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":{"execution":{"iopub.status.busy":"2023-07-06T06:39:59.762182Z","iopub.execute_input":"2023-07-06T06:39:59.762719Z","iopub.status.idle":"2023-07-06T06:39:59.938033Z","shell.execute_reply.started":"2023-07-06T06:39:59.762687Z","shell.execute_reply":"2023-07-06T06:39:59.937204Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train_generator.class_indices)","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:39:59.939494Z","iopub.execute_input":"2023-07-06T06:39:59.939837Z","iopub.status.idle":"2023-07-06T06:39:59.945692Z","shell.execute_reply.started":"2023-07-06T06:39:59.939798Z","shell.execute_reply":"2023-07-06T06:39:59.944339Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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(64, kernel_size = (5, 5), activation = \"relu\", input_shape = (150, 150, 3)))\nmodel.add(MaxPooling2D(pool_size = (2, 2)))\nmodel.add(Conv2D(128, kernel_size = (5, 5), activation = \"relu\"))\nmodel.add(MaxPooling2D(pool_size = (2, 2)))\nmodel.add(Conv2D(128, kernel_size = (5, 5), activation = \"relu\"))\nmodel.add(MaxPooling2D(pool_size = (2, 2)))\nmodel.add(Flatten())\nmodel.add(Dense(256, activation = \"relu\"))\nmodel.add(Dense(1, activation = \"sigmoid\"))\n# 変更点\n# lr => learning_rate\nsgd = optimizers.SGD(learning_rate = 0.1)\nmodel.compile(loss='mean_squared_error', optimizer = sgd, metrics = [\"accuracy\"])","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:39:59.947530Z","iopub.execute_input":"2023-07-06T06:39:59.947878Z","iopub.status.idle":"2023-07-06T06:40:04.522678Z","shell.execute_reply.started":"2023-07-06T06:39:59.947842Z","shell.execute_reply":"2023-07-06T06:40:04.521749Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# #学習開始\n# history = model.fit_generator(train_generator,\n#                               epochs = 30,\n#                               verbose = 1,\n#                               validation_data=(validation_generator),\n#                               steps_per_epoch=4000/32,\n#                               validation_steps=1000/32)\n\n# #学習モデルの保存\n# model.save('../working/dog_cat2.h5')","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:40:04.523916Z","iopub.execute_input":"2023-07-06T06:40:04.524255Z","iopub.status.idle":"2023-07-06T06:40:04.532149Z","shell.execute_reply.started":"2023-07-06T06:40:04.524226Z","shell.execute_reply":"2023-07-06T06:40:04.531115Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import matplotlib.pyplot as plt\n\n# loss = history.history[\"loss\"]\n# val_loss = history.history[\"val_loss\"]\n\n# learning_count = len(loss) + 1\n\n# plt.plot(range(1, learning_count), loss, marker = \"+\", label = \"loss\")\n# plt.plot(range(1, learning_count), val_loss, marker = \".\", label = \"val_loss\")\n# plt.legend(loc = \"best\", fontsize = 10)\n# plt.xlabel(\"learning_count\")\n# plt.ylabel(\"loss\")\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:40:04.533838Z","iopub.execute_input":"2023-07-06T06:40:04.534258Z","iopub.status.idle":"2023-07-06T06:40:04.542052Z","shell.execute_reply.started":"2023-07-06T06:40:04.534224Z","shell.execute_reply":"2023-07-06T06:40:04.541135Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# accuracy = history.history[\"accuracy\"]\n# val_accuracy = history.history[\"val_accuracy\"]\n\n# kearning_count = len(loss) + 1\n\n# plt.plot(range(1, learning_count), accuracy, marker = \"+\", label = \"laccuracyoss\")\n# plt.plot(range(1, learning_count), val_accuracy, marker = \".\", label = \"val_accuracy\")\n# plt.legend(loc = \"best\", fontsize = 10)\n# plt.xlabel(\"learning_count\")\n# plt.ylabel(\"accuracy\")\n# plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:40:04.543154Z","iopub.execute_input":"2023-07-06T06:40:04.543431Z","iopub.status.idle":"2023-07-06T06:40:04.551471Z","shell.execute_reply.started":"2023-07-06T06:40:04.543403Z","shell.execute_reply":"2023-07-06T06:40:04.550577Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import re\n# p = re.compile(r'\\d+')\n# imcount = 1\n# test_list = glob.glob('/kaggle/working/test/*.jpg')\n# test_list = sorted(test_list,key=lambda s: int(p.search(s).group()))\n\n# #モデルの読み込み\n# model = models.load_model('/kaggle/working/dog_cat2.h5')\n\n# #csv書き込み\n# # [mode=”a”] とし、追記モードにします\n# # https://kirinote.com/python-csv-write/\n# with open('../working/submission.csv', 'w') as f:\n#   writer= csv.writer(f, lineterminator='\\n')\n#   writer.writerow(['id', 'label'])\n#   for i in test_list:\n#     img = image.load_img(i, 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#     imcount = i + 1\n#     writer.writerow([imcount, result_predict[0][0]])\n#     imcount += 1\n#     print(i)","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:40:04.552983Z","iopub.execute_input":"2023-07-06T06:40:04.553398Z","iopub.status.idle":"2023-07-06T06:40:04.576086Z","shell.execute_reply.started":"2023-07-06T06:40:04.553368Z","shell.execute_reply":"2023-07-06T06:40:04.575209Z"},"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, rotation_range=90)\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":{"execution":{"iopub.status.busy":"2023-07-06T06:40:04.577832Z","iopub.execute_input":"2023-07-06T06:40:04.578208Z","iopub.status.idle":"2023-07-06T06:40:04.772786Z","shell.execute_reply.started":"2023-07-06T06:40:04.578175Z","shell.execute_reply":"2023-07-06T06:40:04.770331Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import keras\nfrom keras.models import Sequential\nfrom keras.layers import Dense,Flatten,Dropout\nfrom keras.layers import Conv2D,MaxPooling2D\nfrom keras import optimizers\n\nmodel = Sequential()\nmodel.add(Conv2D(64, kernel_size = (5, 5), activation = \"relu\", input_shape = (150, 150, 3)))\nmodel.add(MaxPooling2D(pool_size = (2, 2)))\nmodel.add(Conv2D(128, kernel_size = (5, 5), activation = \"relu\"))\nmodel.add(MaxPooling2D(pool_size = (2, 2)))\nmodel.add(Conv2D(128, kernel_size = (5, 5), activation = \"relu\"))\nmodel.add(MaxPooling2D(pool_size = (2, 2)))\nmodel.add(Dropout(0.5))\nmodel.add(Flatten())\nmodel.add(Dense(256, activation = \"relu\"))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(1, activation = \"sigmoid\"))\n\n# 変更点\n# lr => learning_rate\nsgd = optimizers.SGD(learning_rate = 0.1)\nmodel.compile(loss='mean_squared_error', optimizer = sgd, metrics = [\"accuracy\"])","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:40:04.775972Z","iopub.execute_input":"2023-07-06T06:40:04.776918Z","iopub.status.idle":"2023-07-06T06:40:04.949094Z","shell.execute_reply.started":"2023-07-06T06:40:04.776872Z","shell.execute_reply":"2023-07-06T06:40:04.947535Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#学習開始\nhistory = model.fit_generator(train_generator,\n                              epochs = 30,\n                              verbose = 1,\n                              validation_data=(validation_generator),\n                              steps_per_epoch=4000/32,\n                              validation_steps=1000/32)\n\n#学習モデルの保存\nmodel.save('../working/dog_cat3.h5')","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:40:04.950800Z","iopub.execute_input":"2023-07-06T06:40:04.951129Z","iopub.status.idle":"2023-07-06T06:56:07.624947Z","shell.execute_reply.started":"2023-07-06T06:40:04.951097Z","shell.execute_reply":"2023-07-06T06:56:07.623696Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import keras.utils as image\nfrom keras.utils import load_img, img_to_array\nimport re\nimport csv\nimport glob","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:56:07.626711Z","iopub.execute_input":"2023-07-06T06:56:07.627071Z","iopub.status.idle":"2023-07-06T06:56:07.632152Z","shell.execute_reply.started":"2023-07-06T06:56:07.627038Z","shell.execute_reply":"2023-07-06T06:56:07.631143Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import re\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_cat3.h5')\n\n#csv書き込み\n# [mode=”a”] とし、追記モードにします\n# https://kirinote.com/python-csv-write/\nwith open('../working/submission2.csv', 'w') as f:\n  writer= csv.writer(f, lineterminator='\\n')\n  writer.writerow(['id', 'label'])\n  for i in test_list:\n    img = image.load_img(i, 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, imcount)","metadata":{"execution":{"iopub.status.busy":"2023-07-06T06:56:07.633869Z","iopub.execute_input":"2023-07-06T06:56:07.634217Z","iopub.status.idle":"2023-07-06T07:09:10.958913Z","shell.execute_reply.started":"2023-07-06T06:56:07.634186Z","shell.execute_reply":"2023-07-06T07:09:10.957854Z"},"trusted":true},"execution_count":null,"outputs":[]}]}