{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 408
    },
    "id": "7lb51wiEK0TT",
    "outputId": "bf3b86bc-ed6f-4c24-9297-1e1ab109341a"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2023-05-08 14:33:29.199204: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  SSE4.1 SSE4.2\n",
      "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 9 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot images\n",
    "from tensorflow.keras.datasets import mnist\n",
    "import matplotlib.pyplot as plt\n",
    "# load dbata\n",
    "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n",
    "# create a grid of 3x3 images\n",
    "fig, ax = plt.subplots(3, 3, sharex=True, sharey=True, figsize=(4,4))\n",
    "for i in range(3):\n",
    "    for j in range(3):\n",
    "        ax[i][j].imshow(X_train[i*3+j], cmap=plt.get_cmap(\"gray\"))\n",
    "# show the plot\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 372
    },
    "id": "TdIiEhY5K1L4",
    "outputId": "4008c789-cf6c-48d7-f58c-250b690b0917"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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ecyYMTh48CAee+wx7N+/H3379sWbb76Jnj17BuPHERFFBOu2cKqoqAjYNufUOOXl5c3e+tyGfmtNZ8iR0metTUP9xloWRESWCErKorU444wfPr4TJ04Yr1l24RGxLrroIondKbGBAwdKrGf9fPjhhxLv2rXLOKampibQTSRqNJ4hExFZggMyEZElmLLwYdCgQcbjBx98UOJLLrlE4gULFki8fPly45iKiorgNI4MTz/9tMQDBgwwXmvfvr3E55xzjsRLliyR+JFHHjGOOXjwYIBbSNR4PEMmIrIEB2QiIkswZfEv+vL2qquuMl676aabJO7SpYvEw4cPl9hdWpQpi+CZOnWqxDfffLPfx6empkqclZVlvPbMM89I/Nlnn/nfOKJm4BkyEZElOCATEVmCKYt/adu2rcRff/218dqhQ4ckPvfccyU+//zzJW7uMlY6va5du0r8+OOPN+t7JSUlSXzrrbcar+nNeHW9YL3TBlGw8AyZiMgSHJCJiCzBAZmIyBLMIf/LsWPHJNbFZwDg448/lrhXr14S6xzymWeeGbzGkZE3ri9fr/sQMAsFnTx50ufx3bp1M46ZP3++xFFRURK//PLLPr8XUSDxDJmIyBIckImILMGUxb/o+sX79+83XmvTpo3P9yUkJEh83nnnGcfonRj0qj3WSW6cYcOGGY/1foz1fYbvv/++8VgXEdKppoyMDIk7depkHKOn1x0/flxivZLTnRoh++n/wwDQsWNHifVuMnp649GjR4PfMBeeIRMRWYIDMhGRJZiy8KFDhw7GY72KT9+515exo0ePNo7R71uzZo3EetUf1e+WW25p1Ps+/fRTiZctW2a89sorr0h82WWXSXzppZdKrAtEAeYla48ePSTWl7VnnXWWcYzeHorsoWfJ6BQFAPzXf/2XxH379pV4xYoVEv/ud78LYut84xkyEZEl/B6Q161bh1GjRiEhIQEej6fOThmO4yArKwsJCQmIiopCWloaPvnkk0C1l4goYvmdsjhy5Aj69euHe+65B7fddlud1+fMmYO5c+diyZIl6NWrF5544gkMHz4cO3bsQHR0dEAaHWzuu+j5+fkSJycnS9y7d2+Jb7/9duMYPRNA72zMlEX9dOGmw4cPG6/VN7NCFwNavXp1vcccOHBAYl08yp2e0qmJn/70pxJfffXVEq9atco45r333pN4586d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",
      "text/plain": [
       "<Figure size 400x400 with 9 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Random Rotations\n",
    "from tensorflow.keras.datasets import mnist\n",
    "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
    "import matplotlib.pyplot as plt\n",
    "# load data\n",
    "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n",
    "# reshape to be [samples][width][height][channels]\n",
    "X_train = X_train.reshape((X_train.shape[0], 28, 28, 1))\n",
    "X_test = X_test.reshape((X_test.shape[0], 28, 28, 1))\n",
    "# convert from int to float\n",
    "X_train = X_train.astype('float32')\n",
    "X_test = X_test.astype('float32')\n",
    "# define data preparation\n",
    "datagen = ImageDataGenerator(rotation_range=90)\n",
    "# configure batch size and retrieve one batch of images\n",
    "for X_batch, y_batch in datagen.flow(X_train, y_train, batch_size=9, shuffle=False):\n",
    "    # create a grid of 3x3 images\n",
    "    fig, ax = plt.subplots(3, 3, sharex=True, sharey=True, figsize=(4,4))\n",
    "    for i in range(3):\n",
    "        for j in range(3):\n",
    "            ax[i][j].imshow(X_batch[i*3+j].reshape(28,28), cmap=plt.get_cmap(\"gray\"))\n",
    "    # show the plot\n",
    "    plt.show()\n",
    "    break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 372
    },
    "id": "ZpegFz2VLM1Q",
    "outputId": "8ba6efe5-0df9-482e-f098-b7762ad70ed7"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 9 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Random Shifts\n",
    "from tensorflow.keras.datasets import mnist\n",
    "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
    "import matplotlib.pyplot as plt\n",
    "# load data\n",
    "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n",
    "# reshape to be [samples][width][height][channels]\n",
    "X_train = X_train.reshape((X_train.shape[0], 28, 28, 1))\n",
    "X_test = X_test.reshape((X_test.shape[0], 28, 28, 1))\n",
    "# convert from int to float\n",
    "X_train = X_train.astype('float32')\n",
    "X_test = X_test.astype('float32')\n",
    "# define data preparation\n",
    "shift = 0.2\n",
    "datagen = ImageDataGenerator(width_shift_range=shift, height_shift_range=shift)\n",
    "# configure batch size and retrieve one batch of images\n",
    "for X_batch, y_batch in datagen.flow(X_train, y_train, batch_size=9, shuffle=False):\n",
    "    # create a grid of 3x3 images\n",
    "    fig, ax = plt.subplots(3, 3, sharex=True, sharey=True, figsize=(4,4))\n",
    "    for i in range(3):\n",
    "        for j in range(3):\n",
    "            ax[i][j].imshow(X_batch[i*3+j].reshape(28,28), cmap=plt.get_cmap(\"gray\"))\n",
    "    # show the plot\n",
    "    plt.show()\n",
    "    break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 372
    },
    "id": "05CP9F_iLTA5",
    "outputId": "19167be1-3bb6-479c-bbd5-dd4e8d67c588"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 9 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Random Flips\n",
    "from tensorflow.keras.datasets import mnist\n",
    "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
    "import matplotlib.pyplot as plt\n",
    "# load data\n",
    "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n",
    "# reshape to be [samples][width][height][channels]\n",
    "X_train = X_train.reshape((X_train.shape[0], 28, 28, 1))\n",
    "X_test = X_test.reshape((X_test.shape[0], 28, 28, 1))\n",
    "# convert from int to float\n",
    "X_train = X_train.astype('float32')\n",
    "X_test = X_test.astype('float32')\n",
    "# define data preparation\n",
    "datagen = ImageDataGenerator(horizontal_flip=True, vertical_flip=True)\n",
    "# configure batch size and retrieve one batch of images\n",
    "for X_batch, y_batch in datagen.flow(X_train, y_train, batch_size=9, shuffle=False):\n",
    "    # create a grid of 3x3 images\n",
    "    fig, ax = plt.subplots(3, 3, sharex=True, sharey=True, figsize=(4,4))\n",
    "    for i in range(3):\n",
    "        for j in range(3):\n",
    "            ax[i][j].imshow(X_batch[i*3+j].reshape(28,28), cmap=plt.get_cmap(\"gray\"))\n",
    "    # show the plot\n",
    "    plt.show()\n",
    "    break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 425
    },
    "id": "eiMOq6mdLdVm",
    "outputId": "04082347-9b07-41dd-a585-70ed4209f6fc"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x400 with 9 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Save augmented images to file\n",
    "from tensorflow.keras.datasets import mnist\n",
    "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# load data\n",
    "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n",
    "# reshape to be [samples][width][height][channels]\n",
    "X_train = X_train.reshape((X_train.shape[0], 28, 28, 1))\n",
    "X_test = X_test.reshape((X_test.shape[0], 28, 28, 1))\n",
    "# convert from int to float\n",
    "X_train = X_train.astype('float32')\n",
    "X_test = X_test.astype('float32')\n",
    "# define data preparation\n",
    "datagen = ImageDataGenerator(horizontal_flip=True, vertical_flip=True)\n",
    "# configure batch size and retrieve one batch of images\n",
    "for X_batch, y_batch in datagen.flow(X_train, y_train, batch_size=9, shuffle=False,\n",
    "                                     save_to_dir='images', save_prefix='aug', save_format='png'):\n",
    "    # create a grid of 3x3 images\n",
    "    fig, ax = plt.subplots(3, 3, sharex=True, sharey=True, figsize=(4,4))\n",
    "    for i in range(3):\n",
    "        for j in range(3):\n",
    "            ax[i][j].imshow(X_batch[i*3+j].reshape(28,28), cmap=plt.get_cmap(\"gray\"))\n",
    "    # show the plot\n",
    "    plt.show()\n",
    "    break"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
