{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Dummy dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Find this notebook at `EpyNN/epynnlive/dummy_image/prepare_dataset.ipynb`. \n", "* Regular python code at `EpyNN/epynnlive/dummy_image/prepare_dataset.py`.\n", "\n", "Run the notebook online with [Google Colab](https://colab.research.google.com/github/Synthaze/EpyNN/blob/main/epynnlive/dummy_image/prepare_dataset.ipynb).\n", "\n", "**Level: Intermediate**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook is part of the series on preparing data for Neural Network regression with EpyNN.\n", "\n", "In addition to the topic-specific content, it contains several explanations about basics or general concepts in programming that are important in the context.\n", "\n", "Note that elements developed in the following notebooks may not be reviewed herein:\n", "\n", "* [Boolean dataset](../dummy_boolean/prepare_dataset.ipynb)\n", "* [String dataset](../dummy_string/prepare_dataset.ipynb)\n", "* [Time-series (numerical)](../dummy_time/prepare_dataset.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What is an image?\n", "\n", "Instinctively, an image may resemble a 2D plane composed of **WIDTH * HEIGHT** colored units arranged together in a particular manner.\n", "\n", "In computing, a 2D image is generally a 3D object which is composed of **WIDTH * HEIGHT** units within each plane with respect the the third dimension, which is the **DEPTH** of the image, therefore giving **WIDTH * HEIGHT * DEPTH = N_FEATURES**.\n", "\n", "Image depth is simply the number of channels which compose the image. You are certainly aware of RGB colors, for instance. In the RGB scheme, one color is written such as ``rgb(int, int, int)`` or ``rgb(255, 0, 0)``, ``rgb(0, 255, 0)`` and ``rgb(0, 0, 255)`` for pure red, green and blue, respectively. One RGB image would therefore have a **DEPTH** equal to 3, because of the three channels within.\n", "\n", "Note that following this scheme, an image is made of Numerical data, namely integer or ``int``. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Why preparing a dummy dataset of images?\n", "\n", "In addition to general considerations [reviewed here](../dummy_boolean/prepare_dataset.ipynb#Why-preparing-a-dummy-dataset-with-Boolean-features), this may be a good idea to practically understand what an image is, how to build an image, and how to handle such kind of data overall." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Prepare a set of image sample features and related label" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is no specific import for this notebook since we will create images from scratch." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Imports" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: epynn in /home/synthase/.local/lib/python3.9/site-packages (1.2.6)\n", "Requirement already satisfied: numpy==1.21.2 in /home/synthase/.local/lib/python3.9/site-packages (from epynn) (1.21.2)\n", "Requirement already satisfied: texttable==1.6.4 in /home/synthase/.local/lib/python3.9/site-packages (from epynn) (1.6.4)\n", "Requirement already satisfied: Pygments==2.10.0 in /home/synthase/.local/lib/python3.9/site-packages (from epynn) (2.10.0)\n", "Requirement already satisfied: Pillow==8.3.1 in /home/synthase/.local/lib/python3.9/site-packages (from epynn) (8.3.1)\n", "Requirement already satisfied: cycler==0.10.0 in /home/synthase/.local/lib/python3.9/site-packages (from epynn) (0.10.0)\n", "Requirement already satisfied: kiwisolver==1.3.2 in /home/synthase/.local/lib/python3.9/site-packages (from epynn) (1.3.2)\n", "Requirement already satisfied: nbconvert==5.4.1 in /home/synthase/.local/lib/python3.9/site-packages (from epynn) (5.4.1)\n", "Requirement already satisfied: pyparsing==2.4.7 in /home/synthase/.local/lib/python3.9/site-packages (from epynn) (2.4.7)\n", "Requirement already satisfied: jupyter==1.0.0 in /home/synthase/.local/lib/python3.9/site-packages (from epynn) (1.0.0)\n", "Requirement already satisfied: termcolor==1.1.0 in /home/synthase/.local/lib/python3.9/site-packages (from epynn) (1.1.0)\n", "Requirement already satisfied: utilsovs-pkg in /home/synthase/.local/lib/python3.9/site-packages (from epynn) (0.9.4)\n", "Requirement already satisfied: python-dateutil==2.8.2 in /home/synthase/.local/lib/python3.9/site-packages (from epynn) (2.8.2)\n", "Requirement already satisfied: tabulate==0.8.9 in /home/synthase/.local/lib/python3.9/site-packages (from epynn) (0.8.9)\n", "Requirement already satisfied: six==1.16.0 in /usr/lib/python3/dist-packages (from epynn) (1.16.0)\n", "Requirement already satisfied: wget==3.2 in /home/synthase/.local/lib/python3.9/site-packages (from epynn) (3.2)\n", "Requirement already satisfied: matplotlib==3.4.3 in /home/synthase/.local/lib/python3.9/site-packages (from epynn) (3.4.3)\n", "Requirement already satisfied: scipy==1.6.3 in /home/synthase/.local/lib/python3.9/site-packages (from epynn) (1.6.3)\n", "Requirement already satisfied: notebook in /home/synthase/.local/lib/python3.9/site-packages (from jupyter==1.0.0->epynn) (6.4.11)\n", "Requirement already satisfied: qtconsole in /home/synthase/.local/lib/python3.9/site-packages (from jupyter==1.0.0->epynn) (5.3.0)\n", "Requirement already satisfied: jupyter-console in /home/synthase/.local/lib/python3.9/site-packages (from jupyter==1.0.0->epynn) (6.4.3)\n", "Requirement already satisfied: ipywidgets in /home/synthase/.local/lib/python3.9/site-packages (from jupyter==1.0.0->epynn) (7.7.0)\n", "Requirement already satisfied: ipykernel in /home/synthase/.local/lib/python3.9/site-packages (from jupyter==1.0.0->epynn) (6.13.0)\n", "Requirement already satisfied: bleach in /home/synthase/.local/lib/python3.9/site-packages (from nbconvert==5.4.1->epynn) (4.1.0)\n", "Requirement already satisfied: entrypoints>=0.2.2 in /home/synthase/.local/lib/python3.9/site-packages (from nbconvert==5.4.1->epynn) (0.4)\n", "Requirement already satisfied: pandocfilters>=1.4.1 in /home/synthase/.local/lib/python3.9/site-packages (from nbconvert==5.4.1->epynn) (1.5.0)\n", "Requirement already satisfied: testpath in /home/synthase/.local/lib/python3.9/site-packages (from nbconvert==5.4.1->epynn) (0.6.0)\n", "Requirement already satisfied: mistune>=0.8.1 in /home/synthase/.local/lib/python3.9/site-packages (from nbconvert==5.4.1->epynn) (0.8.4)\n", "Requirement already satisfied: defusedxml in /home/synthase/.local/lib/python3.9/site-packages (from nbconvert==5.4.1->epynn) (0.7.1)\n", "Requirement already satisfied: nbformat>=4.4 in /home/synthase/.local/lib/python3.9/site-packages (from nbconvert==5.4.1->epynn) (5.3.0)\n", "Requirement already satisfied: jinja2 in /home/synthase/.local/lib/python3.9/site-packages (from nbconvert==5.4.1->epynn) (3.0.3)\n", "Requirement already satisfied: jupyter-core in /home/synthase/.local/lib/python3.9/site-packages (from nbconvert==5.4.1->epynn) (4.10.0)\n", "Requirement already satisfied: traitlets>=4.2 in /home/synthase/.local/lib/python3.9/site-packages (from nbconvert==5.4.1->epynn) (5.1.1)\n", "Requirement already satisfied: fastjsonschema in /home/synthase/.local/lib/python3.9/site-packages (from nbformat>=4.4->nbconvert==5.4.1->epynn) (2.15.3)\n", "Requirement already satisfied: jsonschema>=2.6 in /usr/lib/python3/dist-packages (from nbformat>=4.4->nbconvert==5.4.1->epynn) (3.2.0)\n", "Requirement already satisfied: packaging in /home/synthase/.local/lib/python3.9/site-packages (from bleach->nbconvert==5.4.1->epynn) (21.3)\n", "Requirement already satisfied: webencodings in /home/synthase/.local/lib/python3.9/site-packages (from bleach->nbconvert==5.4.1->epynn) (0.5.1)\n", "Requirement already satisfied: ipython>=7.23.1 in /home/synthase/.local/lib/python3.9/site-packages (from ipykernel->jupyter==1.0.0->epynn) (8.2.0)\n", "Requirement already satisfied: debugpy>=1.0 in /home/synthase/.local/lib/python3.9/site-packages (from ipykernel->jupyter==1.0.0->epynn) (1.6.0)\n", "Requirement already satisfied: jupyter-client>=6.1.12 in /home/synthase/.local/lib/python3.9/site-packages (from ipykernel->jupyter==1.0.0->epynn) (7.2.2)\n", "Requirement already satisfied: psutil in /usr/lib/python3/dist-packages (from ipykernel->jupyter==1.0.0->epynn) (5.8.0)\n", "Requirement already satisfied: matplotlib-inline>=0.1 in /home/synthase/.local/lib/python3.9/site-packages (from ipykernel->jupyter==1.0.0->epynn) (0.1.3)\n", "Requirement already satisfied: nest-asyncio in /home/synthase/.local/lib/python3.9/site-packages (from ipykernel->jupyter==1.0.0->epynn) (1.5.5)\n", "Requirement already satisfied: tornado>=6.1 in /home/synthase/.local/lib/python3.9/site-packages (from ipykernel->jupyter==1.0.0->epynn) (6.1)\n", "Requirement already satisfied: backcall in /home/synthase/.local/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter==1.0.0->epynn) (0.2.0)\n", "Requirement already satisfied: decorator in /home/synthase/.local/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter==1.0.0->epynn) (5.1.1)\n", "Requirement already satisfied: jedi>=0.16 in /home/synthase/.local/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter==1.0.0->epynn) (0.18.1)\n", "Requirement already satisfied: stack-data in /home/synthase/.local/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter==1.0.0->epynn) (0.2.0)\n", "Requirement already satisfied: pickleshare in /home/synthase/.local/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter==1.0.0->epynn) (0.7.5)\n", "Requirement already satisfied: setuptools>=18.5 in /usr/lib/python3/dist-packages (from ipython>=7.23.1->ipykernel->jupyter==1.0.0->epynn) (52.0.0)\n", "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /home/synthase/.local/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter==1.0.0->epynn) (3.0.29)\n", "Requirement already satisfied: pexpect>4.3 in /home/synthase/.local/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter==1.0.0->epynn) (4.8.0)\n", "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /home/synthase/.local/lib/python3.9/site-packages (from jedi>=0.16->ipython>=7.23.1->ipykernel->jupyter==1.0.0->epynn) (0.8.3)\n", "Requirement already satisfied: pyzmq>=22.3 in /home/synthase/.local/lib/python3.9/site-packages (from jupyter-client>=6.1.12->ipykernel->jupyter==1.0.0->epynn) (22.3.0)\n", "Requirement already satisfied: ptyprocess>=0.5 in /home/synthase/.local/lib/python3.9/site-packages (from pexpect>4.3->ipython>=7.23.1->ipykernel->jupyter==1.0.0->epynn) (0.7.0)\n", "Requirement already satisfied: wcwidth in /home/synthase/.local/lib/python3.9/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=7.23.1->ipykernel->jupyter==1.0.0->epynn) (0.2.5)\n", "Requirement already satisfied: widgetsnbextension~=3.6.0 in /home/synthase/.local/lib/python3.9/site-packages (from ipywidgets->jupyter==1.0.0->epynn) (3.6.0)\n", "Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /home/synthase/.local/lib/python3.9/site-packages (from ipywidgets->jupyter==1.0.0->epynn) (1.1.0)\n", "Requirement already satisfied: ipython-genutils~=0.2.0 in /home/synthase/.local/lib/python3.9/site-packages (from ipywidgets->jupyter==1.0.0->epynn) (0.2.0)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: terminado>=0.8.3 in /home/synthase/.local/lib/python3.9/site-packages (from notebook->jupyter==1.0.0->epynn) (0.13.3)\n", "Requirement already satisfied: argon2-cffi in /home/synthase/.local/lib/python3.9/site-packages (from notebook->jupyter==1.0.0->epynn) (21.3.0)\n", "Requirement already satisfied: Send2Trash>=1.8.0 in /home/synthase/.local/lib/python3.9/site-packages (from notebook->jupyter==1.0.0->epynn) (1.8.0)\n", "Requirement already satisfied: prometheus-client in /home/synthase/.local/lib/python3.9/site-packages (from notebook->jupyter==1.0.0->epynn) (0.14.1)\n", "Requirement already satisfied: argon2-cffi-bindings in /home/synthase/.local/lib/python3.9/site-packages (from argon2-cffi->notebook->jupyter==1.0.0->epynn) (21.2.0)\n", "Requirement already satisfied: cffi>=1.0.1 in /home/synthase/.local/lib/python3.9/site-packages/cffi-1.15.0-py3.9-linux-x86_64.egg (from argon2-cffi-bindings->argon2-cffi->notebook->jupyter==1.0.0->epynn) (1.15.0)\n", "Requirement already satisfied: pycparser in /home/synthase/.local/lib/python3.9/site-packages/pycparser-2.21-py3.9.egg (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook->jupyter==1.0.0->epynn) (2.21)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /home/synthase/.local/lib/python3.9/site-packages (from jinja2->nbconvert==5.4.1->epynn) (2.0.1)\n", "Requirement already satisfied: qtpy>=2.0.1 in /home/synthase/.local/lib/python3.9/site-packages (from qtconsole->jupyter==1.0.0->epynn) (2.0.1)\n", "Requirement already satisfied: pure-eval in /home/synthase/.local/lib/python3.9/site-packages (from stack-data->ipython>=7.23.1->ipykernel->jupyter==1.0.0->epynn) (0.2.2)\n", "Requirement already satisfied: executing in /home/synthase/.local/lib/python3.9/site-packages (from stack-data->ipython>=7.23.1->ipykernel->jupyter==1.0.0->epynn) (0.8.2)\n", "Requirement already satisfied: asttokens in /home/synthase/.local/lib/python3.9/site-packages (from stack-data->ipython>=7.23.1->ipykernel->jupyter==1.0.0->epynn) (2.0.5)\n" ] } ], "source": [ "# EpyNN/epynnlive/dummy_image/prepare_dataset.ipynb\n", "# Install dependencies\n", "!pip3 install --upgrade-strategy only-if-needed epynn\n", "\n", "# Standard library imports\n", "import random\n", "\n", "# Related third party imports\n", "import matplotlib.pyplot as plt\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Seeding" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "random.seed(0)\n", "np.random.seed(0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For reproducibility, as detailed [here](../dummy_boolean/prepare_dataset.ipynb#seeding)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Generate features" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To generate an image, we need:\n", "\n", "* Dimensions: ``HEIGHT`` and ``WIDTH``.\n", "* Number of channels: ``DEPTH`` which is equal to ``1`` herein because we will prepare grayscale images. This would be *3* for *RGB* images, *4* for *CMYK* images, etc.\n", "* Number of tones per channel: ``N_TONES``.\n", "* The actual palette of shades: ``GSCALE``.\n", "\n", "The actual function to generate such image:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def features_image(WIDTH=28, HEIGHT=28):\n", " \"\"\"Generate dummy image features.\n", "\n", " :param WIDTH: Image width, defaults to 28.\n", " :type WIDTH: int\n", "\n", " :param HEIGHT: Image height, defaults to 28.\n", " :type HEIGHT: int\n", "\n", " :return: Random image features of size N_FEATURES.\n", " :rtype: :class:`numpy.ndarray`\n", "\n", " :return: Non-random image features of size N_FEATURES.\n", " :rtype: :class:`numpy.ndarray`\n", " \"\"\"\n", " # Number of channels is one for greyscale images\n", " DEPTH = 1\n", "\n", " # Number of features describing a sample\n", " N_FEATURES = WIDTH * HEIGHT * DEPTH\n", "\n", " # Number of distinct tones in features\n", " N_TONES = 16\n", "\n", " # Shades of grey\n", " GSCALE = [i for i in range(N_TONES)]\n", "\n", " # Random choice of shades for N_FEATURES iterations\n", " features = [random.choice(GSCALE) for j in range(N_FEATURES)]\n", "\n", " # Vectorization of features\n", " features = np.array(features).reshape(HEIGHT, WIDTH, DEPTH)\n", "\n", " # Masked features\n", " mask_on_features = features.copy()\n", " mask_on_features[np.random.randint(0, HEIGHT)] = np.zeros_like(features[0])\n", " mask_on_features[:, np.random.randint(0, WIDTH)] = np.zeros_like(features[:, 0])\n", "\n", " # Random choice between random image or masked image\n", " features = random.choice([features, mask_on_features])\n", "\n", " return features, mask_on_features" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In addition to constructing one image with randomly selected tones, this function achieves a random choice between image ``features`` and a modified version named ``mask_on_features``.\n", "\n", "The latter consists of the former, with modifications: one column and one row were randomly selected and had values for corresponding data points set to zero, visually corresponding to the following." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(2, 2)\n", "\n", "for i in range(2):\n", "\n", " features, mask_on_features = features_image()\n", " \n", " title = 'Random' if np.sum(features) != np.sum(mask_on_features) else 'Non-random'\n", "\n", " ax[0, i].imshow(features, cmap='gray')\n", " ax[0, i].set_title(title)\n", "\n", " ax[1, i].imshow(features - mask_on_features, cmap='gray')\n", " ax[1, i].set_title('Diff. with Non-random')\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These are image ``features`` we retrieve for two samples (first row).\n", "\n", "Below is the difference between ``features`` and ``mask_on_features``.\n", "\n", "When the difference renders an all black image, it means this difference is equal to zero and so the function has returned ``mask_on_features`` from the random choice within ``[features, mask_on_features]``.\n", "\n", "Said another way, when the difference between ``features`` and ``mask_on_features`` is zero then ``features = mask_on_features`` (non-random image)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Generate label" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Label is associated with ``features`` depending on if the corresponding image is random or not random." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def label_features(features, mask_on_features):\n", " \"\"\"Prepare label associated with features.\n", "\n", " The dummy law is:\n", "\n", " Image is NOT random = positive\n", " Image is random = negative\n", "\n", " :param features: Random image features of size N_FEATURES\n", " :type features: :class:`numpy.ndarray`\n", "\n", " :param mask_on_features: Non-random image features of size N_FEATURES\n", " :type mask_on_features: :class:`numpy.ndarray`\n", "\n", " :return: Single-digit label with respect to features\n", " :rtype: int\n", " \"\"\"\n", " # Single-digit positive and negative labels\n", " p_label = 0\n", " n_label = 1\n", "\n", " # Test if image is not random (0)\n", " if np.sum(features) == np.sum(mask_on_features):\n", " label = p_label\n", "\n", " # Test if image is random (1)\n", " elif np.sum(features) != np.sum(mask_on_features):\n", " label = n_label\n", "\n", " return label" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The code above is commented and self explaining.\n", "\n", "Let's check the function we made for a few iterations." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 5436 5436\n", "1 5500 5500\n", "0 5375 5375\n", "1 5412 5412\n", "1 5531 5531\n" ] } ], "source": [ "for i in range(5):\n", " features, mask_on_features = features_image()\n", " label = label_features(features, mask_on_features)\n", "\n", " print(label, np.sum(mask_on_features), np.sum(mask_on_features))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Prepare dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The generic function we use to actually prepare a full labeled dataset." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def prepare_dataset(N_SAMPLES=100):\n", " \"\"\"Prepare a set of dummy time sample features and label.\n", "\n", " :param N_SAMPLES: Number of samples to generate, defaults to 100.\n", " :type N_SAMPLES: int\n", "\n", " :return: Set of sample features.\n", " :rtype: tuple[:class:`numpy.ndarray`]\n", "\n", " :return: Set of single-digit sample label.\n", " :rtype: tuple[int]\n", " \"\"\"\n", " # Initialize X and Y datasets\n", " X_features = []\n", " Y_label = []\n", "\n", " # Iterate over N_SAMPLES\n", " for i in range(N_SAMPLES):\n", "\n", " # Compute random string features\n", " features, mask_on_features = features_image()\n", "\n", " # Retrieve label associated with features\n", " label = label_features(features, mask_on_features)\n", "\n", " # Append sample features to X_features\n", " X_features.append(features)\n", "\n", " # Append sample label to Y_label\n", " Y_label.append(label)\n", "\n", " # Prepare X-Y pairwise dataset\n", " dataset = list(zip(X_features, Y_label))\n", "\n", " # Shuffle dataset\n", " random.shuffle(dataset)\n", "\n", " # Separate X-Y pairs\n", " X_features, Y_label = zip(*dataset)\n", "\n", " return X_features, Y_label" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can test this function." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "X_features, Y_label = prepare_dataset(N_SAMPLES=5)\n", "\n", "for features, label in zip(X_features, Y_label):\n", " plt.imshow(features, cmap='gray')\n", " plt.title('Digit = label = %s' % label)\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that on this run we got a deviation from the expected mean: 4 images were associated with label 0 while only one was with label 1. According to the code, we expect a balanced dataset.\n", "\n", "Just to make sure." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "54\n", "46\n" ] } ], "source": [ "X_features, Y_label = prepare_dataset(N_SAMPLES=100)\n", "\n", "print(Y_label.count(0))\n", "print(Y_label.count(1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The output of the code then fits our expectations." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Live examples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The function ``prepare_dataset()`` presented herein is used in the following live examples:\n", "\n", "* Notebook at`EpyNN/epynnlive/dummy_image/train.ipynb` or following [this link](train.ipynb). \n", "* Regular python code at `EpyNN/epynnlive/dummy_image/train.py`." ] } ], "metadata": { "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.9.2" } }, "nbformat": 4, "nbformat_minor": 4 }