Skip to content

Instantly share code, notes, and snippets.

@akelleh
Last active January 31, 2018 01:43
Show Gist options
  • Save akelleh/9719d5689ec4c1cd36ece7964025aceb to your computer and use it in GitHub Desktop.
Save akelleh/9719d5689ec4c1cd36ece7964025aceb to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from numpy.random import seed\n",
"from tensorflow import set_random_seed\n",
"\n",
"set_random_seed(2)\n",
"seed(1)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Using TensorFlow backend.\n"
]
}
],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"\n",
"from keras.layers import Dense, Input\n",
"from keras.models import Model\n",
"from keras.optimizers import RMSprop"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x11bf4d310>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAEKCAYAAADuEgmxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnX+wHcV157/n3SfpIYmNxJNWQQg/4UABUrwF1guOFycR\nlowxlUJkN0sgwggLIiTFG2VTyRrqVeEUjmrtTW1spSogtJhf1l1j4mzW2kQujDCsq0hEeErEDwnL\nErIwT/wSP0QMQkhIZ/+Yubx5c6dnuqd7embunE/VrfduT09P356eOd2nzzlNzAxBEARB0KGv7AoI\ngiAI9UGEhiAIgqCNCA1BEARBGxEagiAIgjYiNARBEARtRGgIgiAI2jgRGkR0NxG9RkTPKo4TEf0l\nEe0joqeJ6OORYyuIaG/4WeGiPoIgCEIxuJpp3AvgspTjnwNwTvhZBeAOACCi0wB8GcAnAFwE4MtE\nNNNRnQRBEATHOBEazPwjAG+mZFkG4H4O2A5gBhGdDuCzAB5m5jeZ+S0ADyNd+AiCIAgl0u/pOmcA\neDHyfSxMU6V3QUSrEMxSMG3atEXnnXdeMTU1YMeO9OOLFvmpR1OQ9jYjrb2krdxTh/besWPH68w8\n26YMX0LDGmbeBGATAAwPD/Po6GjJNQKI0o9XoIo9hbS3PmvXpr/EpK3c0m4D116rPl6V9iaiF2zL\n8GU9dRDAmZHv88I0VbogCBbccUfZNWgWKzJMeNptP/XwgS+hsQXAdaEV1a8CeJuZXwbwEIBLiWhm\nuAB+aZgmCEKBLF1adg16ixMn0o/fdJOfevjAiXqKiL4NYDGAWUQ0hsAiahIAMPNGAFsBXA5gH4Aj\nAL4QHnuTiL4C4MmwqNuYOW1BXRAEBzzySNk1aBbvvlt2DdzhRGgw8zUZxxnA7yuO3Q3gbhf1EARB\nEIpFPMIFQRAEbURoFEgvLX7VAdHTC0LxiNAokJGRsmvQOyxcmJ1H9PSCUDwiNHKydm12nhc0LaKJ\nuj+9St7funt3sfVqGn2aT36r1Zz+OXXqxN84dWrZNaomIjRysnGjm3JUD2AvPphN+q1V5+TJ7Dyt\nljpfr92zqVOB996bmPbee733O10gQiMnzMVfQ2c2IwhFoSNYeoW4wIgia2UTEaFRYXrJq/eMxIhi\n4+isWQhCGcha2UREaJTIzAYFgX/ppfTjsmYhCPVAhEaJHD5cdg0EQRDMEKEhCD2G+AcJRSJCQxB6\njHXryq5BvbA1OGmakBahIQg9xhtv2JfRJIshW4OTpglpERqC0FDSRsg6FkNiEh7gQkjXCREagtBQ\nbEfIrhxc64ALFVSvCFkRGoLQUGxHyD4cXKvC9derjw0O6pVx551OqlI6IjQKZPr0smsgCIILPvhA\nfeyqq/TK6BUPexEaBdHf36zpuyA0la1by66BX0RoFECrBfze7wHLl5ddE0EQikY3mnWv4ERoENFl\nRLSHiPYR0c0Jx79ORDvDz0+I6HDk2InIsS0u6lM2J04A993XPPttoRpMmVJ2DYRexnqPcCJqAfgr\nAJ8BMAbgSSLawswfRhNi5v8Syf+fAVwYKeI9Zr7Ath5V48iRYBMmmW2I8PTN++/r5ZOw30IeXMw0\nLgKwj5n3M/MxAA8AWJaS/xoA33Zw3crzs5/Zl9ELZnqyg6FfdDdYapL1ky0iYMdxITTOAPBi5PtY\nmNYFEQ0BOAvADyPJA0Q0SkTbiehKB/WpDC52/tq0yb6MstHV+TbJC7lIesVKp0qIgB3HWj1lyNUA\nvsvMJyJpQ8x8kIg+CuCHRPQMMz8fP5GIVgFYBQAf+chH/NTWkiNH1Md0ZxAnTmTn6RVk3wJBqD4u\nZhoHAZwZ+T4vTEviasRUU8x8MPy7H8BjmLjeEc23iZmHmXl49uzZtnX+kCL3P2ZW6/N7YQZRRXRm\nK3XZ8zqpnjp7sEybZn/tyZPtyxDMSbrnVeufLoTGkwDOIaKziGgyAsHQZQVFROcBmAngHyNpM4lo\nSvj/LAAXA/C2HU/ePatNFnZVoRp0ZxBV6zBlYLKukzVbqcs+5ar6HD6cLThczE6PH7cvQzAjrQ9W\nqX9aCw1m/gDAFwE8BOA5AA8y8y4iuo2IrohkvRrAA8wTtIPnAxgloqcAPArgq1GrqyLJevGnHTeJ\n2SOhGuzxNSuri9FB1uZdR4/aX+O00+zLEHoT4hq+lYaHh3l0dNSqjOnTgXffVR+fNg14553kY6ZS\nP6mJTcqo4S2agO1vddHeQLBPeda2s1Vp66zfnFZPF31ryhTg2LH859cJ3fZS/VZXz7LNPdeFiHYw\n87BNGY31CE8TGDrHhfqRJTCaRpppro7AEJpJY4WGL3QjYAqCb8Q0V8iDCI2CmTPH7vyBATf1EOqD\nLw96sZBys46l60yZFt6lLutpgAiNwtltuazvwnxSqBc33ODnOi5UUHUPEeMiEvVNN+nl60/xitPZ\ncrYqgkWERsVp2laSgl7sqKq8rFevLrsGdrhYXL79dmDJkux8tuuktnuZu0KEhiDUENutWtMwEUgq\nC8Mm0W43K5qBCA1BqCFpM1BbRzBddYsQsHJl2TXwiwgNQegxJk3Sy6cSLmJubkbTzJNFaORg7lx/\n12q1/F1L6A10X2K94Jjnk6qsI5VNI4WG7c336STWpCi3KnzG3ZEXg6AiaR2pif2lkULjxhv18lXF\nxK3puBgR6z7cdbcGEoojaR3Jl3l0lWik0NAN6FYVE7e6Y+sVr+s8lYbu7oG9YA1kOzMz8Q1quoOg\n7ta6vUQjhYbgl6uusjvfRbgLF1vv1gXb2dKdd+oLnqYtAgsiNAQPbN1adg2aFer79tuBNWvsjCiq\ntH+DEFCVOHYiNITC0d0jvEhc7DFRF9rtQFCfPAkMDZmfv26dBDMsCp2dJVVURRXme4/wxmGrj3eh\nzy8TF9YlfX32L7Gm+B6028CqVeP706cJbNXahYSuKQ4bz/GqrLfV/JVUfWxfdpdc4qYeZeHCGqlp\no14bNcTIyLjASKOvL1i7EARTRGhUnB/9qN624C5GR01ycGy3gbfeyn++yczi8cfzX0cIaOLajwiN\ngrFdvDp+vNjgdHWgSQ6OtusJaerMqIru5MnApFx8kew4/XT7Mup2D5wIDSK6jIj2ENE+Iro54fj1\nRHSIiHaGnxsjx1YQ0d7ws8JFfaqEytw0bUOWOKJjbg6299pU4GzaZHe9Jo60o7iIDmHiD1YFAWMt\nNIioBeCvAHwOwAIA1xDRgoSs32HmC8LPXeG5pwH4MoBPALgIwJeJaKZtnaqEytz0U5/yW4860PQX\nUBnYzuLOP99NPQQ9bIW8C1zMNC4CsI+Z9zPzMQAPAFimee5nATzMzG8y81sAHgZwmYM6VQaVU5mJ\nFcX06W7qUnWI7NdvRPD4xXZnyrKp286YVVDVuhAaZwB4MfJ9LEyL8x+J6Gki+i4RnWl4LohoFRGN\nEtHooUOHHFTbDx/5SHea6RSzKdFIT56U9Rtd6vayqyrXXVd2DeqHr4Xw/wtgPjP/OwSziftMC2Dm\nTcw8zMzDs2fPdl5BE3SteaZOBdav7043jWmV5WMwc2Ywwo5/XNNqFX8dW52+rYCti6XW0aP1sKpb\nutRP3wTyXacK0QrqhguhcRDAmZHv88K0D2HmN5i54894F4BFuudWkbQp4tBQ0FmHhgL94/LlxdZl\n5kzg8OHkYy4fzlZLvcjaSyqhKkz/dThxws2sLOneuXIoXbpUrYZ13WdU5WVdp0kxyVzhons8CeAc\nIjqLiCYDuBrAlmgGIooapl0B4Lnw/4cAXEpEM8MF8EvDtEqjUg2UEfFTJTBck9cM1PTl0EsCqGhc\nWNUl7fLnypkya91u4UI315k6Nf14mjo4SX0spGMtNJj5AwBfRPCyfw7Ag8y8i4huI6Irwmx/QES7\niOgpAH8A4Prw3DcBfAWB4HkSwG1hWqV5773k9GPHAucq5uDvqlX1UCEUiam6KCm/71AqTbpnSVFq\nfQluV4voquexQ5o6+PLLZaBiCnENV1mHh4d5dHQ09/kmnSSpeUzOHxoCDhzIf35aPXTKcnV7s66z\nZAmwbVt3+vTpZnGfWi3ggw8mpvX3m6mN1qwJIr1GMWnzadPKi/Nj2jfi99dF3zr1VLPfn7dvpp1r\nQt7rtNvAypXdgrPVSu5vSf1i1izzGZ/tPbNpMyLawczD+UtooEe4i1GkyWJpkRFedSJmulAB6FxH\npYrIGgXGSXpYTdcZkmzZTVSHdQ5u6MI8u86/34R165JnWqr+lvRyt90rpo40TmiYBNBTCYfFi82u\nWZS6Q8fXw4UKwCYyp6l+PE8o7zhJD3189tKrHD9uX0ZT9PymM4Sk2deDD7qpS51onNAwmXafe25y\n+s6dZtdssu+B6dT77LMnfnclcJsSKdfFngvxeyCoaWKIn8YJDRN27+5+abXb5h2liR2rg6kT2mOP\nTfyuu7e34I5HHzXLX4V4SII/RGhk8PnPT/wuLzEzTPXjcdVSmh29SiCJt7Q+SVGYXQQ9tNmhzoQs\nc9uiqcoWrD4RoZFB3FKhCluX1glb/bjq/KEh9SK76eJ7k3GxkJu0hqS7DmarftS910WtK27Y0O3r\nkuT7ksbcue7q4wMRGg5RjTqaOBrpcPnlduevX5/8UK5frx4RN2X9wkW/Sgqj4dNJ9aab/FwnrjFw\nxfLlwD33TIwEcc89ZmW8+moxdSuKxgmNIh3FNmzoXvglCtKbiovYPvHZnqmdeq/q3F30q6SZs0+h\n4cu814U/iErtuXx54It18mTw1zR0UF1C13RonNAwHYWecop+3nvuSX7BmY48eglTdV5cqK9b120u\n+8EHZhZpVdiDoAhc9Kv4IKfdNndsbMpMWrX3+tq1gQMqUfDXdJDiO+KBLY3zCM8TCykqaPKGHIg2\nsyuPcN1ybG+xzXXSAh3qlJN2bSJ1u9jes7Iei7I9wqdMSXZ465Sd1C7TpwM//3n+eth5OOe/jmlb\nDQ4Cr78+MW3tWvOo1fF6mEZNEI/wipN0g5MocqOkBUn7IBpgswhou4BoKjBMRq2qh6eG4yAA1Yh5\npRIYgLpdywq5UgVMZ7FJDsN188AXoWGI6gEp8sH58Y+700xeMDfemJ1HhYkayEXIEhfOaXWlyU6g\nZbBkiVn+JH8r0/WIuq1fJCFCwxBVaJFWS72AaLuwmDRaN/EXOXo0/7VNHBOTQpaY6rubPGptshNo\nGWzb1m3uWrT5q4v1n7JnpCI0DFGNFE6cUMf9cREPKE5d/EVs/QDybq7TBAYG/F5PtWBbt4XcDmvX\nAi+9NDEt/t01LmbSZTsY1/R2l0faTEPlnVq212qZ2AZ0c7FuUeR6U5nYzCDzcN55ZulVZ+NG83Ns\nzbeTZtKmWwyXPWAUoWFI2kxDPJS7qYLKZePG7tFwX596tlLXkXPRaos9e8zSi8b29+YxmIgvfNvO\neNvt+s2aa/p4VJOmeyhXmfhortVSvzTqer+KVlukDZjKoAzDgfhvtdUiJPkhAYHpc1VpnNAo0hFJ\nV/+ep0OUvfhVZ0ZGuteVilhnKpu04I4qTFUjVaIKs1hTc9n4OpTqN1TZitCJ0CCiy4hoDxHtI6Kb\nE47/ERHtJqKniegRIhqKHDtBRDvDzxYX9UljzpziytbVv+eZFvuK0dOL5HmZ1pE8o94iZgmmA5y6\nhnnJU2/f61BFYO0RTkQtAD8B8BkAYwCeBHANM++O5LkEwBPMfISI1gBYzMy/Ex57h5mNlip9eoQD\n9t7cVSgj721euNBs9z/XHsou2srFPs4+qEJbuShj/nzzxdo87V2k93xfX7Kasq9vXNDmiXYQr4eL\n9jahKh7hFwHYx8z7mfkYgAcALItmYOZHmbkTuWU7gHkOrit4YN++/OfmUamZqEvWrNFLr/JUP0oe\nVZHPUbpuFOeyrXt0SVMn66xP1nXtyxYXQuMMAC9Gvo+FaSpuAPD9yPcBIholou1EdKXqJCJaFeYb\nPXTokF2NLXDhN1An34O0sBJZ5FGpxdUlqj3Dh4aAiy9Otoq6+OKJaXVxGMyjOs1jNppGWt/csCHZ\noKAuUZzjArZIE/m0jcDqvj7pdSGciK4FMAzgzyPJQ+F06XcBfIOIfinpXGbexMzDzDw8e/ZsD7VN\nxoXfQFP8OVzE1EnbT2NkpHu0d/KkGyuiMvTseRzLXKvRsvp3kpCuC/HAgqr+qdtv0yJA3Hmn+ryo\n1VedBpAdXNzygwDOjHyfF6ZNgIiWAhgBcAUzf6gwYOaD4d/9AB4DcKGDOlUa286ahzqPbpL2KAHU\nahAX6pFeDaeehO7WrCortLI9lMvi1FPV6Wl7akTX1+oYdNOF0HgSwDlEdBYRTQZwNYAJVlBEdCGA\nOxEIjNci6TOJaEr4/ywAFwMwWHY1w0VAPReUMbrI82BXQdCMjHSryI4dC9LTvPNt6YXAcrpEt2ZN\nGz0XKaTLwDZi9ZtvmqUnUcd97q2FBjN/AOCLAB4C8ByAB5l5FxHdRkRXhNn+HMB0AH8dM609H8Ao\nET0F4FEAX41aXekwc2bwsu18Zs5U5zWxAlLhIjR6GaOLPGanq1e7r0cHXcGZ9qIqy9ks2t86HxWt\n1sR8ZflF6Ponqdawjh3Tjz1VF5WV7XOo2r++k64jEFxrHUz6Zl76XRTCzFsBbI2l3Rr5P3ECzMz/\nAOBjea87dWp3iI7Dh9WbxbigDNWSC047zfycIheQdR/YNNPHmTOTTWnLcuDUMek8eTIQHL5nMhs2\nANdea1eGbsSDulgV2T7LZ5+dPKg5++zgr2+NgknftKEmY4Ju2u30mE5F3RgXi9hlTEmrZnaaZhUV\nJe1FpXKUiqfrXiuLrFlCdPE8rf+V8VI13bdayOaHP0xPL2PvHRUu34e1FRq2o6Y4qjj68XTVPsGq\n9CRUN7DIUNdVMztdv75b0BIBl1+uX4buSFFVpsm1gOyXvcm2n7qLzy4pcg2oiRStZu5X6IGS0n3e\nw9oKDdeoRuLx9LSOojODaLfVL3CTBbSqEl08T9OBL18OrFgxMZ0ZuOuuiWW4mOKrwrPbhm1XoTPr\njC4++8J2DUgVM63KwfXSKFp9ZFt+UiBDVbrO7NWVYYsIjRBVmAmT8BN33pm8KBi12U6zYlItrMWp\nglWTihtuGP8/Swee9NI+fnyiHbuL0ZyLe2tCWaHws0amti993YGVD1zM1D79abP0OFlGMVUzp/38\n592U09NCw7eJ7fLlwP33B7pyouDv/fdP1CenWTGtX693nSrvJR19gWSFnfD9MrdB9yVl4xRou9aV\nNZOo0kvfFhcztZ07k9N1Q+d84hPp6VVTB7oSVtYBC8ugr2+YmfUCFvoM6KbTlKrgedOmBWornfJ9\nBTmzvY7qtw4OAq+/7u+3llmGbvk21+iUowoUODQEHDhQ7fb23TfbbfW6aJa1UedYf3+yoG61AhWS\nz2dZv5xqBCz0ThFyLs22PKoOyho9t9vBw9vXF/zVVSX53u/ZBy6cn1z4xaShG4SvaFyELUkyLpg6\nVX8GC7hp7yqHwOiQNlvXVRNnzex89S3v6mpmrt0HWMSB6Mj+REnLt2aN+tjg4HgZqnxr1jBv3sw8\nderE9KlTg/QORMnnE2XXUed36LaFDrbXGRpKPj40pP9bp01LPq5Kj5+/eXN6vs2bmSdPnpg2efLE\ne2bTFi76pkk5a9Ywt1pBeqsVfNe5hqt7zjx+fZPPkiU6PdJdPbP6hG0ZzMF7I+lY9H3ior1V10n+\nYJTZ8v1rW0AZnyKEhs7xrI6Q9ZJkZp4+PTnP9On6dXDR0XRIE3A610kTsC5+65Qp6vSs+xW9TtqL\n1rbN0z6TJumVP3169mCDOXvQ4qtv+eifttfIyuOiDJ175r+9LzjOLELDSeO66Ci+OuvAQPJxVXpS\nW+hg+1tdzDSKbG8ivdmhTT1c1FN35Ftme+vOaFz1T9trpM1gXbQVs95Mw3ZgZt4Wi5jZ7v1byzWN\norDVQerG5rFF1xM6jm/dp8pSzCQOVt57orNGsHp1YAIdd8w8cqRakVt1vbmLDiiY5kGfFgq8qeg4\nnzIn51GlV4GeFxom9twbNiT7WehuMqMbm6csVq7Uz+tCwGQFdEuLqNrhqquS86jSO3RCm6ctyt5+\nuxvB5gMd4ZnlTKZTRtrAJ21BvSp9XBcfMeTyDu50KHNf9Z4XGlF7bh276biEr6LEz+tparILnwtf\nkKzwHWkRVTts3ZqcZ+tWtdABxi1Ysu6fKpBjNL0KIfV1hKeLUWvawEdnxlNGeJQmYhKyxjm2+q0y\nPiZrGiZ6zKzjWbplnTpk6Tltdal9fXplZJH3d0avUfSif9r9aLX02rtICxeTtsrKY1tPZr2FWdt1\nERdtUWT/1G0rF2XYLoQvWWJfj+6PrGkYkTUlzTqepufWXffIGjHa2snn2ZfbFF2P1qwonzo+LyqI\ngpHvkiXJx1et0qujC18SH7jwns9SFwLugjsK6v1odPep2bbNXV2cYit1yvjknWnYji7Sjm/enO47\n0LHGyRrJ2Y5OdEdJWWT9Vhf1zDLJ1fXFsPFNyJoNZZVh+3F5T7Py6FiKFTnT0B0565C3vXXNj120\nN3P3b477oxRdj+6P/UzD6uSyPmUJDZXTUudFmaYu6byEsl62LtQQLh5MHw+VjfpK97dknV+kLb3L\nvqlTT1X/7KjqmLN9UlR10HU+9dE3be6JC+Gne890hHTR9ej+iHrKK6qwAczB37SFwo5KRmfhtSnY\nbFITVW3lDd0CjN873fSy0KlnVliLdhv45jfHv584EXzvtFe7rTam0A2t4QMbyyFdqzgX4VR8mHOX\nEvHaVupw0GsvA7AHwD4ANyccnwLgO+HxJwDMjxy7JUzfA+CzetcrZ6ah4/GdVUbRi8O2ZfgaAdke\n74zWssKAFP07bD8u29t2Fqvq3x0nSF/3dO5cu/uRFgVAd6aRpTrVKcOHqjnLobf7UwH1FIAWgOcB\nfBTAZABPAVgQy7MWwMbw/6sBfCf8f0GYfwqAs8JyWtnXLEdo+IgtpbJ+6utz9zt02sv2eNH17GBr\njWb7O2w/nZdQ1n33obZM80L2cU8HBtQCQ7eMjoBLas++Pn3hl2VJqVOGi0GmzfHkTzXUUxcB2MfM\n+5n5GIAHACyL5VkG4L7w/+8CWEJEFKY/wMzvM/NPwxnHRQ7qVAid3eY61kOtVvA9qpY6//zkc1Xp\ncaruIOgTHQ/7Ivfk8OFz0LG3V1m9ddLzOjmaoFKR+or4e/Qo8NJL6XnSfHOAwDJp+XLgkku6j508\nCTz+uF5ddJz/svaeX7++u76TJ5tFHVZFvy4zKrYLoXEGgBcj38fCtMQ8zPwBgLcBDGqeCwAgolVE\nNEpEehtpxHCh+2u3gfvum6gTvu++iWXv2ZN8rirdNzqOajrbleqQtalQlpNi2QLU1ZasOqHCb78d\nWLNm4oBkzZogHUh3cuxgGwanSA9mVxw/nn68016PPpp83GW4Ex2hEN+aNfpdZ23GZuOsNWuy8+Sh\nNgvhzLyJmYc55wYiLjycdRa2bPdhLnovgt27s/O42q40a4/jrJmEj/0IbEdsp5ySnedb39Ir6+KL\ngXnzgj4wb17wvYNOXCnb2YiL0XXWQEHlV+MaXwMOZvX3deu6r3fy5Pi7KE2AddorXr7qukl0BKhz\nbPVbAD4J4KHI91sA3BLL8xCAT4b/9wN4HQDF80bzpV9z4ppGlm4vyz68Y5Joq1/UyWOz5uFiMdLF\nx1VbZB13oVfOOq4TQda2vW3q0bnnOmtdRfpYdEhaL4iuFdTFhNnmuK7PlYtrZJlRm1+jGgvh/QD2\nI1jI7iyEL4zl+X1MXAh/MPx/ISYuhO+H4UK4i46ou7+Di86aZT2l6oiAm8VdFx9XbVGFa2Tlsd2Q\nR7ee/f3Jx/r79X+HrfWUzjWK3iPF9tPBNvS56jkF9B1xXfRN1YC34yRo3t4VEBrMDACXA/gJAuun\nkTDtNgBXhP8PAPhrBAvd/wTgo5FzR8Lz9gD4nM71Fi1axHFcdDQXNzkrT1ZH8zHytf1kXSNrRuTy\nocraiMn2nqW9PKJlZFHkPe28sLMGJFmzGZ3faTvyLbp/dsiaEWWVkfYcdvpv1kwja3ao8zvi5uSd\nz+TJ+mVM7IcN3bkvSWhkqaBsOzOznsdtVhm2Zni2QsXVg5kWGHFoKH37XN1RqY6ZadEBINM+0R0C\ns7C5Z1nHdV9CRc8Sim5v3b7ZIS2Eh04Zqr7VeVZt29NXe0/shyI0Yg1i19HSdsRjzp4q6tzEzZuD\nbT6j6ZMm6YcW0Nm+dMGC/G2R9elM79OEApAdcoU5W4C6aG/bBzPtE9/dLw3bembVJet+MBe/P33R\n7a3z6eBCQGb5ZflYQ3JRxsR+KEIj1iDqT5bOWOcGuHCw2ry5uy79/fpCQ/ehKeqhdFHPDlkPts7i\nb9aL0HZ2aPpQqsgqJ+t41kBAZ3vQrOO+4p4V1Td1r6Fbz04fVcXq8rGm4ep3jJcnQiPWIHYdrWh9\nLXOx+zf4iMyq294+9m7QyWNbhulDqaLMeupew0XojCKFtMk9cdHeWTONLPWVizUNF79jYj+0Fxr9\n9ka7vYOtj4UORXowb9xoX4ZP6rLVat3R9WvRcSDMYvHiZKfIxYv1y6gKWX5Zqme2s/fIKack+77o\n+PZUmdo49wnZ6GzH6Qvm7HSdTYGaQNGRSnX3uNcR4llbJj/xRPJxVbpLVI6FeUlrj5Ur1ed1hGxc\n4HRQpZtS1j7hIjSE0pBd4gJWrCi2fN3BhI4Qz5qN24S7t8VliBAgfRsD1f72wLiwydoGwTbiwaZN\nevlcI0LDgH6FMk+VLqTz4IPp6VmjWh2ywlr4QhUyBUhXf5r8Vlt0hLgqYGBWIMEoCxbo5zWhKjPt\nrJlyJ5bXBRckH1elx0nrN0WGaxGhYUBWLCXBjKz1nXPPTT6uSk/iuuvM0osi797t0b3O02J1uXiZ\nZwlxQD3CTht5x9m1Sz9vmeTdP74TsFCV7913A5XkY48lH1elm1Dk/uLEKuVzhRkeHubR0e5gt3mD\n/XWaIO185uzjPspII3oriwp86OIaum3VaiUHmOvrGx9l9fcnj7harUCYz5qVLJwGB4HXX8+uRxqm\nj06e6+hNcL0xAAAc2ElEQVS29+Bg9u/Magtf/TurnLzolq9bz7T2SjNc6Zw/f7460OTQkPpYtIw8\n7TRlijoyMRHt4JxBXzvITMMxWZFbXWwjqYPr8kzR0de6CI2epWMv0lrNN2l9S+d3+tiToyqk9S1f\nW6Sm7ZuRJjCi5InorBM23QYRGgbovPCzXnQupvc6FGF+a6In/fnPs9N1LKyEcdL6ls76T5ZJrc6m\nV2kUYc2Tty+k9a20bRKie1DYDjiWL1e3ne5ala7lm09EPQW9qeDmzcHf66+fuIbR3w/ce+/4Ipxq\nSjo0BBw44E89ZVNO0eX3ojpQhyLVUzpl9PUl15koEDxFtlVUTWZSTtY9jOc1LT+tjLT2Srv3uvVQ\nqag67wqdMnTqEEXUUx4ZGQkEw733BjeVKPgbFRhAMCWNW1P195tt8eiTGTOKs2bJIm3q3W4Hutkk\nVOlNRkcdWKZfTNEjZt3ZkAlpsxUXfXP9+u4ZR6tV3XdFh54SGkWaUXZsrx9/HBgbCzrO2Fj3nsOP\nP568xaPu3sS+eeut/NYstuszaS+SkRH11p7RdF9rRFUgTX2ks1Xr+vXdW/kS+fGLiZvDuvaKdhm1\nQQebbVg7PP54d71PnKjuu+JDbOOQlPFRxZ7KChueFaMlawMk29g8thv66P4Ok3Ly5O2QFoVWtxxV\nHp0AfMzlhkY3xfYaLuq5Zk1323biKfluq6xzdCLSqsp3Uc+02FEu7plOnC4X/WZiWRKwMKFR8jdw\n2oMzfbpe1NW066QJpSIezLlz9c/Jyjd3bnf5aZ1et55pmyjZtnfacdvtR6MDBV1s76mL9k4LEumz\nb+qUlTevq3rWuQwVLoRGT6mnbEnzKH3nHfvN6tMC8Q0N6ZVh4pV+8GB6WczJ/yeRVFaauavK0iqe\nnjbNt/XAX7pUfWz1ar0yVNx+u935eXARUFNl6qlrApoHEwfDPMyY0Z3mwiPahcNkLyJCwyOqWDSA\n/uKX6YtDJQyS0k3yZrFtW/eDu2SJmaeqrXlyUrTVDmW89JuKam0qrV/Fj6nyzpgRrMvFceER7cs8\nvm5YCQ0iOo2IHiaiveHfmQl5LiCifySiXUT0NBH9TuTYvUT0UyLaGX40o67UE9WoemBAP25Onhd7\n0gTWRd4stm2bWE6RoQ1sKMt6zCUu4nTpEPVj0MW0v6X18fgnSWD0GkVFd8iL7UzjZgCPMPM5AB4J\nv8c5AuA6Zl4I4DIA3yCi6ITyT5j5gvCz07I+xuTxuMyLKtKnyvKl6thG6czC1tlMF1+xkIoMPuhy\nlpiGzND84/oe2mL7+C0DcF/4/30AroxnYOafMPPe8P+XALwGYLbldZ3h2n686BdpVuiNKrFwYVCv\nzmfhQrPzbdeQqkaRZqG91lZCfoqeOdsKjTnM/HL4/ysA5qRlJqKLAEwG8HwkeX2otvo6ESldY4ho\nFRGNEtHooUOHLKsdMDhoFk7ZdmHWhUDxNaLUIS0K6MKFwO7dE9N37zYTHCrjAF2jAV8qG6E3cbEQ\nXkZo/qJnzplCg4i2EdGzCZ9l0XyhOZfy1UVEpwP4FoAvMHNn/HMLgPMA/AqA0wB8SXU+M29i5mFm\nHp49281ExTRonU5o9LQX6YYN3aqVvr5qxpfRIW2TmbjA6KBKT0LngUt7+Hxs32tCEV7LgjvifcnF\nrH5gwCy9DmR2Y2Zeysy/nPD5HoBXQ2HQEQqvJZVBRP8GwN8DGGHm7ZGyXw7Nh98HcA+Ai1z8qDLJ\nCtWQFGKk1zh82E05OoInz25tPtexouTdU0PwQ3wbVhde370UZbmD7dhnC4AV4f8rAHwvnoGIJgP4\nWwD3M/N3Y8c6AocQrIc8a1mf0lm/vnv6OnlykD4y0m2ud+zY+Eb1HdJ8HFSjnDJULqpZlc+RfFV2\na9NBFpGrTTzEigvqtAapi63Q+CqAzxDRXgBLw+8gomEiuivMcxWAXwdwfYJpbZuIngHwDIBZAP7M\nsj6lEI9zpLIxT9uoPorKx+ELX1ALh+gOb77wEeiuCOo8yhOKIz7TSEN3va1Ka5DOsHUpL+OTFkZE\nFR+qyPADmzePn68KxzBtWnacpKTf0gkR0WoFZSSdP326sjkKJU+sr/hvTcu7YIE6XbeMou57Xkyu\nMTAw8dy0MCKqvjFtmn1bxX+vi/b2QZG/UycOXd46xJ9nl20NCSPSjW8VwIwZE1UkqtnEu++qNyZK\nYu1a4I47xlU9J04EZSSh8v8oGlPV0KRJZov+qtAWqnaoAyZqibvumvg9bWG/Knuh9xJp1lN33518\nTJVuQrx/F2lplYeeExq+iS/6pqlsVOEHktQlmzblr1NVufHGbkGjsimfMUMtHNJieFUdZr18c+ea\nCeWsXfkEc9JC87tYJFcRf4fkMfYoEhEajsmzgUqSKWZZZqFF8uCD3WmvvpqcN80Cq+y1lDyhNEx5\n5RWz/LqBCH152fcCKgGvK/jzEn+HVM3Yo6e2e+1gogKI/3wXWyuWUUZZt9G2nnnaavPmiQ+S7/a2\naWvffTNejosyTj3VXCVaRv8se3tdF3XIU05aW8t2r0IjsR156XqU9yKq325isi3b7TY7bLoIjQJw\n8VIqywGtCfjY3rSqJG35OnVqujo0bv7dFJPlNB+LX/u15GOqdF3qoCasQRXrR5NfSnWgrovDeQYS\n8VnB8uXAihXjM4tWK/iuGuhMnlzdkPZFkzabUO3VkraHiw51CDApQiNG3FEvi6QH2cVLyWQ0V2fv\n0jIocpe6LObOzX9unhhl8TA17XZgjRM15b7zTuDss5PPv+EG82tWBdtRe5EWUipsNQybN7upRxqN\nFhpJL9uNG5ODCqpCe1x1VXeab5PQGtoyVA6bl7kJWVvwppFnLSdutnzTTd2j2ZMn1SNkFwMgF1uv\n5qEOqp44Jr5cSfiwtKphs7pDtU90fFGw1QK2b0/Om2RGmratq2BHUTG2bF7mdcLUMdLFAKgs9ZYq\nKnWVqcNWso0WGkne4yMj3U49x4+rH7amLApWhV70XykSW3VH2T4xZSLGKMk0Wmgk4ULfbSpIZFMg\nfZJUirKmo8ZkHSTejkT5nFWrgm2/cLGG1IuI0LDEhd5URs/6JK3fyJqOGhMdd7wdmYF77nFbH5+o\n1M8q4s9ynvWBJgwAe1Jo+Ajz0KEKJnKmFl9Nx0bQ++pbLhbmk15gpsHvbE1Iy8Q0eKmLZ7lIy6qq\n0JNCw2ek2yroPcuKcltXbF4OvvqWi4X5OXPsy2gSVY4UUCUVbE8KDZ8cPdqdVqUbLHTTBBUCALz0\nUndancPKF02V129MVW1FIkLDkqSHcNIk//UQ9JE1JCEJFz4ORamKdWa4qm0GXNNYoaFSK7m46aa2\n1lWeFjcJX5YvPtfciqAsZ706sHHjxO8+1de7dvm5jpXQIKLTiOhhItob/p2pyHcisj/4lkj6WUT0\nBBHtI6LvEJG3GJEqc7qNG5NfHiqVk6mQSQoWV+VpcZO4914/1/G9u6QNSf2+qbGodIjPVkzNduug\n2radadwM4BFmPgfAI+H3JN5j5gvCzxWR9K8B+Doznw3gLQDOIt1kjeZUU9Hly4Hf+I3udJVZ53vv\ndaepRheDg8nB4qq2yYoJvkfNRT5UWffBl9rRlZrBxQxWzJntMH2209r7lFPs6uIMmw3GAewBcHr4\n/+kA9ijyvZOQRgBeB9Affv8kgId0rrto0aL03dNDVJu/Z9Fq2W3krrrukiXMRBPTiJg3b+4uw+Vm\n8kVjU8+hIfvfanp+Vnsl5Z80yUlTZV5nwQLzc5I+U6e66VeqtmpC3zQ9v8gyOpxyil0bAxhlzv/O\nZ2brmcYcZn45/P8VACojvwEiGiWi7UR0ZZg2COAwM3cixIwBOEN1ISJaFZYxeujQIa3K3X578m3J\nwnahNCkeFRDYvMevzwysXGl3vTqTtL+D6WzCVMeeNTtK6jNFxARKuo6NXrqIGaypX4dQLEeO5Hun\nuSRTaBDRNiJ6NuGzLJovlGKq6g9xsMXg7wL4BhH9kmlFmXkTMw8z8/Ds2bNNTzfCVgViGkbE9oVU\nBV+RvHT2d4i2uelDsG2bmTNcndYUTIiGO7/rriAMui0DA/ZlCL1Fpr0IMy9VHSOiV4nodGZ+mYhO\nB/CaooyD4d/9RPQYgAsB/A2AGUTUH8425gGoRKxR35LbljwxcqrE1q12bb52bbJPQpM5fhxYt657\ntkFk1tZvvum2XkL9sVVPbQGwIvx/BYDvxTMQ0UwimhL+PwvAxQB2hzOTRwH8dtr5QjZ1XkgHzMJv\nz5jRnXbHHe7q0kskzXhNncREPSXEsRUaXwXwGSLaC2Bp+B1ENExEd4V5zgcwSkRPIRASX2Xm3eGx\nLwH4IyLah2CN45uW9aklTbd7Nwm/ffhwcfVoAqaqOQlRI8QhrpsuBsDw8DCPjo4WVr7pmka8CW3P\nBwL/D52QD3195Xs4m/zepN/abgOrVgWLfHnKcNHedcHFb/VdRpntbVtPk/MXLEg2ZDApY2Ag2Yzf\nFUS0I1xfzk1jPcJdkbT5vIsp/Z136uWrQpRdXVQxn5YvBzZtCvwKiMRDvmjq4EBWR159NTndpL2T\nYtlVDREalpx6aneai20m675OkcR996mPLV8OHDgQCMEDB3zVqJnUeaZVZVRWk73W3iI0LEmyLmlC\nTP08pAnCdhuYPz9Qt82frzYjTpqFyGKtIPhDhIYlTd5D2RXtNnDddcFWu8zBX9Wo7fLLu9N0VXmC\nf3xFXhX8IULDEttggy62i607N92kvzaT5G3fi6q8XsFX5FUVSWuOVaYO74MaVLG6ENm/sC65xE1d\n6ozJxkCqGYgsngtJ3H233fm+X+I33eT3enkQoWGBi6inO3falyEkx7ASBNtBnQvrRBPrqTqEuBGh\nYYGLIHamcaqEZOJmu4LgAhdx3cR6qgFIkDZBaBZNj8pgggiNBFROaHGK3DJWMKPdBq6/ftwCq1dx\n8XKTmVg3qt0IRRPQjQiNBHQXZi+4IDk9vk9wkdTNOqQoVq9241RZdVxstepCqNbBykcoBrn1Fjz6\naHK6TxNQW+sQF/ic2qtmgU0KrOfTmVE1m66DlY9vmjKDE6GRgO7iVxXiPlXBR8HF6FeXVavszu+F\nEbKJiXISuupXQL1XSx2sfHzTy2rRKD3wCLlHpXYSysf2ZdWfue1Y77N4sV6+VqsagxKhWojQSECl\ndorTlOloHdC9F0Xs9V1VVDPmffv0zi875L5QTURoJKCrdkqbjrrQO/eSGWDRv6UpqgETVKqlF17w\nc/06713fQczvuxGhYUHaQ3H8uH35PtcKisbFbzHRxfcyuusyKtWSr3as+971AHDXXdl5sugF4RlF\nhIYFb7+tPtYkNYgvzj3XvoxeeIBtLZd8qZ2qsh5iE2nXxW/oBeEZxUpoENFpRPQwEe0N/85MyHMJ\nEe2MfI4S0ZXhsXuJ6KeRY5VYgtZ9sbjwC5C9IPR57jn7MnrtARayyYq0W3T49qoIT1fYzjRuBvAI\nM58D4JHw+wSY+VFmvoCZLwDwaQBHAPwgkuVPOseZuRLh+3y+WK67Lv+5a9a4q4ctLoI3ZuFi3aIX\nHuA77ii7BgG9sldG2eHb64at0FgGoLOJ530ArszI/9sAvs/MRyyvWyg+Xyzf+lb6cdWLcs2aatnK\nHzumFhyySN2b7NqlFhxVu+eq+lStnnXA1mp9DjO/HP7/CoA5GfmvBvAXsbT1RHQrwpkKMzdqs1Qd\nT+a6dOyqr+P0wnqGT3RC1NRplF70c9SU/pUpNIhoG4BfTDg0Ev3CzExEyttCRKcD+BiAhyLJtyAQ\nNpMBbALwJQC3Kc5fBWAVAHxE9lhtJLZxtuZkDWmECTQhlpdLmrJeRmwhfoloD4DFzPxyKBQeY+ZE\nGxciWgdgITMnBoIgosUA/piZfzPrusPDwzw6Opq73jroOoupms/E8a8uM4micNFW8+fr+R/0QltL\n3/SLbXu7KsMFRLSDmYdtyrBd09gCYEX4/woA30vJew2Ab0cTQkEDIiIE6yHPWtbHK+IRXh3Wrxc/\nDl0klIpgg63Q+CqAzxDRXgBLw+8gomEi+tAthojmAzgTwP+Lnd8momcAPANgFoA/s6yPV2QUVh2W\nL5ewF7pUIdCmUF+sxhzM/AaArgARzDwK4MbI9wMAzkjI92mb6wu9weBgOZvdHD9+HGNjYzh69Kj/\ni2syMDCAefPmYZJDm2YRGoINMlG1wIV6qikWF2ls2ABce63/646NjeHUU0/F/PnzQRXUNTIz3njj\nDYyNjeGss85yVm6rJbOyKlIlv6s0JIyIBatX25fRFIuLNMpyuDt69CgGBwcrKTAAgIgwODjofCZk\nuyeJUAxV8rtKQ4SGBS5uci94KNeZqgqMDkn1s61yXV5OdaJXvON1EKEhCDXDxQxXcMvzz5ddA3+I\n0BAETdrtwB+kry/4226XUw9fM4UpU/xcpxd4v0FxLGQhXBA0aLeDtYAjYdS0F14YXxvoVRWj+HMI\nSchMQ0HFVd2CZ0ZGxgVGhyNHgnQbbr31VnzjG9+IXGcEGxxYR7jYce7dd+3LEHoPERoKRG8sRPnZ\nz8zSdVm5ciXuv/9+AMDJkyfxwAMP4FoH9scudpwThCREaCgQC5Pew2b2qIqRaRs7c/78+RgcHMS/\n/Mu/4Ac/+AEuvPBCDDpw3nGhMhMfInfobtFbB3rop1SLJV1+8oIttiqXrL1L0li/Hpg6dWLa1KlB\nui033ngj7r33Xtxzzz1YuXKlfYGOEB8id9hu0VslrKLcloWPKLdA9sg0q+l0RrY1bP5C0GmrzZvT\nR9Cm9+u5557D+eefn33hkHY7WMP42c+CGcb69W5G9MeOHcPHPvYxHD9+HHv37kUrFnkxqZ7SN/3h\nKkKt7T1zgYsot2IfIdSGrBf0kiXAI48Ue/0iLKUmT56MSy65BDNmzOgSGEIzmDu37BroI+qpFNL0\nkHWJE9Mktm0ruwb5OHnyJLZv344bbrhB+5wmeSCXjQ9V88GDxV/DFSI0UjhxIllwVG1/bmGcuu0F\nvXv3bpx99tlYsmQJzjnnHO3z6rQ/d91xNRipW99UIeqpDCQaaP2o00O4YMEC7N+/P9e5ddqfWwio\nU99UITMNodFU3RCk6vUTmocIDaGxDAwM4I033qjsi7mzn8aAC/duoVAc7pFVeUQ9JTSWefPmYWxs\nDIcOHSq7Kko6O/cJ1ebYsbJr4A8RGiUiDoDjLFgA7N7t95qTJk1yuiNenVizBrjjjrJrIdQRK/UU\nEf0nItpFRCeJSOkwQkSXEdEeItpHRDdH0s8ioifC9O8Q0WSb+tSNupqIFoEs6vpFrP+EvNiuaTwL\n4D8A+JEqAxG1APwVgM8BWADgGiLqGAt+DcDXmflsAG8B0DdUFwRBELxjJTSY+Tlm3pOR7SIA+5h5\nPzMfA/AAgGUU7GP5aQDfDfPdB+BKm/pUjSYtjgmC0Ax8rGmcAeDFyPcxAJ8AMAjgMDN/EEk/Q1UI\nEa0CEG57g/eJ6NkC6uqaWcCiIdVBoh07fFYmhVkAXi+7EsCiRepjB14neuMFf3XJTUXaMpPUvgkc\nfY9ol+dVpkQq0p4XXpgWI4JoxwuoRD0zOde2gEyhQUTbAPxiwqERZv6ebQV0YeZNADaFdRq1Dbrl\ng6Ceo/PLrkcWdWjPOtQRqFs9pW+6ok71tC0jU2gw81LLaxwEcGbk+7ww7Q0AM4ioP5xtdNIFQRCE\niuLDue9JAOeEllKTAVwNYAsHHlWPAvjtMN8KAN5mLoIgCII5tia3v0VEYwA+CeDvieihMH0uEW0F\ngHAW8UUADwF4DsCDzNwxsPwSgD8ion0I1ji+qXnpTTb19ojU0x11qCMg9XSN1NMt1vWs5SZMgiAI\nQjlI7ClBEARBGxEagiAIgjaVFRppIUqI6JYw9MgeIvqs4nzvIUrC6+wMPweIaKci3wEieibMV/xm\n593X/1MiOhip6+WKfInhXzzV8c+J6MdE9DQR/S0RzVDkK6Uts9qGiKaE/WFf2A/n+6pbpA5nEtGj\nRLQ7fJbWJeRZTERvR/rCrb7rGdYj9T5SwF+G7fk0EX28hDqeG2mnnUT0r0T0h7E8pbQnEd1NRK9F\n/deI6DQiepiI9oZ/ZyrOXRHm2UtEKzIvxsyV/AA4H4EjymMAhiPpCwA8BWAKgLMAPA+glXD+gwCu\nDv/fCGCN5/r/DwC3Ko4dADCrxLb9UwB/nJGnFbbtRwFMDtt8gcc6XgqgP/z/awC+VpW21GkbAGsB\nbAz/vxrAd0q4z6cD+Hj4/6kAfpJQz8UA/s533UzvI4DLAXwfAAH4VQBPlFzfFoBXAAxVoT0B/DqA\njwN4NpL23wHcHP5/c9IzBOA0APvDvzPD/2emXauyMw1WhyhZBuABZn6fmX8KYB+CUCUfUnaIkvD6\nVwH4tq9rFkBi+BdfF2fmH/B4tIDtCPx4qoJO2yxD0O+AoB8uCfuFN5j5ZWb+5/D/nyOwXlRGXag4\nywDczwHbEfh4nV5ifZYAeJ6ZKxGlgJl/BODNWHK0D6regZ8F8DAzv8nMbwF4GMBladeqrNBIISks\nSfxBMApRUgC/BuBVZt6rOM4AfkBEO8LwKGXwxXCaf7di2qrTzr5YiWCUmUQZbanTNh/mCfvh2wj6\nZSmE6rELATyRcPiTRPQUEX2fiBZ6rdg4WfexSv0RCGaPqkFhFdoTAOYw88vh/68AmJOQx7hdS91P\ngyoSosQEzTpfg/RZxqeY+SAR/VsADxPRj8ORgpd6ArgDwFcQPKhfQaBKW+ny+jrotCURjQD4AEBb\nUUzhbVl3iGg6gL8B8IfM/K+xw/+MQMXyTri29X8AnOO7jqjRfQzXR68AcEvC4aq05wSYmYnIiX9F\nqUKD84UoUYUliVJYiJKsOhNRP4Jw8crge8x8MPz7GhH9LQJ1h9MHRLdtieh/Avi7hEM67WyFRlte\nD+A3ASzhUAGbUEbhbZmATtt08oyFfeIXEPRLrxDRJAQCo83M/zt+PCpEmHkrEd1ORLOY2WvwPY37\nWHh/NOBzAP6ZmV+NH6hKe4a8SkSnM/PLoSrvtYQ8BxGsw3SYh2AdWUkd1VNbAFwdWqechUCK/1M0\nQ/iCKStEyVIAP2bmsaSDRDSNiE7t/I9gwddrxN6YLvi3FNdPDP/io35AYJ0E4L8CuIKZjyjylNWW\nOm2zBUG/A4J++EOV4CuKcA3lmwCeY+a/UOT5xc5aCxFdhOCd4FW4ad7HLQCuC62ofhXA2xHVi2+U\nmoQqtGeEaB9UvQMfAnApEc0M1dSXhmlqfK/yG1gD/BYC/dr7AF4F8FDk2AgC65U9AD4XSd8KYG74\n/0cRCJN9AP4awBRP9b4XwOpY2lwAWyP1eir87EKgivHdtt8C8AyAp8OOdXq8nuH3yxFY3Dzvu57h\nfXsRwM7wszFexzLbMqltANyGQMgBwEDY7/aF/fCjJdznTyFQQT4dacfLAazu9FEEIX52hW24HcC/\nL6GeifcxVk9CsJnb82HfHfZdz7Ae0xAIgV+IpJXengiE2MsAjofvzRsQrKE9AmAvgG0ATgvzDgO4\nK3LuyrCf7gPwhaxrSRgRQRAEQZs6qqcEQRCEkhChIQiCIGgjQkMQBEHQRoSGIAiCoI0IDUEQBEEb\nERqCIAiCNiI0BEEQBG1EaAiCA4joV8IAkAOhh/MuIvrlsuslCK4R5z5BcAQR/RkCT/BTAIwx838r\nuUqC4BwRGoLgiDAO1ZMAjiIIH3Gi5CoJgnNEPSUI7hgEMB3BLnkDJddFEApBZhqC4Agi2oJgF7+z\nEASB/GLJVRIE55S6n4Yg9ApEdB2A48z8v4ioBeAfiOjTzPzDsusmCC6RmYYgCIKgjaxpCIIgCNqI\n0BAEQRC0EaEhCIIgaCNCQxAEQdBGhIYgCIKgjQgNQRAEQRsRGoIgCII2/x/lyBTNHkLAjQAAAABJ\nRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11be62cd0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x_train = np.random.uniform(-10., 10, size=10000)\n",
"y_train = np.sin(2 * np.pi * x_train / 10) * np.sin(10 * 2 * np.pi * x_train / 10)\n",
"x_valid = np.random.uniform(-10., 10, size=10000)\n",
"y_valid = np.sin(2 * np.pi * x_valid / 10) * np.sin(10 * 2 * np.pi * x_valid / 10)\n",
"X = pd.DataFrame({'x': x_train, 'y': y_train})\n",
"X.plot(x='x', y='y', style='bo', xlim=(-10,10), ylim=(-1,1))"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import tensorflow as tf\n",
"import random as rn\n",
"import os\n",
"os.environ['PYTHONSEED'] = '0'\n",
"np.random.seed(1)\n",
"rn.seed(2)\n",
"tf.set_random_seed(3)\n",
"from keras import backend as K\n",
"sess = tf.Session(graph=tf.get_default_graph())#, config=session_conf)\n",
"K.set_session(sess)"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/1\n",
"10000/10000 [==============================] - 15s 2ms/step - loss: 0.3147\n",
"10000/10000 [==============================] - 2s 248us/step\n",
"(0.2840616655052882, [-4.23125331242386, 999.0501101709033])\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 13s 1ms/step - loss: 80.7413\n",
"10000/10000 [==============================] - 2s 248us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 14s 1ms/step - loss: 68.5605\n",
"10000/10000 [==============================] - 3s 259us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 14s 1ms/step - loss: 97.6177\n",
"10000/10000 [==============================] - 3s 342us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 15s 2ms/step - loss: 80.9933\n",
"10000/10000 [==============================] - 3s 259us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 14s 1ms/step - loss: 83.6495\n",
"10000/10000 [==============================] - 3s 260us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 14s 1ms/step - loss: 104.2136\n",
"10000/10000 [==============================] - 3s 266us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 16s 2ms/step - loss: 98.3267\n",
"10000/10000 [==============================] - 3s 257us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 14s 1ms/step - loss: 74.8317\n",
"10000/10000 [==============================] - 3s 272us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 15s 1ms/step - loss: 98.4839\n",
"10000/10000 [==============================] - 3s 278us/step\n"
]
}
],
"source": [
"from numpy.random import seed\n",
"from tensorflow import set_random_seed\n",
"\n",
"import keras.backend as K\n",
"\n",
"K.clear_session()\n",
"K.set_floatx('float64')\n",
"\n",
"def run_experiment(learning_rate, units):\n",
" learning_rate = np.power(10., learning_rate)\n",
" units = int(units)\n",
" \n",
" K.clear_session()\n",
" set_random_seed(2)\n",
" seed(1)\n",
" x_in = Input(shape=(1,))\n",
" h1 = Dense(units, activation='tanh')(x_in)\n",
" h2 = Dense(units, activation='tanh')(h1)\n",
" y_out = Dense(1, activation='linear')(h2)\n",
"\n",
" model = Model(inputs=[x_in], outputs=[y_out])\n",
" model.compile(RMSprop(lr=learning_rate), loss='mean_squared_error')\n",
" model.fit(x_train, y_train, epochs=1)\n",
" return model.evaluate(x_valid, y_valid)\n",
"\n",
"parameters = [('learning_rate', (-5, 1)),\n",
" ('units', (10, 1000))]\n",
"\n",
"samples = 10\n",
"best_loss = np.inf\n",
"for _ in range(samples):\n",
" parameter_values = []\n",
" for parameter, (lower, upper) in parameters:\n",
" parameter_value = np.random.uniform(lower, upper)\n",
" parameter_values.append(parameter_value)\n",
" validation_loss = run_experiment(*parameter_values)\n",
" if validation_loss < best_loss:\n",
" best_loss = validation_loss\n",
" best_parameters = parameter_values\n",
" print(best_loss, best_parameters)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[-4.23125331242386, 999.0501101709033]"
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"best_parameters"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 126us/step - loss: 0.2638\n",
"10000/10000 [==============================] - 0s 28us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 111us/step - loss: 0.2634\n",
"10000/10000 [==============================] - 0s 30us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 122us/step - loss: 0.2618\n",
"10000/10000 [==============================] - 0s 30us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 108us/step - loss: 0.2610\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 122us/step - loss: 0.2579\n",
"10000/10000 [==============================] - 0s 28us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 112us/step - loss: 0.2656\n",
"10000/10000 [==============================] - 0s 28us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 123us/step - loss: 0.2708\n",
"10000/10000 [==============================] - 0s 27us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 112us/step - loss: 0.2580\n",
"10000/10000 [==============================] - 0s 28us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 137us/step - loss: 0.3343\n",
"10000/10000 [==============================] - 0s 30us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 114us/step - loss: 0.3005\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 110us/step - loss: 0.2720\n",
"10000/10000 [==============================] - 0s 28us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 111us/step - loss: 0.2659\n",
"10000/10000 [==============================] - 0s 30us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 113us/step - loss: 0.2574\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 114us/step - loss: 0.2782\n",
"10000/10000 [==============================] - 0s 31us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 122us/step - loss: 0.2577\n",
"10000/10000 [==============================] - 0s 34us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 116us/step - loss: 0.2591\n",
"10000/10000 [==============================] - 0s 35us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 120us/step - loss: 0.2612\n",
"10000/10000 [==============================] - 0s 31us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 118us/step - loss: 0.2599\n",
"10000/10000 [==============================] - 0s 33us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 108us/step - loss: 0.2618\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 111us/step - loss: 0.2586\n",
"10000/10000 [==============================] - 0s 31us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 108us/step - loss: 0.2673\n",
"10000/10000 [==============================] - 0s 31us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 112us/step - loss: 0.2593\n",
"10000/10000 [==============================] - 0s 30us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 113us/step - loss: 0.2599\n",
"10000/10000 [==============================] - 0s 30us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 113us/step - loss: 0.2589\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 118us/step - loss: 0.2587\n",
"10000/10000 [==============================] - 0s 34us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 117us/step - loss: 0.2589\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 108us/step - loss: 0.2587\n",
"10000/10000 [==============================] - 0s 28us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 118us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 109us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 28us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 113us/step - loss: 0.2591\n",
"10000/10000 [==============================] - 0s 30us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 111us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 115us/step - loss: 0.2591\n",
"10000/10000 [==============================] - 0s 32us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 108us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 32us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 116us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 33us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 122us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 38us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 113us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 30us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 117us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 36us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 124us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 35us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 122us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 38us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 119us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 41us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 121us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 34us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 122us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 39us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 123us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 41us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 122us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 36us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 116us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 37us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 128us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 31us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 107us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 30us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 122us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 110us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 30us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 126us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 31us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 114us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 35us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 127us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 122us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 122us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 110us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 28us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 119us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"10000/10000 [==============================] - 1s 111us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 27us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 121us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 27us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 109us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 28us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 120us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 108us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 28us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 137us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 30us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 115us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 125us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 109us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 31us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 117us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 114us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 28us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 110us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 112us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 30us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 111us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 28us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 111us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 110us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 44us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 126us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 108us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 34us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 114us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 113us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 118us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 39us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 115us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 30us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 112us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 108us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 114us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 31us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 115us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 30us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 115us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 113us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 32us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 115us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 30us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 115us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 28us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 111us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 30us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 117us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Epoch 1/1\n",
"10000/10000 [==============================] - 1s 115us/step - loss: 0.2590\n",
"10000/10000 [==============================] - 0s 29us/step\n",
"Optimization terminated successfully.\n",
" Current function value: 0.249733\n",
" Iterations: 36\n",
" Function evaluations: 89\n"
]
},
{
"data": {
"text/plain": [
"array([-3.76196842, 32.27534339])"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Here's a deterministic one, but it only gives the best parameters for one parameter initialization.\n",
"\n",
"from scipy.optimize import fmin\n",
"def run_experiment(x0):\n",
" learning_rate, units = x0\n",
" learning_rate = np.power(10., learning_rate)\n",
" units = int(units)\n",
" \n",
" K.clear_session()\n",
" set_random_seed(2)\n",
" seed(1)\n",
" x_in = Input(shape=(1,))\n",
" h1 = Dense(units, activation='tanh')(x_in)\n",
" h2 = Dense(units, activation='tanh')(h1)\n",
" y_out = Dense(1, activation='linear')(h2)\n",
"\n",
" model = Model(inputs=[x_in], outputs=[y_out])\n",
" model.compile(RMSprop(lr=learning_rate), loss='mean_squared_error')\n",
" model.fit(x_train, y_train, epochs=1)\n",
" return model.evaluate(x_valid, y_valid)\n",
"\n",
"fmin(run_experiment, [-3, 30])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment