{"cells":[{"metadata":{},"cell_type":"markdown","source":"## Reference\n- [00 ColaboratoryでChainerを動かしてみよう](https://chainer-colab-notebook.readthedocs.io/ja/latest/notebook/hands_on/chainer/begginers_hands_on/00_How_to_use_chainer_on_colaboratory.html)"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"!curl https://colab.chainer.org/install | sh -","execution_count":1,"outputs":[{"output_type":"stream","text":"  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n100  1580  100  1580    0     0   7900      0 --:--:-- --:--:-- --:--:--  7900\n+ apt -y -q install cuda-libraries-dev-10-0\nReading package lists...\nBuilding dependency tree...\nReading state information...\ncuda-libraries-dev-10-0 is already the newest version (10.0.130-1).\n0 upgraded, 0 newly installed, 0 to remove and 48 not upgraded.\n+ pip install -q cupy-cuda100  chainer \n\u001b[33mYou are using pip version 19.0.3, however version 19.1.1 is available.\nYou should consider upgrading via the 'pip install --upgrade pip' command.\u001b[0m\n+ set +ex\nInstallation succeeded!\n","name":"stdout"}]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"!python -c 'import chainer; chainer.print_runtime_info()'","execution_count":2,"outputs":[{"output_type":"stream","text":"Platform: Linux-4.9.0-8-amd64-x86_64-with-debian-9.4\r\nChainer: 5.4.0\r\nNumPy: 1.16.3\r\nCuPy:\r\n  CuPy Version          : 5.4.0\r\n  CUDA Root             : /usr/local/cuda\r\n  CUDA Build Version    : 10000\r\n  CUDA Driver Version   : 10000\r\n  CUDA Runtime Version  : 10000\r\n  cuDNN Build Version   : 7301\r\n  cuDNN Version         : 7301\r\n  NCCL Build Version    : 2402\r\n  NCCL Runtime Version  : 2402\r\niDeep: Not Available\r\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"!apt -y -qq install graphviz > /dev/null 2> /dev/null\n!pip install pydot","execution_count":3,"outputs":[{"output_type":"stream","text":"Requirement already satisfied: pydot in /opt/conda/lib/python3.6/site-packages (1.4.1)\nRequirement already satisfied: pyparsing>=2.1.4 in /opt/conda/lib/python3.6/site-packages (from pydot) (2.2.0)\n\u001b[33mYou are using pip version 19.0.3, however version 19.1.1 is available.\nYou should consider upgrading via the 'pip install --upgrade pip' command.\u001b[0m\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"%ls ../input","execution_count":4,"outputs":[{"output_type":"stream","text":"\u001b[0m\u001b[01;34mdog-breed-identification\u001b[0m/  \u001b[01;34mresnet-50-caffe\u001b[0m/\r\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"%ls ../input/resnet-50-caffe/","execution_count":5,"outputs":[{"output_type":"stream","text":"ResNet-50-model.caffemodel\r\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"%matplotlib inline\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport chainer\nimport cv2\nimport chainer.functions as F\nimport chainer.links as L\nfrom PIL import Image\nfrom sklearn.preprocessing import LabelEncoder\nfrom pathlib import Path\nfrom chainer import optimizers\nfrom chainer import training","execution_count":6,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_path = Path(\"../input/dog-breed-identification/\")","execution_count":7,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"labels = pd.read_csv(data_path.joinpath(\"labels.csv\"))\nsubmit = pd.read_csv(data_path.joinpath(\"sample_submission.csv\"))","execution_count":8,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"labels'shape : {}\".format(labels.shape))\nprint(\"unique label : {}\".format(len(labels[\"breed\"].unique())))","execution_count":9,"outputs":[{"output_type":"stream","text":"labels'shape : (10222, 2)\nunique label : 120\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"labels.head()","execution_count":10,"outputs":[{"output_type":"execute_result","execution_count":10,"data":{"text/plain":"                                 id             breed\n0  000bec180eb18c7604dcecc8fe0dba07       boston_bull\n1  001513dfcb2ffafc82cccf4d8bbaba97             dingo\n2  001cdf01b096e06d78e9e5112d419397          pekinese\n3  00214f311d5d2247d5dfe4fe24b2303d          bluetick\n4  0021f9ceb3235effd7fcde7f7538ed62  golden_retriever","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>id</th>\n      <th>breed</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>000bec180eb18c7604dcecc8fe0dba07</td>\n      <td>boston_bull</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>001513dfcb2ffafc82cccf4d8bbaba97</td>\n      <td>dingo</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>001cdf01b096e06d78e9e5112d419397</td>\n      <td>pekinese</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>00214f311d5d2247d5dfe4fe24b2303d</td>\n      <td>bluetick</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>0021f9ceb3235effd7fcde7f7538ed62</td>\n      <td>golden_retriever</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"sns.countplot(data=labels, x=\"breed\")","execution_count":11,"outputs":[{"output_type":"execute_result","execution_count":11,"data":{"text/plain":"<matplotlib.axes._subplots.AxesSubplot at 0x7f8cdefeb550>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"def load_img_shapes(path_to_img):\n    return cv2.imread(path_to_img).shape","execution_count":12,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# reference\n# https://www.kaggle.com/enerrio/data-exploration-distribution-of-image-sizes\ndef distribution_img_shapes(path):\n    shapes = []\n    for img_path in path.glob(\"*.jpg\"):\n        shapes.append(load_img_shapes(str(img_path)))\n    df = pd.DataFrame({'Shapes': shapes})\n    shape_counts = df['Shapes'].value_counts()\n    print(\"Image Shapes:\")\n    for i in range(len(shape_counts)):\n        print(\"Shape %s counts: %d\" % (shape_counts.index[i],\n                                       shape_counts.values[i]))","execution_count":13,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# distribution_img_shapes(data_path.joinpath(\"train\"))","execution_count":14,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# distribution_img_shapes(data_path.joinpath(\"test\"))","execution_count":15,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"le = LabelEncoder()\nlabels[\"breed\"] = le.fit_transform(labels[\"breed\"])","execution_count":16,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"labels.head()","execution_count":17,"outputs":[{"output_type":"execute_result","execution_count":17,"data":{"text/plain":"                                 id  breed\n0  000bec180eb18c7604dcecc8fe0dba07     19\n1  001513dfcb2ffafc82cccf4d8bbaba97     37\n2  001cdf01b096e06d78e9e5112d419397     85\n3  00214f311d5d2247d5dfe4fe24b2303d     15\n4  0021f9ceb3235effd7fcde7f7538ed62     49","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>id</th>\n      <th>breed</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>000bec180eb18c7604dcecc8fe0dba07</td>\n      <td>19</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>001513dfcb2ffafc82cccf4d8bbaba97</td>\n      <td>37</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>001cdf01b096e06d78e9e5112d419397</td>\n      <td>85</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>00214f311d5d2247d5dfe4fe24b2303d</td>\n      <td>15</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>0021f9ceb3235effd7fcde7f7538ed62</td>\n      <td>49</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"# sample\nlabels.loc[labels[\"id\"] == \"000bec180eb18c7604dcecc8fe0dba07\", \"breed\"]\nlabels.loc[labels[\"id\"] == \"000bec180eb18c7604dcecc8fe0dba07\", \"breed\"].values[0]","execution_count":18,"outputs":[{"output_type":"execute_result","execution_count":18,"data":{"text/plain":"19"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_image_files = []\nfor img_path in data_path.joinpath(\"train\").glob(\"*.jpg\"):\n    label = labels.loc[labels[\"id\"] == img_path.stem, \"breed\"].values[0]\n    train_image_files.append((str(img_path), label.astype(np.int32)))","execution_count":19,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_image_files[0]","execution_count":20,"outputs":[{"output_type":"execute_result","execution_count":20,"data":{"text/plain":"('../input/dog-breed-identification/train/c7ac8dc219cb3bba12deee6e9778f5ba.jpg',\n 118)"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"type(train_image_files[0][0]), type(train_image_files[0][1])","execution_count":21,"outputs":[{"output_type":"execute_result","execution_count":21,"data":{"text/plain":"(str, numpy.int32)"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"seed = 42\nepochs = 10\nbatch_size = 32\nloaderjob = 4","execution_count":22,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_dataset = chainer.datasets.LabeledImageDataset(train_image_files)","execution_count":23,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def _transform(data):\n    img, label = data\n    img = img[:3, ...]\n    img = _resize(img.astype(np.uint8))\n    img = img / 255.0\n    img = img.astype(np.float32)\n    return img, label\n\ndef _resize(img,width=224, height=224):\n    img = Image.fromarray(img.transpose(1, 2, 0))\n    img = img.resize((width, height), Image.BICUBIC)\n    return np.asarray(img).transpose(2, 0, 1)","execution_count":24,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"transform_train_dataset = chainer.datasets.TransformDataset(train_dataset, _transform)","execution_count":25,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train, val = chainer.datasets.split_dataset_random(transform_train_dataset, 9000, seed=seed)","execution_count":26,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(train), len(val)","execution_count":27,"outputs":[{"output_type":"execute_result","execution_count":27,"data":{"text/plain":"(9000, 1222)"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_iter = chainer.iterators.SerialIterator(train, batch_size)\nval_iter = chainer.iterators.SerialIterator(val, batch_size, repeat=False)","execution_count":28,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class_size = len(labels[\"breed\"].unique())\nprint(class_size)","execution_count":29,"outputs":[{"output_type":"stream","text":"120\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"class PretrainedResNet50(chainer.Chain):\n    def __init__(self, class_labels):\n        super(PretrainedResNet50, self).__init__()\n\n        with self.init_scope():\n            self.base = L.ResNet50Layers()\n            self.fc6 = L.Linear(None, class_labels)\n\n    def forward(self, x):\n        h = self.base(x, layers=['pool5'])['pool5']\n        return self.fc6(h)","execution_count":30,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nto_path = \"~/.chainer/dataset/pfnet/chainer/models\"\nos.makedirs(os.path.dirname(filename), exist_ok=True)","execution_count":35,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%cp ../input/resnet-50-caffe/ResNet-50-model.caffemodel  $to_path","execution_count":36,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"%ls $filename","execution_count":37,"outputs":[{"output_type":"stream","text":"/tmp/.chainer/dataset/pfnet/chainer/models/ResNet-50-model.caffemodel\r\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = PretrainedResNet50(class_labels=class_size)\nclassifier_model = L.Classifier(model)","execution_count":38,"outputs":[{"output_type":"stream","text":"Now loading caffemodel (usually it may take few minutes)\n","name":"stderr"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"optimizer = optimizers.SGD()\noptimizer.setup(model)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"updater = training.StandardUpdater(train_iter, optimizer, device=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"trainer = training.Trainer(updater, (epochs, 'epoch'),\n                           out='out')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from chainer.training import extensions\n\ntrainer.extend(extensions.LogReport())\ntrainer.extend(extensions.PrintReport(['epoch',\n                                       'main/loss',\n                                       'main/accuracy',\n                                       'validation/main/loss',\n                                       'validation/main/accuracy',\n                                       'elapsed_time']))\ntrainer.extend(extensions.PlotReport(['main/loss', 'validation/main/loss'],\n                                     x_key='epoch',\n                                     file_name='loss.png'))\ntrainer.extend(extensions.PlotReport(['main/accuracy', 'validation/main/accuracy'],\n                                     x_key='epoch',\n                                     file_name='accuracy.png'))\ntrainer.extend(extensions.snapshot(filename='snapshot_epoch-{.updater.epoch}'))\ntrainer.extend(extensions.snapshot_object(classifier_model.predictor, filename='model_epoch-{.updater.epoch}'))\n# trainer.extend(extensions.Evaluator(test_iter, classifier_model, device=0))\ntrainer.extend(extensions.dump_graph('main/loss'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"trainer.run()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}