{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Restricted Boltzmann Machine using quantum annealing on D-wave's QPU" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Imports" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import timeit\n", "import matplotlib.pyplot as plt\n", "from tqdm import tqdm_notebook as tqdm\n", "\n", "from qrbm.MSQRBM import MSQRBM\n", "from qrbm.classicalRBM import classicalRBM\n", "\n", "\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline \n", "plt.rcParams['image.cmap'] = 'gray'\n", "\n", "import pandas as pd\n", "\n", "from skimage import data, color\n", "from skimage.transform import rescale, resize, downscale_local_mean\n", "from skimage import img_as_bool\n", "\n", "import cv2 as cv\n", "\n", "import random" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Presets\n", "\n", "Here you can set hyperparameters for learning:\n", "\n", " - digits: list of digits to train on\n", " - THRESHOLD: how bright parts of image become 1 (darker become 0)\n", " - n_hidden: number of neurons in hidden layer\n", " - qpu: whether to use real D-wave's qpu (requires [setup](https://docs.ocean.dwavesys.com/en/stable/overview/sapi.html)) or a local simulator\n", " - epochs: number of epochs\n", " - lr: learning rate\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "image_height = 28\n", "image_width = 28\n", "\n", "# images will be flattened\n", "len_x = image_height * image_width\n", "len_y = 0\n", "\n", "digits = [0, 1]\n", "THRESHOLD = 100\n", "n_hidden = 30\n", "qpu = False\n", "epochs = 1000\n", "lr = 0.1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## reading dataset" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": false }, "outputs": [], "source": [ "mnist_dataset = pd.read_csv('./data/mnist_train.csv')\n", "mnist_test = pd.read_csv('./data/mnist_test.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## prepare train and test set" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": true }, "outputs": [], "source": [ "X_train = mnist_dataset.values[:,1:]\n", "X_train2 = mnist_dataset.values[:,:]\n", "\n", "X_test = mnist_test.values[:,1:]\n", "X_test2 = mnist_test.values[:,:]\n", "\n", "# print(mnist_dataset.values[:,0])\n", "X_train3 = []\n", "X_test3 = []\n", "\n", "for digit in digits:\n", " X_train3.append(mnist_dataset.values[np.where(mnist_dataset.values[:,0] == digit), 1:][0])\n", " X_test3.append(mnist_test.values[np.where(mnist_test.values[:,0] == digit), 1:][0])\n", "# X_train3 = mnist_dataset.values[np.where(mnist_dataset.values[:,0] == 0), 1:]\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "imgs = []\n", "imgs_test = []\n", "for digit_index in range(len(digits)):\n", " imgs.append(np.resize(X_train3[digit_index], (len(X_train3[digit_index]), 28, 28)) / 255)\n", " imgs_test.append(np.resize(X_test3[digit_index], (len(X_test3[digit_index]), 28, 28)) / 255)\n", " \n", "plt.imshow(imgs[0][0])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## resizing images" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "images_resized = []\n", "images_resized_test = []\n", "for digit_index in range(len(digits)):\n", " images_resized.append([resize(img, (image_width, image_height), anti_aliasing=True) for img in imgs[digit_index]])\n", " images_resized_test.append([resize(img, (image_width, image_height), anti_aliasing=True) for img in imgs_test[digit_index]])\n", "\n", " # images_resized = [resize(img, (image_width, image_height), anti_aliasing=True) for img in imgs]\n", "\n", "plt.imshow(images_resized[0][0])\n", "plt.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## normalizing images" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "images_normalized = []\n", "images_normalized_test = []\n", "\n", "for digit_index in range(len(digits)):\n", " images_normalized.append([cv.normalize(image_resized, image_resized, 0, 255, cv.NORM_MINMAX) for image_resized in images_resized[digit_index]])\n", " images_normalized_test.append([cv.normalize(image_resized, image_resized, 0, 255, cv.NORM_MINMAX) for image_resized in images_resized_test[digit_index]])\n", "\n", " # images_normalized = [cv.normalize(image_resized, image_resized, 0, 255, cv.NORM_MINMAX) for image_resized in images_resized]\n", "\n", "plt.imshow(images_normalized[0][0])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## converting to binary" ] }, { "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" } ], "source": [ "data = []\n", "data_test = []\n", "for digit_index in range(len(digits)):\n", " data.append([np.where(image_resized > THRESHOLD, 1, 0) for image_resized in images_resized[digit_index]])\n", " data_test.append([np.where(image_resized > THRESHOLD, 1, 0) for image_resized in images_resized_test[digit_index]])\n", " \n", "# data = [np.where(image_resized > THRESHOLD, 1, 0) for image_resized in images_resized]\n", "\n", "plt.imshow(data[0][0])\n", "plt.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## flattening the image" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n" ] } ], "source": [ "input_data = []\n", "input_data_test = []\n", "for digit_index in range(len(digits)):\n", " input_data.append([x.flatten().tolist() for x in data[digit_index]])\n", " input_data_test.append([x.flatten().tolist() for x in data_test[digit_index]])\n", " \n", "print(input_data[0][0])" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "result_picture_tab = []\n", "for digit_index in range(len(digits)):\n", " result_picture_tab.append(np.mean(input_data_test[digit_index], axis = 0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## shuffling the training data" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "for digit in digits:\n", " flat_input_data = [item for sublist in input_data for item in sublist]\n", " flat_input_data_test = [item for sublist in input_data_test for item in sublist]\n", "\n", "random.shuffle(flat_input_data)\n", "random.shuffle(flat_input_data_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## training" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "bm = MSQRBM(n_visible=len_x, n_hidden=n_hidden, qpu=qpu)\n", "bm.image_height = image_height\n", "bm.tqdm = tqdm\n", "bm.result_picture_tab = result_picture_tab" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "scrolled": true }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1e0f563b623b44d7a6e5dd8dac74098a", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/1000 [00:00" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "bm.train(flat_input_data, len_x, len_y, epochs = epochs, lr = lr, lr_decay = 0.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### See random sampling results" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "eval: 63.79137130362349\n" ] }, { "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" }, { "name": "stdout", "output_type": "stream", "text": [ "eval: 41.41975353684333\n" ] }, { "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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45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCrZr1Dmj/VNWi61try7QnOtA8c0qhjFMKZZxSKOOUQhmnFMo4pVDGKYXyPqeeZbH7pM91j1VLyzOnFMo4pVDGKYUyTimUcUqhjFMKZZxSKO9zHmL8e89Dh2dOKZRxSqGMUwplnFIo45RCGacUyjilUN7nXGH8m8yDh2dOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUqvxfwkmZPHNKoYxTCmWcUijjlEIZpxTKOKVQ/welbcsBaVCsQwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "eval: 26.30169186283452\n" ] }, { "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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nFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwq1ZNI7oGNTVbOub60t0J7oePPMKYUyTimUcUqhjFMKZZxSKOOUQhmnFMrvOfUss31PeqTvWDW/PHNKoYxTCmWcUijjlEIZpxTKOKVQximFMk4plHFKoYxTCmWcUijjlEIZpxTKOKVQximFMk4plHFKoYxTCmWcUijjlEIZpxTKOKVQximFMk4plHFKoYxTCmWcUijjlEIZpxTKOKVQximFMk4plHFKoYxTCmWcUijjlEIZpxTKOKVQSya9A5pfVTXr+tbaAu2J5sozpxTKOKVQximFMk4plHFKoYxTCmWcUii/51xkjvQ9qHJ45pRCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGMUwplnFIo45RCGacUyjilUMYphTJOKZRxSqGqtTbpfZA0hmdOKZRxSqGMUwplnFIo45RCGacU6v+toMf/CsrWDgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "eval: 27.94486366900192\n" ] }, { "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" }, { "name": "stdout", "output_type": "stream", "text": [ "eval: 78.94851416076634\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "for test in range(5):\n", " flat_input_data_test_img = np.reshape(flat_input_data_test[test], (image_width, image_height))\n", " plt.figure()\n", " plt.axis('off')\n", " plt.title(\"Image from test set\", y=1.03)\n", " plt.imshow(flat_input_data_test_img)\n", " plt.show()\n", " \n", " generated_pic = bm.generate(test_img = flat_input_data_test[test])\n", " evalutation = bm.evaluate(generated_pic, flat_input_data_test[test])\n", " print(\"evaluation: \", evaluation)\n", "# print(generated_pic)\n", " plt.figure()\n", " plt.axis('off')\n", " plt.title(\"Image reconstructed after training\", y=1.03)\n", " plt.imshow(np.array(generated_pic).reshape(image_height, -1))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.8.6" } }, "nbformat": 4, "nbformat_minor": 2 }