{ "nbformat": 4, "nbformat_minor": 0, "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.4.5" }, "colab": { "name": "Neural Networks and AutoDiff", "provenance": [], "collapsed_sections": [] } }, "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "S1mrLmaEbiRD" }, "source": [ "Neural Networks\n", "===============\n", "\n", "*Important:* Please read the [installation page](http://gpeyre.github.io/numerical-tours/installation_python/) for details about how to install the toolboxes.\n", "$\\newcommand{\\dotp}[2]{\\langle #1, #2 \\rangle}$\n", "$\\newcommand{\\enscond}[2]{\\lbrace #1, #2 \\rbrace}$\n", "$\\newcommand{\\pd}[2]{ \\frac{ \\partial #1}{\\partial #2} }$\n", "$\\newcommand{\\umin}[1]{\\underset{#1}{\\min}\\;}$\n", "$\\newcommand{\\umax}[1]{\\underset{#1}{\\max}\\;}$\n", "$\\newcommand{\\umin}[1]{\\underset{#1}{\\min}\\;}$\n", "$\\newcommand{\\uargmin}[1]{\\underset{#1}{argmin}\\;}$\n", "$\\newcommand{\\norm}[1]{\\|#1\\|}$\n", "$\\newcommand{\\abs}[1]{\\left|#1\\right|}$\n", "$\\newcommand{\\choice}[1]{ \\left\\{ \\begin{array}{l} #1 \\end{array} \\right. }$\n", "$\\newcommand{\\pa}[1]{\\left(#1\\right)}$\n", "$\\newcommand{\\diag}[1]{{diag}\\left( #1 \\right)}$\n", "$\\newcommand{\\qandq}{\\quad\\text{and}\\quad}$\n", "$\\newcommand{\\qwhereq}{\\quad\\text{where}\\quad}$\n", "$\\newcommand{\\qifq}{ \\quad \\text{if} \\quad }$\n", "$\\newcommand{\\qarrq}{ \\quad \\Longrightarrow \\quad }$\n", "$\\newcommand{\\ZZ}{\\mathbb{Z}}$\n", "$\\newcommand{\\CC}{\\mathbb{C}}$\n", "$\\newcommand{\\RR}{\\mathbb{R}}$\n", "$\\newcommand{\\EE}{\\mathbb{E}}$\n", "$\\newcommand{\\Zz}{\\mathcal{Z}}$\n", "$\\newcommand{\\Ww}{\\mathcal{W}}$\n", "$\\newcommand{\\Vv}{\\mathcal{V}}$\n", "$\\newcommand{\\Nn}{\\mathcal{N}}$\n", "$\\newcommand{\\NN}{\\mathcal{N}}$\n", "$\\newcommand{\\Hh}{\\mathcal{H}}$\n", "$\\newcommand{\\Bb}{\\mathcal{B}}$\n", "$\\newcommand{\\Ee}{\\mathcal{E}}$\n", "$\\newcommand{\\Cc}{\\mathcal{C}}$\n", "$\\newcommand{\\Gg}{\\mathcal{G}}$\n", "$\\newcommand{\\Ss}{\\mathcal{S}}$\n", "$\\newcommand{\\Pp}{\\mathcal{P}}$\n", "$\\newcommand{\\Ff}{\\mathcal{F}}$\n", "$\\newcommand{\\Xx}{\\mathcal{X}}$\n", "$\\newcommand{\\Mm}{\\mathcal{M}}$\n", "$\\newcommand{\\Ii}{\\mathcal{I}}$\n", "$\\newcommand{\\Dd}{\\mathcal{D}}$\n", "$\\newcommand{\\Ll}{\\mathcal{L}}$\n", "$\\newcommand{\\Tt}{\\mathcal{T}}$\n", "$\\newcommand{\\si}{\\sigma}$\n", "$\\newcommand{\\al}{\\alpha}$\n", "$\\newcommand{\\la}{\\lambda}$\n", "$\\newcommand{\\ga}{\\gamma}$\n", "$\\newcommand{\\Ga}{\\Gamma}$\n", "$\\newcommand{\\La}{\\Lambda}$\n", "$\\newcommand{\\si}{\\sigma}$\n", "$\\newcommand{\\Si}{\\Sigma}$\n", "$\\newcommand{\\be}{\\beta}$\n", "$\\newcommand{\\de}{\\delta}$\n", "$\\newcommand{\\De}{\\Delta}$\n", "$\\newcommand{\\phi}{\\varphi}$\n", "$\\newcommand{\\th}{\\theta}$\n", "$\\newcommand{\\om}{\\omega}$\n", "$\\newcommand{\\Om}{\\Omega}$\n", "$\\newcommand{\\eqdef}{\\equiv}$" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "8YI5cHeGbiRE" }, "source": [ "This tour details fully connected multi-layers neural networks for binary classification." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "IrrdCSp4biRE" }, "source": [ "We recommend that after doing this Numerical Tours, you apply it to your\n", "own data, for instance using a dataset from [LibSVM](https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/).\n", "\n", "_Disclaimer:_ these machine learning tours are intended to be\n", "overly-simplistic implementations and applications of baseline machine learning methods. For more advanced uses and implementations, we recommend\n", "to use a state-of-the-art library, the most well known being\n", "[Scikit-Learn](http://scikit-learn.org/)" ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "fJc27oW3biRE" }, "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt" ], "execution_count": 1, "outputs": [] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "llCAOH4sbiRE" }, "source": [ "# convert to a column vector\n", "def MakeCol(y): return y.reshape(-1,1)\n", "# convert to a row vector\n", "def MakeRow(y): return y.reshape(1,-1)\n", "# find non zero/true elements\n", "def find(x): return np.nonzero(x)[0]\n", "# inner product \n", "def dotp(x,y): return sum( x.flatten() * y.flatten() )" ], "execution_count": 2, "outputs": [] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "M9gFuO99biRE" }, "source": [ "Dataset Generation\n", "------------------\n", "\n", "We define a function to randomly generate samples, in dimension $p=2$." ] }, { "cell_type": "code", "metadata": { "id": "TnShS8q8cIoH" }, "source": [ "p = 2\n", "def rescale(u,a,b,a1,b1): return a1 + (u-a)*(b1-a1)/(b-a)\n", "def gen_point(m):\n", " y = np.sign(np.random.randn(1,m))\n", " x = np.zeros((2,m))\n", " r = 1 + .1*np.random.rand(m) # radius\n", " t = np.pi/2 + np.pi*np.random.rand(m) # angle\n", " x[0,:] = r * np.sin(t)\n", " x[1,:] = r * np.cos(t)\n", " I = (y.flatten()<0) \n", " x[0,I] = x[0,I] + 1\n", " x[1,I] = -.7-x[1,I] \n", " # rescale within a box \n", " x[0,:] = rescale(x[0,:], -1,2, .2,.8)\n", " x[1,:] = rescale(x[1,:], -1,.6, .2,.8) \n", " return x, y" ], "execution_count": 3, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "sR1hg8jXfyzW" }, "source": [ "Display a batch of data points." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 265 }, "id": "O8wFIDDidnBH", "outputId": "183693c1-b1be-4626-d72f-d27195e15c04" }, "source": [ "n = 400\n", "x, y = gen_point(n)\n", "plt.plot( x[0,y.flatten()>0], x[1,y.flatten()>0], 'b.' )\n", "plt.plot( x[0,y.flatten()<0], x[1,y.flatten()<0], 'r.' );" ], "execution_count": 4, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "_NoMGPx-biRE" }, "source": [ "Building the Network\n", "--------------------\n", "We setup the network. It is parameterized by the dimensions of the layers.\n", "\n", "\n", "The network $\\phi_\\th$ is composed of $R$ layers, and operate by initialyzing $x_0=x$ and then iterating\n", "$$ \\forall r=0,\\ldots,R, \\quad x_{r+1} \\eqdef \\rho(A_r x_r + b_r). $$\n", "Here $\\rho : \\RR \\mapsto \\RR$ is a non-linear activation function which\n", "operate coordinate by coordinate. The intermediate variables are $x_r \\in \\RR^{d_r}$\n", "with $(d_0,d_{L+1})=(p,1)$. The matrices have size $A_r \\in \\RR^{d_{r+1} \\times d_r}$ while the biases have size $b_r \\in \\RR^{d_{r+1}}$. The parameters of the networks are $\\th \\eqdef (A_r,b_r)_r$\n", "\n", "\n", "The final value is obtained by comparing the predicted value $x_{R+1} = \\phi_\\th(x)$ to the data $y$ using some loss function\n", "$$ \\min_{\\th} \\EE( \\ell(\\phi_{\\th}(x),y) ). $$\n", "\n", "\n", "Load the loss and its gradient.\n", "Here we use a logistic loss\n", "$$ \\ell(z,y) \\eqdef \\log( 1 + \\exp(-y z) ) . $$\n", "$$ \\ell'(z,y) \\eqdef -y \\frac{ \\exp(-y z) }{ 1 + \\exp(-y z) }. $$\n", "\n", "Note that in practice the computation is done in parallel over an array\n", "$X$ of size $(p,n)$ of $n$ points in $\\RR^p$, and $y \\in \\RR^{1 \\times n}$." ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "q_JxczY6biRF" }, "source": [ "def Loss(z,y): return 1/y.shape[1] * np.sum( np.log( 1 + np.exp(-y*z) ) )\n", "def nablaLoss(z,y): return -1/y.shape[1] * y * np.exp(-y*z) / ( 1 + np.exp(-y*z) )" ], "execution_count": 5, "outputs": [] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "-FL5Es4ObiRF" }, "source": [ "Load the activation function. Here we use an atan sigmoid function." ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "nDxpFasvbiRF" }, "source": [ "def rho(u): return np.arctan(u)\n", "def rhoG(u): return 1/(1+u**2)" ], "execution_count": 6, "outputs": [] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "gGYlrd4ObiRF" }, "source": [ "Display the activation." ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "colab": { "base_uri": "https://localhost:8080/", "height": 269 }, "id": "BFZolkhebiRF", "outputId": "58cb0b4d-4647-496a-ea42-9eb7e7d68b68" }, "source": [ "t = np.linspace(-5,5,201)\n", "plt.clf\n", "plt.plot(t, rho(t))\n", "plt.axis('tight');" ], "execution_count": 7, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "i43jhxQsbiRF" }, "source": [ "Dimensions $d_r$ of the layers. We use here a single hidden layer." ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "vvnI3s5sbiRF" }, "source": [ "D = np.array([p,15,1])" ], "execution_count": 8, "outputs": [] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "aVotsA-hbiRF" }, "source": [ "Initialize the layers randomly." ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "50my4mJhbiRF" }, "source": [ "R = D.size-1 \n", "A = []\n", "b = [] \n", "for r in np.arange(0,R):\n", " A.append(np.random.randn(D[r+1],D[r]))\n", " b.append(np.random.randn(D[r+1],1))" ], "execution_count": 9, "outputs": [] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "L7cwv1erbiRF" }, "source": [ "Evaluate the network.\n", "Bookkeep the intermediate results: this is crucial for the computation of\n", "the gradient." ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "_sbSCJ3sbiRF" }, "source": [ "def ForwardNN(A,b,x,R):\n", " X = []\n", " X.append(x)\n", " for r in np.arange(0,R):\n", " X.append( rho( A[r]@X[r] + np.tile(b[r],[1,x.shape[1]]) ) )\n", " return X" ], "execution_count": 10, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "Nnsc5XVlmwqT" }, "source": [ "X = ForwardNN(A,b,x,R)\n", "L = Loss(X[-1],y)" ], "execution_count": 11, "outputs": [] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "krzXfqI8biRF" }, "source": [ "Network Optimization\n", "--------------------\n", "\n", "The network parameters are optimized by minimizing the non-convex\n", "empirical loss minimization through gradient descent.\n", "\n", "We first here consider batch gradient descent, where we use a batch of $n$ samples $x=(x^{i})_{i=1}^n, y=(y^i)_{i=1}^n$ and minimize\n", "$$\n", " \\min_{\\th} f(\\th) \\eqdef \\frac{1}{n} \\sum_{i=1}^n \\ell(\\phi_{\\th}(x^{i}),y^{i}) ). \n", "$$\n", "using a simple fixed step-size gradient descent\n", "$$\n", " \\th \\leftarrow \\th - \\tau \\nabla f(\\th). \n", "$$" ] }, { "cell_type": "markdown", "metadata": { "id": "ScKka5CgqZFb" }, "source": [ "Initialize the gradient of $f$ with respect to $x_{R+1}$ as\n", "$$ \\nabla_{x_{R+1}} f = \\ell'( x_{R+1},y) = ( \\ell'( x_{R+1}^i,y^i) )_{i=1}^n \\in \\RR^{1 \\times n}$$ \n", "where $\\ell'$ is applied component wise to the columns $x_{R+1}^i$ of $x_{R+1}$ and $y$." ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "iZl0wON3biRF" }, "source": [ "gx = nablaLoss(X[R],y)" ], "execution_count": 12, "outputs": [] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "hP0oIknobiRF" }, "source": [ "The successive gradients with respect to the intermediate variables $x_r$\n", "are solutions of a backward recursion, which\n", "corresponds to the celebrated backpropagation algorithm.\n", "$$ \\forall r=R,\\ldots,1, \\quad\n", " \\nabla_{x_{r}} f = A_r^\\top M_r $$\n", "where we denoted\n", "$$ M_r \\eqdef \\rho'(A_r x_r + b_r ) \\odot \\nabla_{x_{r+1}} \\ell, $$\n", "where $\\odot$ is entry-wise multiplications.\n", "\n", "\n", "From these gradients with respect to the intermediate layers variables, the\n", "gradient with respect to the network paramters are retrieved as\n", "$$ \\nabla_{A_r} f = M_r x_r^\\top, \\qandq\n", " \\nabla_{b_r} f = M_r 1_n. $$\n", "\n", "\n", "We now implement this back-propagation of $\\nabla_{x_{R+1}} f$." ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "Wml50goEbiRF" }, "source": [ "def BackwardNN(A,b,X,R,gx):\n", " gA = [] # gradient with respect to A\n", " gb = [] # gradient with respect to b\n", " n = X[0].shape[1] # number of samples in mini-batch\n", " for r in np.arange(0,R):\n", " gA.append([]) \n", " gb.append([])\n", " for r in np.arange(R-1,-1,-1):\n", " M = rhoG( (A[r] @ X[r]) + np.tile(b[r],[1,n]) ) * gx\n", " # nabla_X[r] \n", " gx = (A[r].T) @ M\n", " # nabla_A[r]\n", " gA[r] = M @ (X[r].T)\n", " # nabla_b[r]\n", " gb[r] = MakeCol(M.sum(axis=1))\n", " return [gA,gb]" ], "execution_count": 13, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "XjzZ9eF_rx2P" }, "source": [ "We now implement the computation of $\\nabla_\\th f = (\\nabla_A f,\\nabla_b f)$ by performing first the forward pass and then the backward pass." ] }, { "cell_type": "code", "metadata": { "id": "bs3JJtIOxSnN" }, "source": [ "def ForwardBackwardNN(A,b,x,y):\n", " ## forward pass\n", " X = ForwardNN(A,b,x,R)\n", " L = Loss(X[R],y)\n", " gx = nablaLoss(X[R],y) # initialize the gradient\n", " [gA,gb] = BackwardNN(A,b,X,R,gx)\n", " return [L,gA,gb]" ], "execution_count": 14, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "Hc3CffOQtO5x" }, "source": [ "Initialize the layers randomly." ] }, { "cell_type": "code", "metadata": { "id": "ow9MfGxptOHd" }, "source": [ "for r in np.arange(0,R):\n", " A[r] = np.random.randn(D[r+1],D[r])\n", " b[r] = np.random.randn(D[r+1],1)" ], "execution_count": 15, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "Uh6K-7cxtdIK" }, "source": [ "Select the step size $\\tau$. It should be roughly independent of the batch size $n$ (since the energy is normalized by $1/n$) but depends on the size and number of layers. You should try different values or implement Armijo backtracking linesearch." ] }, { "cell_type": "code", "metadata": { "id": "j4gNxsnPtcY_" }, "source": [ "tau = .5 # should work for R=2\n", "if R==5:\n", " tau = .01/50\n", "if R==3:\n", " tau = .01/80" ], "execution_count": 16, "outputs": [] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "KBVraA57biRF" }, "source": [ "We implement a batch gradient descent." ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "zTiz4F6HbiRF", "colab": { "base_uri": "https://localhost:8080/", "height": 279 }, "outputId": "c93c8da7-4b62-4db3-862e-61ba1333ca2f" }, "source": [ "niter = 10000\n", "L = np.zeros((niter,1))\n", "for it in np.arange(0,niter):\n", " [L[it],gA,gb] = ForwardBackwardNN(A,b,x,y)\n", " for r in np.arange(0,R):\n", " A[r] = A[r] - tau*gA[r]\n", " b[r] = b[r] - tau*gb[r]\n", "plt.clf\n", "plt.plot(L)\n", "plt.xlabel('iter')\n", "plt.ylabel('$L$')\n", "plt.axis('tight');" ], "execution_count": 17, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "_iTtwIzcbiRF" }, "source": [ "Generate a set of point $z_i \\in \\RR^p$ on a grid for evaluation." ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "ZysaMm7pbiRF" }, "source": [ "q = 100;\n", "t = np.linspace(0,1,q)\n", "[U,V] = np.meshgrid(t,t)\n", "z = np.vstack([V.flatten(), U.flatten()])" ], "execution_count": 18, "outputs": [] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "ijpkKv0rbiRF" }, "source": [ "Classification \"probability\" at each loction $z$, computer as \n", "$$\\frac{e^{f_\\th(z)}}{1+e^{f_\\th(z)}}.$$ " ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "q9YRXQrQbiRF" }, "source": [ "def phi(r): return np.exp(r)/(1+np.exp(r))\n", "V = ForwardNN(A,b,z,R)\n", "U = np.reshape( phi(V[R].T), [q,q] )" ], "execution_count": 19, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "mAR5-yAc3VYH" }, "source": [ "Display the probability." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 269 }, "id": "YZmN9BVb3TfH", "outputId": "fa943b52-e234-49ef-f458-f0cab2498012" }, "source": [ "plt.clf\n", "plt.imshow(U.T, origin=\"lower\", extent=[0,1,0,1])\n", "plt.plot( x[0,y.flatten()>0], x[1,y.flatten()>0], 'b.' )\n", "plt.plot( x[0,y.flatten()<0], x[1,y.flatten()<0], 'r.' );" ], "execution_count": 20, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "u0scKo3pbiRG" }, "source": [ "You can test the method using a different number of layers and check its influence.\n", "\n" ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "sMoticzDbiRG", "colab": { "base_uri": "https://localhost:8080/", "height": 264 }, "outputId": "01445f1f-723d-4038-bec4-c4e1874636f0" }, "source": [ "Layers = []\n", "Layers.append([p, 1]) # vanilla logitic regression (convex)\n", "Layers.append([p, 8, 1]) # single hidden layer\n", "Layers.append([p, 3, 4, 1]) # 4 hidden layers\n", "Layers.append([p, 4, 5, 8, 4, 1]) # 4 hidden layers\n", "tau_list = np.array([.5, .5, .5, .5])\n", "plt.clf\n", "for il in np.arange(0,np.size(Layers)):\n", "\tD = Layers[il]\n", "\t# layers\n", "\tR = np.size(D)-1\n", "\tA = []\n", "\tb = []\n", "\tfor r in np.arange(0,R):\n", "\t A.append(np.random.randn(D[r+1],D[r]))\n", "\t b.append(np.random.randn(D[r+1],1))\n", "\t# descent\n", "\ttau = tau_list[il]\n", "\tniter = 10000 \n", "\tL = np.zeros((niter,1))\n", "\tfor it in np.arange(0,niter):\n", "\t [L[it],gA,gb] = ForwardBackwardNN(A,b,x,y)\n", "\t for r in np.arange(0,R):\n", "\t A[r] = A[r] - tau*gA[r]\n", "\t b[r] = b[r] - tau*gb[r]\n", "\t# display\n", "\tV = ForwardNN(A,b,z,R)\n", "\tU = np.reshape( phi(V[R].T), [q,q] )\n", "\tplt.subplot(2,2,il+1)\n", "\tplt.imshow(U.T, origin=\"lower\", extent=[0,1,0,1])\n", "\tplt.plot( x[0,y.flatten()>0], x[1,y.flatten()>0], 'b.' )\n", "\tplt.plot( x[0,y.flatten()<0], x[1,y.flatten()<0], 'r.' )\n", "\tplt.axis('off');\n", "\tplt.title('#layers=' + str(len(D)-1))" ], "execution_count": 21, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "sDuNq5HvbiRG" }, "source": [ "# Automatic Differentiation using *AutoGrad*\n", "\n", "Instead of computing the gradient \"by hand\", we use an automatic differentation toolbox, here [AutoGrad](https://github.com/HIPS/autograd).\n", "\n", "It uses reverse mode automatic differentation to compute the gradient at the same expense at computing the function itself. \n", "See [this tutorial for more information](https://rufflewind.com/2016-12-30/reverse-mode-automatic-differentiation)." ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "WwrmVLMCbiRG" }, "source": [ "import autograd.numpy as np\n", "import autograd as ag\n", "from autograd import elementwise_grad as egrad" ], "execution_count": 22, "outputs": [] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "L92f6gsXbiRG" }, "source": [ "Test on a scalar value function, computing and plotting higher-order derivatives." ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "wCF3VhuHbiRG", "colab": { "base_uri": "https://localhost:8080/", "height": 265 }, "outputId": "93402593-e2b0-4060-da28-11b9c1e5aca1" }, "source": [ "def tanh(x):\n", " return (1.0 - np.exp(-x)) / (1.0 + np.exp(-x))\n", "t = np.linspace(-7, 7, 200)\n", "plt.plot(t, tanh(t),\n", " t, egrad(tanh)(t), # first derivative\n", " t, egrad(egrad(tanh))(t), # second derivative\n", " t, egrad(egrad(egrad(tanh)))(t), # third derivative\n", " t, egrad(egrad(egrad(egrad(tanh))))(t), # fourth derivative\n", " t, egrad(egrad(egrad(egrad(egrad(tanh)))))(t), # fifth derivative\n", " t, egrad(egrad(egrad(egrad(egrad(egrad(tanh))))))(t)); # sixth derivative" ], "execution_count": 23, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "r8CYqtNObiRG" }, "source": [ "Gradient of a quadratic functions $f(u)=\\dotp{M u}{u}/2$ for $M$ symmetric, $\\nabla f(x)=Mx$." ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "_BbQzr83biRG", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "163b9fc6-f788-47a5-9fde-90d0ca97f06c" }, "source": [ "M = np.random.randn(3,3)\n", "M = M+M.T\n", "def f(u): \n", " return np.sum( .5 * u.T @ (M@u) )\n", "u = np.random.randn(3,1)\n", "g = ag.grad(f)\n", "print('Should be 0: ' + str( np.linalg.norm(np.abs((g(u) - M@u) ) )))" ], "execution_count": 24, "outputs": [ { "output_type": "stream", "text": [ "Should be 0: 0.0\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "HUd7s3gebiRG" }, "source": [ "Function $f(\\th)$ to be minimized for neural networks, where $\\theta=(A,b)$." ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "lckQ7H980tPo" }, "source": [ "def FuncNN(theta): \n", " X = ForwardNN(theta[0],theta[1],x,R)\n", " return Loss(X[-1],y)" ], "execution_count": 25, "outputs": [] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "JgdIhO7ibiRG" }, "source": [ "D = [p, 4, 5, 8, 4, 1]\n", "R = np.size(D)-1\n", "A = []\n", "b = []\n", "for r in np.arange(0,R):\n", " A.append(np.random.randn(D[r+1],D[r]))\n", " b.append(np.random.randn(D[r+1],1))" ], "execution_count": 26, "outputs": [] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "tl41-PzEbiRG" }, "source": [ "Compute the funcfion and the gradient" ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "Ga39gevRbiRG" }, "source": [ "FuncNNG = ag.value_and_grad(FuncNN)\n", "#X = ForwardNN(A,b,x,R)\n", "#FuncNN((A,b))\n", "[u,g] = FuncNNG((A,b))\n", "gA = g[0] # gradient with respect to A \n", "gb = g[1] # gradient with respect to b" ], "execution_count": 27, "outputs": [] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "id": "00ramBszbiRG" }, "source": [ "Compare with the gradient computed \"by hand\"." ] }, { "cell_type": "code", "metadata": { "deletable": true, "editable": true, "id": "4CwiUDhrbiRG", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "b4062737-83d1-4a19-b626-aa98a51e95eb" }, "source": [ "import numpy\n", "[L,gA1,gb1] = ForwardBackwardNN(A,b,x,y)\n", "R = np.size(A)\n", "e = 0\n", "for i in range(R):\n", " e += np.linalg.norm(gA[r]-gA1[r])\n", " e += np.linalg.norm(gb[r]-gb1[r])\n", "print('Should be 0:' + str(e))" ], "execution_count": 28, "outputs": [ { "output_type": "stream", "text": [ "Should be 0:1.0408340855860843e-16\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "f-rwPX7k2PJT" }, "source": [ "# Automatic Differentiation using *PyTorch*\n", "\n", "Pytorch is a powerful deep learning library whose main feature is to perform automatic differentiation. One caveat is that one need to manipulate PyTorch tensors in place of Numpy arrays. An avantage with respect to AutoGrad is that it contains higher level primitive which allows to hide from the user the parameter of the layer (e.g. linear weights and bias)." ] }, { "cell_type": "code", "metadata": { "id": "_23Hnrdy2Q0d" }, "source": [ "import torch\n", "import torch.nn as nn" ], "execution_count": 29, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "WGXxLWjBAXX_" }, "source": [ "We first define the architecture. You can try `nn.ReLu()` in place of nn.Sigmoid to obtain straight boundaries. One can try one the two following cell depending of the number of hidden layer you want." ] }, { "cell_type": "code", "metadata": { "id": "Fx3FA-4toiwZ" }, "source": [ "D = [p, 4, 5, 8, 4, 1]\n", "model = nn.Sequential(\n", " nn.Linear(D[0], D[1]),\n", " nn.Tanh(),\n", " nn.Linear(D[1], D[2]),\n", " nn.Tanh(),\n", " nn.Linear(D[2], D[3]),\n", " nn.Tanh(),\n", " nn.Linear(D[3], D[4]),\n", " nn.Tanh(),\n", " nn.Linear(D[4], D[5]),\n", ")" ], "execution_count": 30, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "h4VOk3OSbAJM" }, "source": [ "D = [p, 40, 1]\n", "model = nn.Sequential(\n", " nn.Linear(D[0], D[1]),\n", " nn.Tanh(),\n", " nn.Linear(D[1], D[2]),\n", ")" ], "execution_count": 31, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "LEgLb7v4_Hp_", "outputId": "334c4783-63dc-4d44-d794-b8b26747790a" }, "source": [ "print(model)" ], "execution_count": 32, "outputs": [ { "output_type": "stream", "text": [ "Sequential(\n", " (0): Linear(in_features=2, out_features=40, bias=True)\n", " (1): Tanh()\n", " (2): Linear(in_features=40, out_features=1, bias=True)\n", ")\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "zPoYuBxDo1yD" }, "source": [ "Initialize the weights." ] }, { "cell_type": "code", "metadata": { "id": "EeUiaYgDcs10" }, "source": [ "nn.init.normal_(model[0].bias, 0, 1)\n", "nn.init.normal_(model[0].weight, 0,1)\n", "nn.init.normal_(model[2].bias, 0, 1)\n", "nn.init.normal_(model[2].weight, 0,1);" ], "execution_count": 33, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "IaH6M9zyBZPV" }, "source": [ "Convert arrays into PyTorch tensors. Beware that for PyTorch the data should be of size $(p,n)$, so we transpose the tensors. " ] }, { "cell_type": "code", "metadata": { "id": "AsRfvXA6BIxX" }, "source": [ "X = torch.Tensor(x).T\n", "Y = torch.Tensor(y).T" ], "execution_count": 34, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "dTJKwlvLGVzn" }, "source": [ "Run the forward pass: evaluate the loss function." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "guCONbyAEqT4", "outputId": "72044c61-f530-4aa2-b3d7-47a989f9f89f" }, "source": [ "loss = 1/n * torch.sum( -torch.log( torch.sigmoid(-model(X)*Y) ) )\n", "print( loss.item() )" ], "execution_count": 35, "outputs": [ { "output_type": "stream", "text": [ "1.9115080833435059\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "1Rbi2XnxGclF" }, "source": [ "Run the backward pass to evaluate the gradients of all the involved parameters." ] }, { "cell_type": "code", "metadata": { "id": "dC4v28ahGar-" }, "source": [ "model.zero_grad()\n", "loss.backward()" ], "execution_count": 36, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "6BnDZh6YGt5o" }, "source": [ "Do the stepping:\n", "$$ \\theta \\leftarrow \\th - \\tau \\nabla f(\\th). $$" ] }, { "cell_type": "code", "metadata": { "id": "3p0cfDC9GpLi" }, "source": [ "tau = .5\n", "with torch.no_grad():\n", " for theta in model.parameters():\n", " theta -= tau * theta.grad" ], "execution_count": 37, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "R4H5FpcnGi6v" }, "source": [ "Putting all together: implement the batch gradient descent." ] }, { "cell_type": "code", "metadata": { "id": "92Bg21HqAdqA" }, "source": [ "tau = .4\n", "niter = 10000\n", "L = np.zeros((niter,1))\n", "for i in range(niter):\n", " # loss = 1/n * torch.sum( torch.LogSigmoid(-model(X)*Y) )\n", " loss = 1/n * torch.sum( -torch.log( torch.sigmoid(model(X)*Y) ) )\n", " L[i] = loss.item()\n", " model.zero_grad()\n", " loss.backward()\n", " with torch.no_grad():\n", " for theta in model.parameters():\n", " theta -= tau * theta.grad" ], "execution_count": 38, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "AwSAQ8XloxVZ" }, "source": [ "Plot the evolution of the training loss." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 265 }, "id": "kSw7X-b7DQQa", "outputId": "91ecb12c-512f-446b-fc10-352097ac1590" }, "source": [ "plt.plot(L);" ], "execution_count": 39, "outputs": [ { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAbIElEQVR4nO3deXgc9Z3n8fe3D122bMm2bIwPbAdDAgmJidaYkASHADE8LJ7JTCZ2srmA+HmygbBhnpmBzT4ky8zzZJjMzpCDATyEYZKZcEzCBj+sWeeAhE04grixjUE2h2UOybdlWZZa/d0/qiR3t1tSW2qpVeXP63n66Tp+XfUtlf3p6l9Vd5m7IyIi0ZeodAEiIlIeCnQRkZhQoIuIxIQCXUQkJhToIiIxkarUimfMmOELFiyo1OpFRCLpqaee2unuTcXmVSzQFyxYQEtLS6VWLyISSWb2+mDz1OUiIhITCnQRkZhQoIuIxIQCXUQkJhToIiIxoUAXEYkJBbqISExELtAzfVnubdlONquf/RURyVWxLxaN1A9/9yrffvAlslln1dL5lS5HRGTCiNwR+u6DPQDsPdRb4UpERCaWyAW6iIgUF9lA153zRETyRS/QrdIFiIhMTJEL9F9sfAeA1vbOClciIjKxRC7QM9ksAK4+FxGRPJEL9H6KcxGRfJELdAs70XWELiKSL3qBrpOiIiJFRS7QRUSkuMgGujpcRETyDRvoZnaHmbWb2YvDtPtPZpYxsz8tX3lF1hM+qwtdRCRfKUfodwIrhmpgZkngRuAXZahpSBZ2oivPRUTyDRvo7v4IsHuYZlcBPwPay1HUUHROVESkuFH3oZvZHOCPgVtKaLvGzFrMrKWjo2NU69VliyIi+cpxUvQm4K/cPTtcQ3df6+7N7t7c1NQ0srWFh+iKcxGRfOW4wUUzcHfYtz0DuNjMMu7+8zIs+yjqchERKW7Uge7uC/uHzexO4IGxCvP8FY/5GkREImXYQDezu4DlwAwzawO+CaQB3P3WMa2ueD0AuBJdRCTPsIHu7qtLXZi7f3FU1ZRAXS4iIsVF9puiIiKSL7KBrqsWRUTyRS7Q+39tUYEuIpIveoGuXnQRkaIiF+j9dJWLiEi+yAW6ulxERIqLXKD3U56LiOSLXKCb7kEnIlJU5AJdRESKi1yg645FIiLFRS/QB3pclOgiIrkiF+giIlJcZANdXS4iIvkiF+imOxaJiBQVvUDXV/9FRIqKXKCLiEhxkQ10Vye6iEieYQPdzO4ws3Yze3GQ+Z81s+fN7AUze9TM3l/+Mo9IqA9dRKSoUo7Q7wRWDDH/VeBcd38f8NfA2jLUNbj+e4oq0UVE8pRyT9FHzGzBEPMfzRl9HJg7+rJERORYlbsP/XLgwcFmmtkaM2sxs5aOjo4RrWDgq/8jerWISHyVLdDN7GMEgf5Xg7Vx97Xu3uzuzU1NTSNcz8CyRvR6EZG4GrbLpRRmdgZwO3CRu+8qxzJFROTYjPoI3czmA/cBn3P3l0dfkoiIjMSwR+hmdhewHJhhZm3AN4E0gLvfClwPTAf+Kbz5RMbdm8eqYP18rohIcaVc5bJ6mPlXAFeUraJh6I5FIiLFRfaboiIiki+yge66cFFEJE/kAl196CIixUUv0AeuQ69sHSIiE03kAr21vROAx7bpcncRkVyRC/Q9Xb2VLkFEZEKKXKCLiEhxCnQRkZhQoIuIxIQCXUQkJhToIiIxoUAXEYkJBbqISEwo0EVEYkKBLiISEwp0EZGYUKCLiMTEsIFuZneYWbuZvTjIfDOz75lZq5k9b2Znlr9MEREZTilH6HcCK4aYfxGwOHysAW4ZfVkiInKshg10d38E2D1Ek5XAjzzwONBgZrPLVaCIiJSmHH3oc4DtOeNt4bSjmNkaM2sxs5aOjo4yrFpERPqN60lRd1/r7s3u3tzU1DSeqxYRib1yBPoOYF7O+NxwmoiIjKNyBPo64PPh1S7LgH3u/lYZlisiIscgNVwDM7sLWA7MMLM24JtAGsDdbwXWAxcDrUAX8KWxKlZERAY3bKC7++ph5jvw1bJVJCIiI6JvioqIxIQCXUQkJhToIiIxoUAXEYkJBbqISEwo0EVEYkKBLiISEwp0EZGYUKCLiMSEAl1EJCYU6CIiMaFAFxGJCQW6iEhMRC7Q3ztnSqVLEBGZkCIX6Olk5EoWERkXSkcRkZiIXKDPa6yrdAkiIhNSSYFuZivMbIuZtZrZtUXmzzezh83sGTN73swuLn+pgU+eOWesFi0iEmnDBrqZJYGbgYuA04DVZnZaQbP/Adzr7kuAVcA/lbvQnHrGatEiIpFWyhH6UqDV3be5ew9wN7CyoI0D/ZefTAXeLF+JIiJSimFvEg3MAbbnjLcBZxW0+RbwCzO7CpgEnF+W6orQ8bmISHHlOim6GrjT3ecCFwM/NrOjlm1ma8ysxcxaOjo6RrQi9biIiBRXSqDvAObljM8Np+W6HLgXwN0fA2qAGYULcve17t7s7s1NTU0jq1hERIoqJdCfBBab2UIzqyI46bmuoM0bwMcBzOw9BIE+skPwYZg6XUREiho20N09A1wJbAA2E1zNstHMbjCzS8Nmfw582cyeA+4CvujuPhYFp5MKdBGRYko5KYq7rwfWF0y7Pmd4E3BOeUsrbsn8RgC+dM6C8VidiEhkRO6bov0nRafVVVW2EBGRCSZ6gR4+j0l/johIhEUv0HXdoohIUZEL9H5jc8pVRCS6IhfoR7pclOgiIrmiF+hhousIXUQkXwQDXX3oIiLFRC7Q++kAXUQkX2QDXX0uIiL5IhnoZjpCFxEpFM1Ar3QBIiITUCQDHdTjIiJSKJKBbma6Dl1EpEA0Ax0doYuIFIpmoOukqIjIUaIZ6DotKiJylEgGOqjLRUSkUDQD3fTjXCIihUoKdDNbYWZbzKzVzK4dpM2fmdkmM9toZj8pb5kF6wJ1oouIFBj2nqJmlgRuBi4A2oAnzWxdeB/R/jaLgeuAc9x9j5nNHKuCg/WN5dJFRKKplCP0pUCru29z9x7gbmBlQZsvAze7+x4Ad28vb5lH0wG6iEi+UgJ9DrA9Z7wtnJbrFOAUM/u9mT1uZiuKLcjM1phZi5m1dHR0jKxigqtcXGdFRUTylOukaApYDCwHVgP/bGYNhY3cfa27N7t7c1NT04hXZqarXERECpUS6DuAeTnjc8NpudqAde7e6+6vAi8TBPyYUBe6iMjRSgn0J4HFZrbQzKqAVcC6gjY/Jzg6x8xmEHTBbCtjnUfRAbqISL5hA93dM8CVwAZgM3Cvu280sxvM7NKw2QZgl5ltAh4G/sLdd41V0Qd7+njopTE/7yoiEinDXrYI4O7rgfUF067PGXbgmvAxLl7deXC8ViUiEgnR/KYocO4pIz+pKiISR5EM9FlTqjlhSk2lyxARmVAiGegJ3eBCROQokQ30rPJcRCRPJAMdIKtvFomI5IlkoCcS6EJ0EZEC0Qx0Mx2hi4gUiGSgG6gPXUSkQCQDPbjKRUREckUy0DGdFBURKRTJQE+Y6aSoiEiBiAa6jtBFRApFMtANXeUiIlIomoGuOxaJiBwlooGur/6LiBSKZKAnDN0kWkSkQEQDXdehi4gUKinQzWyFmW0xs1Yzu3aIdn9iZm5mzeUrsdh6dJWLiEihYQPdzJLAzcBFwGnAajM7rUi7euBq4IlyF1lkXTopKiJSoJQj9KVAq7tvc/ce4G5gZZF2fw3cCHSXsb6idB26iMjRSgn0OcD2nPG2cNoAMzsTmOfu/2eoBZnZGjNrMbOWjo6OYy52YDnoskURkUKjPilqZgngH4A/H66tu69192Z3b25qGvlNnnULOhGRo5US6DuAeTnjc8Np/eqB9wK/MbPXgGXAurE8MWoG2exYLV1EJJpKCfQngcVmttDMqoBVwLr+me6+z91nuPsCd18APA5c6u4tY1Ix/V8s0hG6iEiuYQPd3TPAlcAGYDNwr7tvNLMbzOzSsS6wmIR+bFFE5CipUhq5+3pgfcG06wdpu3z0ZQ3NMNzV5yIikiua3xRN6CoXEZFC0Qx0M/qU6CIieSIZ6KmEkelToIuI5IpkoNekk3T39lW6DBGRCSW6gZ5RoIuI5IpooCfo7tVVLiIiuSIZ6NUpdbmIiBSKZKDPmlLDge4MuzoPV7oUEZEJI5KBfs7J0wH42dNtFa5ERGTiKOmbohPNGXMbWH5qE99+8CUe27qLd8+ewozJ1UyblGZSVYrJ1SkmVaeYXHNkuC6dJJGwSpcuIjJmIhnoAD/4zJl8/9ev8MvN7/D/XtlJJjv0delmMKkqxaTqJJOqU9TXpJlSk6K+JkV9dTp4rkkzpTZ4rg/nTQmH+59TyUh+qBGR44B5hb5x2dzc7C0t5flBRndn/6EMu7t6OHg4Q+fhzMDzkeG+4Lk7Q2dPhgPdGQ509w487z+U4VAJJ1rrq1M0TqqicVIV0+rS4XM4PqmKxroqZkyu4oSpNcyaUkNabwAiUkZm9pS7F/158sgeoecyM6bWpZlalx7Vcnr7snR2B2G/Pwz7/QWhv/dQD3sO9rC7q5ednT28/E4ne7p66Oo5+s0gYTCzvoYTG2qY3VDL3MZa3tU0mZNnBo8pNaOrV0QkVywCvVzSycTA0fex6u7tY09XD7sP9rCzs4e39h7izb2HeHNfN2/tO8SmN/fzy43v0NN35Pr5mfXVvHv2FJbMa+AD8xtYMq+BhrpjX7eICCjQy6YmnWT21FpmT60dtE1f1tm+u4vW9k5eae+ktb2TjW/u43sPvTLw65Gnzqrn3FObOPeUJpoXNFKdSo7TFohI1MWiDz3qOg9neL5tL8+8sZfft+7kydd209vnTK5OceHps/ijD8zhQ++arhOyIjJkH7oCfQI6eDjDY1t3sWHj2/zfF9/mwOEMM+ur+cxZ8/nsWSfRVF9d6RJFpEJGHehmtgL4LpAEbnf3vy2Yfw1wBZABOoDL3P31oZapQC9Nd28fv9nSzj1PbufhLR1UJRP85/efyFXnncyCGZMqXZ6IjLNRBbqZJYGXgQuANoKbRq929005bT4GPOHuXWb2FWC5u396qOUq0I/d1o5O/vXR17i3ZTu9fc6nPjiXqz6+mDkNg/fbi0i8DBXopXTKLgVa3X2bu/cAdwMrcxu4+8Pu3hWOPg7MHU3BUty7miZzw8r38shffozPLTuJ+57ewcf+/jfc9KuX9WNlIlJSoM8BtueMt4XTBnM58GCxGWa2xsxazKylo6Oj9Colz8z6Gr516ek8/BfL+cTpJ3DTr17hwn98hIdeeqfSpYlIBZX1sgkz+y9AM/CdYvPdfa27N7t7c1NTUzlXfVya01DL91cv4SdXnEVVKsFld7bwtbueYc/BnkqXJiIVUEqg7wDm5YzPDaflMbPzgW8Al7q7ftd2HH3o5Bms/9pH+Pr5p7D+hbe44B8f4ZebdLQucrwpJdCfBBab2UIzqwJWAetyG5jZEuA2gjBvL3+ZMpyqVIKrz1/M/VeeQ1N9NV/+UQvX3PMs+7p6K12aiIyTYQPd3TPAlcAGYDNwr7tvNLMbzOzSsNl3gMnAf5jZs2a2bpDFyRg7/cSp3P/Vc/jaeSdz/3Nv8ombHuG3L+t8hcjxQF8sirHn2/Zyzb3P0dreyWfOms83Ln4Pk6r1aw8iUTbayxYlos6Y28ADV32YNR9dxF1/eIMV332EJ7btqnRZIjJGFOgxV5NO8t8vfg/3rDkbw1j1z4/zNw9s0nXrIjGkQD9OLF04jQev/gifPWs+t//uVS75/u94bvveSpclImWkQD+OTKpO8Td/9D5+dNlSOrszfPKWR/n2g5s5eDhT6dJEpAwU6Mehj57SxIavf5RPLpnDbb/dxnn/6zfc/+wOKnWCXETKQ4F+nJpam+Y7n3o/P/vKh5hZX8PVdz/Lp259jD+8urvSpYnICCnQj3MfPKmR+796Djf+yft4fXcXf3bbY3zuh0/w9Bt7Kl2aiBwjXYcuAw719PFvj7/OLb/dyu6DPZy9aDqXfXgh5717JsmEVbo8EUF3LJJjdPBwhn97/HXufPQ13trXzfxpdXz+7JNY+YE5uluSSIUp0GVEevuybNj4Nv/y+9d46vU9JBPGuac08ckz5/Dxd8+itko3sBYZb0MFur4HLoNKJxNccsaJXHLGibz8zgHue3oHP39mBw+91E5NOsGHT27iwtNmcd57ZjJjso7cRSpNR+hyTPqyzuPbdvGLjW/zq83t7Nh7CDM4bfYUli2aztmLprN00TSm1KQrXapILKnLRcaEu7Pprf38enM7j23dxVNv7KEnkyVhcOoJU3j/3KmcMbeBM+ZO5dQT6kkndVGVyGgp0GVcdPf28ez2vTy2dRdPv7GHF3bsY2/4e+xVqQSnzJrM4pn1LO5/njmZedPqdAWNyDFQH7qMi5p0kmWLprNs0XQgOILfvvsQz+/Yy/Nt+3jp7QM8sW0X//uZIze8qkolmNtYy7zGOuZNq2X+tLpwuI45DbU01KUxU+CLlEKBLmPGzJg/vY750+u45IwTB6Yf6O6ltb2TV9o72dreyRu7u9i+p4tnt+9l36H8OyxVpRI0Ta5m1pRqZtbXBM9TaphZX82M+moa66porEvTUFfFlJqUwl+Oawp0GXf1NWmWzG9kyfzGo+btO9RL254utu8+xI69h2g/0E3H/sO8c6CbrR2dPLp1J/u7i/+YWDJhNNSmaZx0JOQbatPU16SZXJOivjrF5JoUk8Pn3PH66jSTqpOk1M8vEVZSoJvZCuC7QBK43d3/tmB+NfAj4IPALuDT7v5aeUuV48HU2jRTa6dy+olTB23T3dtH+/7D7Dx4mL1dPew52Muerp7w0TswbfvuLl7o6uXg4QydPRlKOV1UlUpQm04Gj6okNekktekEtVXBtJqcebXpJNXp/ukJqlIJqpL5z+n+8SHmVYfDOpcgozVsoJtZErgZuABoA540s3Xuvimn2eXAHnc/2cxWATcCnx6LgkVq0smBrpxSZbPOwZ4MnYczdHZnOBA+544f6O7lUG8f3T19wXNvNnzu41BPH3u7jszvzmQ5FLYrl2TCqEomSCVtIOBTCSOZyB9PJY1kIpEz78h44fwj40aq/zXJYHrCjjySCUiE05JmmAX1JBOGhdOSCQaGEwnC1+Uuw0hY/nLy2w3+GgvXmTDDYGAYguUZ4TwjnJ/fPhHOKJxm4TQjZz3h8uPYPVfKEfpSoNXdtwGY2d3ASiA30FcC3wqHfwr8wMzM9XusMkEkEkZ9TdD9wuAH/8fM3TmcydLd20dPJsvhTJbeviw9fVl6MuGjyHBv+Hw4nNabcXr6+sJ5Tl/WyWSdTF92YLgv6/TmjGeyWTJ9zuHeLJls38B47vy+vv7hI8vqzTrZrNPnXtKnljjrD/lEGPoYA8O5bzT9byK57Rlok/tGlP8mkvcGFLwEA1Yvnc8VH1lU9u0pJdDnANtzxtuAswZr4+4ZM9sHTAd2lqNIkYnKzKgJu2KiyN3JevCFsawHj2A4+FST9SD4s1kG5rlD38Cw5wwXLid4Tf+bR94yB9oFr/GwFvfgNe7gBMP0TyN/XmH7bPju5MXaD7QBJ2caua8P5uFHTxusPQR/GyfYFi/SPq/e4CVj9ptI43pS1MzWAGsA5s+fP56rFpEigi4U1H8fE6Wc0t8BzMsZnxtOK9rGzFIEH2qPur28u69192Z3b25qahpZxSIiUlQpgf4ksNjMFppZFbAKWFfQZh3whXD4T4GH1H8uIjK+hu1yCfvErwQ2EFy2eIe7bzSzG4AWd18H/BD4sZm1ArsJQl9ERMZRSX3o7r4eWF8w7fqc4W7gU+UtTUREjoW+FiciEhMKdBGRmFCgi4jEhAJdRCQmKnaDCzPrAF4f4ctncPx9C1XbfHzQNh8fRrPNJ7l70S/yVCzQR8PMWga7Y0dcaZuPD9rm48NYbbO6XEREYkKBLiISE1EN9LWVLqACtM3HB23z8WFMtjmSfegiInK0qB6hi4hIAQW6iEhMRC7QzWyFmW0xs1Yzu7bS9YyUmc0zs4fNbJOZbTSzq8Pp08zsl2b2SvjcGE43M/teuN3Pm9mZOcv6Qtj+FTP7wmDrnCjMLGlmz5jZA+H4QjN7Ity2e8KfacbMqsPx1nD+gpxlXBdO32Jmn6jMlpTGzBrM7Kdm9pKZbTazs+O+n83s6+G/6xfN7C4zq4nbfjazO8ys3cxezJlWtv1qZh80sxfC13zPrISboAa3ZorGg+Dne7cCi4Aq4DngtErXNcJtmQ2cGQ7XAy8DpwF/B1wbTr8WuDEcvhh4kOCWhMuAJ8Lp04Bt4XNjONxY6e0bZtuvAX4CPBCO3wusCodvBb4SDv9X4NZweBVwTzh8Wrjvq4GF4b+JZKW3a4jt/VfginC4CmiI834muCXlq0Btzv79Ytz2M/BR4EzgxZxpZduvwB/Ctha+9qJha6r0H+UY/4BnAxtyxq8Drqt0XWXatvuBC4AtwOxw2mxgSzh8G7A6p/2WcP5q4Lac6XntJtqD4I5XvwbOAx4I/7HuBFKF+5jgN/jPDodTYTsr3O+57Sbag+DuXa8SXoBQuP/iuJ85co/haeF+ewD4RBz3M7CgINDLsl/DeS/lTM9rN9gjal0uxW5YPadCtZRN+BFzCfAEMMvd3wpnvQ3MCocH2/ao/U1uAv4SyIbj04G97p4Jx3Prz7v5ONB/8/EobfNCoAP4l7Cb6XYzm0SM97O77wD+HngDeItgvz1FvPdzv3Lt1znhcOH0IUUt0GPHzCYDPwP+m7vvz53nwVtzbK4rNbNLgHZ3f6rStYyjFMHH8lvcfQlwkOCj+IAY7udGYCXBm9mJwCRgRUWLqoBK7NeoBXopN6yODDNLE4T5v7v7feHkd8xsdjh/NtAeTh9s26P0NzkHuNTMXgPuJuh2+S7QYMHNxSG//sFuPh6lbW4D2tz9iXD8pwQBH+f9fD7wqrt3uHsvcB/Bvo/zfu5Xrv26IxwunD6kqAV6KTesjoTwjPUPgc3u/g85s3JvuP0Fgr71/umfD8+WLwP2hR/tNgAXmlljeGR0YThtwnH369x9rrsvINh3D7n7Z4GHCW4uDkdvc7Gbj68DVoVXRywEFhOcQJpw3P1tYLuZnRpO+jiwiRjvZ4KulmVmVhf+O+/f5tju5xxl2a/hvP1mtiz8G34+Z1mDq/RJhRGchLiY4IqQrcA3Kl3PKLbjwwQfx54Hng0fFxP0Hf4aeAX4FTAtbG/AzeF2vwA05yzrMqA1fHyp0ttW4vYv58hVLosI/qO2Av8BVIfTa8Lx1nD+opzXfyP8W2yhhLP/Fd7WDwAt4b7+OcHVDLHez8D/BF4CXgR+THClSqz2M3AXwTmCXoJPYpeXc78CzeHfbyvwAwpOrBd76Kv/IiIxEbUuFxERGYQCXUQkJhToIiIxoUAXEYkJBbqISEwo0EVEYkKBLiISE/8fBwuNNWT3cjoAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "eLicOTqcV6HB" }, "source": [ "Vizualize the application of the network on the grid point defined by `z`." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 248 }, "id": "I8amc71RVXs6", "outputId": "e56839ae-5362-4edd-cf19-594a279e5054" }, "source": [ "V = model(torch.Tensor(z).T)\n", "V = V.detach().numpy() # convert back to numpy array\n", "U = np.reshape( phi(V), [q,q] )\n", "plt.imshow(U.T, origin=\"lower\", extent=[0,1,0,1])\n", "plt.plot( x[0,y.flatten()>0], x[1,y.flatten()>0], 'b.' )\n", "plt.plot( x[0,y.flatten()<0], x[1,y.flatten()<0], 'r.' )\n", "plt.axis('off');" ], "execution_count": 40, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] } ] }