# Run !pip install mxnet-c101 for GPU support
!pip install ipywidgets
!pip install jupyter
Collecting ipywidgets
Downloading ipywidgets-7.6.3-py2.py3-none-any.whl (121 kB)
|████████████████████████████████| 121 kB 8.4 MB/s
Requirement already satisfied: ipykernel>=4.5.1 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipywidgets) (5.5.5)
Collecting widgetsnbextension~=3.5.0
Downloading widgetsnbextension-3.5.1-py2.py3-none-any.whl (2.2 MB)
|████████████████████████████████| 2.2 MB 14.7 MB/s
Requirement already satisfied: ipython>=4.0.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipywidgets) (7.24.1)
Collecting jupyterlab-widgets>=1.0.0
Downloading jupyterlab_widgets-1.0.0-py3-none-any.whl (243 kB)
|████████████████████████████████| 243 kB 21.3 MB/s
Requirement already satisfied: nbformat>=4.2.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipywidgets) (5.1.3)
Requirement already satisfied: traitlets>=4.3.1 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipywidgets) (5.0.5)
Requirement already satisfied: jupyter-client in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1.12)
Requirement already satisfied: tornado>=4.2 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipykernel>=4.5.1->ipywidgets) (6.1)
Requirement already satisfied: decorator in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipython>=4.0.0->ipywidgets) (5.0.9)
Requirement already satisfied: jedi>=0.16 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipython>=4.0.0->ipywidgets) (0.17.2)
Requirement already satisfied: matplotlib-inline in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipython>=4.0.0->ipywidgets) (0.1.2)
Requirement already satisfied: pexpect>4.3 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipython>=4.0.0->ipywidgets) (4.8.0)
Requirement already satisfied: setuptools>=18.5 in /root/venv/lib/python3.7/site-packages (from ipython>=4.0.0->ipywidgets) (57.0.0)
Requirement already satisfied: pygments in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipython>=4.0.0->ipywidgets) (2.9.0)
Requirement already satisfied: backcall in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipython>=4.0.0->ipywidgets) (0.2.0)
Requirement already satisfied: pickleshare in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipython>=4.0.0->ipywidgets) (0.7.5)
Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipython>=4.0.0->ipywidgets) (3.0.18)
Requirement already satisfied: parso<0.8.0,>=0.7.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jedi>=0.16->ipython>=4.0.0->ipywidgets) (0.7.1)
Requirement already satisfied: ipython-genutils in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbformat>=4.2.0->ipywidgets) (0.2.0)
Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbformat>=4.2.0->ipywidgets) (3.2.0)
Requirement already satisfied: jupyter-core in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbformat>=4.2.0->ipywidgets) (4.7.1)
Requirement already satisfied: pyrsistent>=0.14.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (0.17.3)
Requirement already satisfied: attrs>=17.4.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (21.2.0)
Requirement already satisfied: six>=1.11.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (1.16.0)
Requirement already satisfied: importlib-metadata in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (4.5.0)
Requirement already satisfied: ptyprocess>=0.5 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from pexpect>4.3->ipython>=4.0.0->ipywidgets) (0.7.0)
Requirement already satisfied: wcwidth in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=4.0.0->ipywidgets) (0.2.5)
Requirement already satisfied: notebook>=4.4.1 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from widgetsnbextension~=3.5.0->ipywidgets) (7.0.0.dev0)
Requirement already satisfied: pyzmq>=17 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (22.1.0)
Requirement already satisfied: terminado>=0.8.3 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.10.1)
Requirement already satisfied: nbconvert in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (6.0.7)
Requirement already satisfied: jinja2 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.0.1)
Requirement already satisfied: argon2-cffi in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (20.1.0)
Requirement already satisfied: prometheus-client in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.11.0)
Requirement already satisfied: Send2Trash>=1.5.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.5.0)
Requirement already satisfied: python-dateutil>=2.1 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jupyter-client->ipykernel>=4.5.1->ipywidgets) (2.8.1)
Requirement already satisfied: cffi>=1.0.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.14.5)
Requirement already satisfied: pycparser in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from cffi>=1.0.0->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.20)
Requirement already satisfied: typing-extensions>=3.6.4 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from importlib-metadata->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.10.0.0)
Requirement already satisfied: zipp>=0.5 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from importlib-metadata->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets) (3.4.1)
Requirement already satisfied: MarkupSafe>=2.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jinja2->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.0.1)
Requirement already satisfied: bleach in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (3.3.0)
Requirement already satisfied: jupyterlab-pygments in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.1.2)
Requirement already satisfied: mistune<2,>=0.8.1 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.8.4)
Requirement already satisfied: pandocfilters>=1.4.1 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.4.3)
Requirement already satisfied: defusedxml in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.7.1)
Requirement already satisfied: entrypoints>=0.2.2 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.3)
Requirement already satisfied: testpath in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.0)
Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.3)
Requirement already satisfied: async-generator in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbclient<0.6.0,>=0.5.0->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.10)
Requirement already satisfied: nest-asyncio in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbclient<0.6.0,>=0.5.0->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (1.5.1)
Requirement already satisfied: packaging in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (20.9)
Requirement already satisfied: webencodings in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (0.5.1)
Requirement already satisfied: pyparsing>=2.0.2 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from packaging->bleach->nbconvert->notebook>=4.4.1->widgetsnbextension~=3.5.0->ipywidgets) (2.4.7)
Installing collected packages: widgetsnbextension, jupyterlab-widgets, ipywidgets
Successfully installed ipywidgets-7.6.3 jupyterlab-widgets-1.0.0 widgetsnbextension-3.5.1
Collecting jupyter
Downloading jupyter-1.0.0-py2.py3-none-any.whl (2.7 kB)
Requirement already satisfied: ipywidgets in /root/venv/lib/python3.7/site-packages (from jupyter) (7.6.3)
Collecting qtconsole
Downloading qtconsole-5.1.0-py3-none-any.whl (119 kB)
|████████████████████████████████| 119 kB 14.1 MB/s
Requirement already satisfied: ipykernel in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jupyter) (5.5.5)
Collecting jupyter-console
Downloading jupyter_console-6.4.0-py3-none-any.whl (22 kB)
Requirement already satisfied: notebook in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jupyter) (7.0.0.dev0)
Requirement already satisfied: nbconvert in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jupyter) (6.0.7)
Requirement already satisfied: traitlets>=4.1.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipykernel->jupyter) (5.0.5)
Requirement already satisfied: jupyter-client in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipykernel->jupyter) (6.1.12)
Requirement already satisfied: tornado>=4.2 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipykernel->jupyter) (6.1)
Requirement already satisfied: ipython>=5.0.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipykernel->jupyter) (7.24.1)
Requirement already satisfied: matplotlib-inline in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipython>=5.0.0->ipykernel->jupyter) (0.1.2)
Requirement already satisfied: setuptools>=18.5 in /root/venv/lib/python3.7/site-packages (from ipython>=5.0.0->ipykernel->jupyter) (57.0.0)
Requirement already satisfied: decorator in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipython>=5.0.0->ipykernel->jupyter) (5.0.9)
Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipython>=5.0.0->ipykernel->jupyter) (3.0.18)
Requirement already satisfied: backcall in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipython>=5.0.0->ipykernel->jupyter) (0.2.0)
Requirement already satisfied: jedi>=0.16 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipython>=5.0.0->ipykernel->jupyter) (0.17.2)
Requirement already satisfied: pygments in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipython>=5.0.0->ipykernel->jupyter) (2.9.0)
Requirement already satisfied: pexpect>4.3 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipython>=5.0.0->ipykernel->jupyter) (4.8.0)
Requirement already satisfied: pickleshare in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipython>=5.0.0->ipykernel->jupyter) (0.7.5)
Requirement already satisfied: parso<0.8.0,>=0.7.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jedi>=0.16->ipython>=5.0.0->ipykernel->jupyter) (0.7.1)
Requirement already satisfied: ptyprocess>=0.5 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from pexpect>4.3->ipython>=5.0.0->ipykernel->jupyter) (0.7.0)
Requirement already satisfied: wcwidth in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=5.0.0->ipykernel->jupyter) (0.2.5)
Requirement already satisfied: ipython-genutils in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from traitlets>=4.1.0->ipykernel->jupyter) (0.2.0)
Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /root/venv/lib/python3.7/site-packages (from ipywidgets->jupyter) (1.0.0)
Requirement already satisfied: widgetsnbextension~=3.5.0 in /root/venv/lib/python3.7/site-packages (from ipywidgets->jupyter) (3.5.1)
Requirement already satisfied: nbformat>=4.2.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from ipywidgets->jupyter) (5.1.3)
Requirement already satisfied: jupyter-core in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbformat>=4.2.0->ipywidgets->jupyter) (4.7.1)
Requirement already satisfied: jsonschema!=2.5.0,>=2.4 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbformat>=4.2.0->ipywidgets->jupyter) (3.2.0)
Requirement already satisfied: six>=1.11.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->jupyter) (1.16.0)
Requirement already satisfied: attrs>=17.4.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->jupyter) (21.2.0)
Requirement already satisfied: importlib-metadata in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->jupyter) (4.5.0)
Requirement already satisfied: pyrsistent>=0.14.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->jupyter) (0.17.3)
Requirement already satisfied: pyzmq>=17 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from notebook->jupyter) (22.1.0)
Requirement already satisfied: argon2-cffi in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from notebook->jupyter) (20.1.0)
Requirement already satisfied: prometheus-client in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from notebook->jupyter) (0.11.0)
Requirement already satisfied: Send2Trash>=1.5.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from notebook->jupyter) (1.5.0)
Requirement already satisfied: terminado>=0.8.3 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from notebook->jupyter) (0.10.1)
Requirement already satisfied: jinja2 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from notebook->jupyter) (3.0.1)
Requirement already satisfied: python-dateutil>=2.1 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jupyter-client->ipykernel->jupyter) (2.8.1)
Requirement already satisfied: cffi>=1.0.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from argon2-cffi->notebook->jupyter) (1.14.5)
Requirement already satisfied: pycparser in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from cffi>=1.0.0->argon2-cffi->notebook->jupyter) (2.20)
Requirement already satisfied: typing-extensions>=3.6.4 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from importlib-metadata->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->jupyter) (3.10.0.0)
Requirement already satisfied: zipp>=0.5 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from importlib-metadata->jsonschema!=2.5.0,>=2.4->nbformat>=4.2.0->ipywidgets->jupyter) (3.4.1)
Requirement already satisfied: MarkupSafe>=2.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from jinja2->notebook->jupyter) (2.0.1)
Requirement already satisfied: bleach in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbconvert->jupyter) (3.3.0)
Requirement already satisfied: nbclient<0.6.0,>=0.5.0 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbconvert->jupyter) (0.5.3)
Requirement already satisfied: pandocfilters>=1.4.1 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbconvert->jupyter) (1.4.3)
Requirement already satisfied: jupyterlab-pygments in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbconvert->jupyter) (0.1.2)
Requirement already satisfied: defusedxml in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbconvert->jupyter) (0.7.1)
Requirement already satisfied: mistune<2,>=0.8.1 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbconvert->jupyter) (0.8.4)
Requirement already satisfied: testpath in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbconvert->jupyter) (0.5.0)
Requirement already satisfied: entrypoints>=0.2.2 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbconvert->jupyter) (0.3)
Requirement already satisfied: async-generator in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbclient<0.6.0,>=0.5.0->nbconvert->jupyter) (1.10)
Requirement already satisfied: nest-asyncio in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from nbclient<0.6.0,>=0.5.0->nbconvert->jupyter) (1.5.1)
Requirement already satisfied: webencodings in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from bleach->nbconvert->jupyter) (0.5.1)
Requirement already satisfied: packaging in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from bleach->nbconvert->jupyter) (20.9)
Requirement already satisfied: pyparsing>=2.0.2 in /shared-libs/python3.7/py-core/lib/python3.7/site-packages (from packaging->bleach->nbconvert->jupyter) (2.4.7)
Collecting qtpy
Downloading QtPy-1.9.0-py2.py3-none-any.whl (54 kB)
|████████████████████████████████| 54 kB 2.5 MB/s
Installing collected packages: qtpy, qtconsole, jupyter-console, jupyter
Successfully installed jupyter-1.0.0 jupyter-console-6.4.0 qtconsole-5.1.0 qtpy-1.9.0
from mxnet import autograd, gluon, init, io, nd, test_utils
from mxnet.gluon import nn
from scipy import signal
from skimage import filters # for image filters
import math
import matplotlib.pyplot as plt
import mxnet as mx
import numpy as np
import tqdm
import IProgress
# ctx = mx.gpu(0)
ctx = mx.cpu()
electrode_size = 14 # number of electrodes
pixel_size = 28 # number of pixels
phosphene_size = 1 # standard deviation
mnist = test_utils.get_mnist()
ax = plt.subplots(1, 10, figsize=(16, 4))[1]
for i, j in enumerate(np.random.choice(mnist['train_data'].shape[0], 10)):
ax[i].imshow(mnist["train_data"][j, 0], cmap='gray')
ax[i].axis("off")
# Phosphene functions from part 1
def show_image(image):
plt.imshow(image, cmap="gray")
plt.axis("off")
def create_electrode_grid(electrode_size, pixel_size):
electrode_grid = np.zeros((pixel_size, pixel_size), "bool")
ticks = np.linspace(0, pixel_size - 1, electrode_size).astype("uint16")
for tick in ticks:
electrode_grid[tick, ticks] = True
return electrode_grid
def create_electrode_image(electrode_grid, pixel_image, threshold):
electrode_image = electrode_grid * pixel_image
electrode_image = electrode_image > threshold
return electrode_image
def gaussian_2d(x, y, mx, my, sx, sy):
return 1. / (2. * np.pi * sx * sy) * np.exp(-((x - mx)**2. / (2. * sx**2.) + (y - my)**2. / (2. * sy**2.)))
def create_phosphene_filter(phosphene_size):
temp = np.arange(-np.ceil(2 * phosphene_size), np.ceil(2 * phosphene_size) + 1)
x, y = np.meshgrid(temp, temp)
phosphene_filter = gaussian_2d(x, y, 0, 0, phosphene_size, phosphene_size)
return phosphene_filter
def create_phosphene_image(electrode_image, phosphene_filter):
phosphene_image = signal.convolve2d(electrode_image, phosphene_filter, mode="same")
return phosphene_image
def simulate_phosphene_vision(pixel_image, image_filters, electrode_size, pixel_size, phosphene_size, threshold):
filtered_image = pixel_image
for _filter in image_filters:
filtered_image = _filter(filtered_image)
grid = create_electrode_grid(electrode_size, pixel_size)
image_elec = create_electrode_image(grid, filtered_image, threshold)
phosphene_filter = create_phosphene_filter(phosphene_size)
phosphene_image = create_phosphene_image(image_elec, phosphene_filter)
return phosphene_image, filtered_image
chosen_filter = []
chosen_threshold = 0
electrode_size = 10 # number of electrodes
pixel_size = mnist["train_data"][0][0].shape[0] # number of pixels
phosphene_size = 1 # standard deviation
def convert_mnist_to_phosphene(mnist_image):
return simulate_phosphene_vision(mnist_image, chosen_filter, electrode_size, pixel_size, phosphene_size, chosen_threshold)
# TODO: Remove inspection below
ax = plt.subplots(2, 10, figsize=(16, 3))[1]
for i, j in enumerate(np.random.choice(mnist['train_data'].shape[0], 10)):
phosphene_image, _ = convert_mnist_to_phosphene(mnist["train_data"][j, 0])
ax[0][i].imshow(mnist["train_data"][j, 0], cmap='gray')
ax[0][i].axis("off")
ax[1][i].imshow(phosphene_image, cmap='gray')
ax[1][i].axis("off")
class Decoder(nn.HybridSequential):
def __init__(self, activation = "relu", hiddens = 400, observables = 784, layers = 1, **kwargs): # Feel free to use different arguments
super(Decoder, self).__init__(**kwargs)
with self.name_scope():
for i in range(layers):
self.add(nn.Dense(hiddens, activation))
self.add(nn.Dense(2 * observables, activation="sigmoid"))
class Encoder(nn.HybridSequential):
def __init__(self, activation = "relu", hiddens= 400, latents = electrode_size * electrode_size, layers = 1, **kwargs): # Feel free to use different arguments
super(Encoder, self).__init__(**kwargs)
with self.name_scope():
for i in range(layers):
self.add(nn.Dense(hiddens, activation))
self.add(nn.Dense(2 * latents))
class Lossfun:
def __init__(self, w = 0.5): # Feel free to use different w which can be used as the weight of the different loss components
self.w = w
def __call__(self, x, x_mean, x_log_var, z_mean, z_log_var):
return self.w * self.get_kl(z_mean, z_log_var) + (1 - self.w) * self.get_nll(x, x_mean, x_log_var)
def get_kl(self, z_mean, z_log_var):
return 0.5 * nd.mean(((z_mean ** 2) + nd.exp(z_log_var) - z_log_var - 1))
def get_nll(self, x, x_mean, x_log_var):
return 0.5 * nd.mean(((x_log_var + math.log(2 * math.pi)) + ((x - x_mean) ** 2) * nd.exp(-x_log_var)))
class VariationalAutoencoder(gluon.HybridBlock):
def __init__(self, activation = "relu", hiddens= 400, latents = electrode_size * electrode_size, observables = 784, layers = 1, w = 0.5, **kwargs): # Feel free to use different arguments
super(VariationalAutoencoder, self).__init__()
with self.name_scope():
self.decoder = Encoder(activation, hiddens, observables, layers, **kwargs)
self.encoder = Decoder(activation, hiddens, latents, layers, **kwargs)
self.latents = latents
self.lossfun = Lossfun(w)
def hybrid_forward(self, F, x):
z_mean, z_log_var = F.split(self.encoder(x), 2, 1)
z = F.exp(0.5 * z_log_var) * F.random_normal(0, 1, (x.shape[0], self.latents), ctx) + z_mean
x_mean, x_log_var = nd.split(self.decoder(z), 2, 1)
return x, x_mean, x_log_var, z_mean, z_log_var
training_iter = io.NDArrayIter({"data": mnist["train_data"].reshape(-1, 784)}, {"label": mnist["train_label"]}, 30, True)
test_iter = io.NDArrayIter({"data": mnist["test_data"].reshape(-1, 784)}, {"label": mnist["test_label"]}, 30)
model = VariationalAutoencoder()
model.collect_params().initialize(init.Xavier(), ctx)
# variationalAutoencoder.hybridize()
trainer = gluon.Trainer(model.collect_params(), "adam", {"learning_rate": 0.001})
idx = np.random.choice(mnist['test_data'].shape[0], 10)
# Inputs
ax = plt.subplots(1, 10, figsize=(16, 4))[1]
for i, j in enumerate(idx):
ax[i].imshow(mnist["test_data"][j, 0])
ax[i].axis("off")
# Reconstructions
ax = plt.subplots(1, 10, figsize=(16, 4))[1]
for i, j in enumerate(idx):
ax[i].imshow(model(nd.array(mnist["test_data"][j, 0].reshape(1, 784)).as_in_context(ctx))[1].asnumpy().reshape(28, 28) > 0.5)
ax[i].axis("off")
# Latents
ax = plt.subplots(1, 10, figsize=(16, 4))[1]
for i, j in enumerate(idx):
ax[i].imshow(model(nd.array(mnist["test_data"][j, 0].reshape(1, 784)).as_in_context(ctx))[3].asnumpy().reshape(electrode_size, electrode_size))
ax[i].axis("off")
# Thresholded latents
ax = plt.subplots(1, 10, figsize=(16, 4))[1]
for i, j in enumerate(idx):
ax[i].imshow(model(nd.array(mnist["test_data"][j, 0].reshape(1, 784)).as_in_context(ctx))[3].asnumpy().reshape(electrode_size, electrode_size) > 0.5)
ax[i].axis("off")