{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "intro",
   "metadata": {},
   "source": [
    "# 13　画像を変形して学習例を増やす\n",
    "\n",
    "FUJIMOTO LAB 深層学習コース。Web教材の図と説明を読んでから実行してください。Pythonの計算はColabの実行環境で行います。\n",
    "\n",
    "**この回の目標**：データ拡張の利点と、ラベルが変わる危険を説明できる\n",
    "\n",
    "このノートブックは小さな合成データを使用し、元の教材の固定Driveパスや動画を必要としません。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "predict",
   "metadata": {},
   "source": [
    "## 1　まず予想する\n",
    "\n",
    "コードを実行する前に、表示される値や形を予想してください。"
   ]
  },
  {
   "cell_type": "code",
   "id": "demo-one",
   "metadata": {},
   "source": [
    "import torch\n",
    "image = torch.zeros(5,5)\n",
    "image[:,1] = 1\n",
    "print(image)\n",
    "print(torch.flip(image,dims=[1]))"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "explain-one",
   "metadata": {},
   "source": [
    "**確かめ方**：横方向を反転させています。線の位置は変わりますが、線であることは同じです。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "part-two",
   "metadata": {},
   "source": [
    "## 2　学習側だけに適用する\n",
    "\n",
    "評価用画像までランダムに変形すると、比較の条件が揺れます。まずは学習用のみに拡張を適用しましょう。"
   ]
  },
  {
   "cell_type": "code",
   "id": "demo-two",
   "metadata": {},
   "source": [
    "torch.manual_seed(2)\n",
    "augmented = torch.flip(image,dims=[1]) if torch.rand(()) < 0.5 else image\n",
    "print(augmented.shape)"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "explain-two",
   "metadata": {},
   "source": [
    "**結果を読む**：形は同じでも位置が変わります。乱数のシードを固定すると再現しやすくなります。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "experiment",
   "metadata": {},
   "source": [
    "## 3　値を変えて比べる\n",
    "\n",
    "次のセルでは、表示される値や条件を変えて、何が結果を決めるかを確かめます。長くかかる実験は、少数の合成データで行います。"
   ]
  },
  {
   "cell_type": "code",
   "id": "lab",
   "metadata": {},
   "source": [
    "# 90度回転。向きが変わってもラベルは同じか考えよう\n",
    "rotated = torch.rot90(image,k=1,dims=(0,1))\n",
    "print('元:',image,sep='\\n')\n",
    "print('回転:',rotated,sep='\\n')\n"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "extra-guide-1",
   "metadata": {},
   "source": [
    "## 追加実習 1　変形しても正解は同じ？\n",
    "\n",
    "線なら左右反転しても線です。文字や交通標識は意味が変わる場合があるので、題材ごとに判断します。\n",
    "\n",
    "**実行前に予想**：何が変わり、何が変わらないでしょうか。"
   ]
  },
  {
   "cell_type": "code",
   "id": "extra-code-1",
   "metadata": {},
   "source": [
    "original = image\n",
    "flipped = torch.flip(original, dims=[1])\n",
    "rotated = torch.rot90(original, k=1, dims=(0, 1))\n",
    "print('元の線:\\n', original)\n",
    "print('左右反転:\\n', flipped)\n",
    "print('90度回転:\\n', rotated)\n",
    "print('縦線の分類なら、90度回転後も同じラベルでよいでしょうか？')\n"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "id": "extra-reflect-1",
   "metadata": {},
   "source": [
    "**確認**：予想と違った点を一つ書き、値を一つ変えて再実行してください。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "reflection",
   "metadata": {},
   "source": [
    "## 自分の言葉で答えよう\n",
    "\n",
    "数字6の画像を上下反転して学習する前に？\n",
    "\n",
    "- まず予想を書く\n",
    "- コードのどの行が答えを決めるか指す\n",
    "- 条件や値を1つ変えて、予想と実行結果を比べる\n",
    "\n",
    "**ヒント**：変形で意味が変わるなら、その拡張は適しません。"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "name": "13-augmentation.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
