Skip to content

Instantly share code, notes, and snippets.

@kylemcdonald
Created November 2, 2015 01:15
Show Gist options
  • Save kylemcdonald/662f93a4bcaf0c046b6a to your computer and use it in GitHub Desktop.
Save kylemcdonald/662f93a4bcaf0c046b6a 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": false
},
"outputs": [],
"source": [
"import argparse\n",
"parser = argparse.ArgumentParser(description='Audio autoencoder.')\n",
"parser.add_argument('-f', '--filename')\n",
"parser.add_argument('-i', '--input', default='data/241.mp3')\n",
"parser.add_argument('-u', '--url', default='http://audio.thisamericanlife.org/jomamashouse/ismymamashouse/241.mp3')\n",
"parser.add_argument('-e', '--epochs', default=50, type=int)\n",
"parser.add_argument('-w', '--window_size', default=512, type=int)\n",
"parser.add_argument('-d', '--device', default='gpu2')\n",
"parser.add_argument('-nf0', '--num_filters_0', default=16, type=int)\n",
"parser.add_argument('-fs0', '--filter_size_0', default=3, type=int)\n",
"parser.add_argument('-ps0', '--pool_size_0', default=4, type=int)\n",
"parser.add_argument('-nf1', '--num_filters_1', default=24, type=int)\n",
"parser.add_argument('-fs1', '--filter_size_1', default=3, type=int)\n",
"parser.add_argument('-ps1', '--pool_size_1', default=2, type=int)\n",
"parser.add_argument('-nf2', '--num_filters_2', default=32, type=int)\n",
"parser.add_argument('-fs2', '--filter_size_2', default=7, type=int)\n",
"parser.add_argument('-ps2', '--pool_size_2', default=2, type=int)\n",
"parser.add_argument('-fc1s', '--fc1_size', default=128, type=int)\n",
"parser.add_argument('-es', '--encode_size', default=32, type=int)\n",
"parser.add_argument('-pm', '--pool_mode', default='max')\n",
"args = parser.parse_args()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import os, sys, gzip\n",
"import cPickle as pickle\n",
"import librosa\n",
"import numpy as np\n",
"from ffmpeg_load_audio import *\n",
"import matplotlib.pyplot as plt\n",
"import urllib\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Using gpu device 2: GeForce GTX TITAN X (CNMeM is disabled)\n"
]
}
],
"source": [
"os.environ['THEANO_FLAGS'] = 'device=' + args.device\n",
"from lasagne.layers import get_output, InputLayer, DenseLayer, ReshapeLayer, Conv1DLayer, Pool1DLayer, Upscale1DLayer\n",
"from lasagne.updates import nesterov_momentum\n",
"from lasagne.nonlinearities import linear\n",
"from nolearn.lasagne import NeuralNet, BatchIterator, PrintLayerInfo"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from DFTUtilities import dft_batch, DFTLayer, dft_error"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def check_file(filename, url):\n",
" if not os.path.isfile(filename):\n",
" print 'Downloading', url\n",
" opener = urllib.URLopener()\n",
" opener.retrieve(url, filename)\n",
" print 'File ready', filename"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"File ready data/241.mp3\n",
"Loaded audio raw: (76794462,)\n",
"Loaded audio tensor: (149989, 512)\n"
]
}
],
"source": [
"check_file(args.input, args.url)\n",
"audio_raw, sr = ffmpeg_load_audio(args.input, mono=True, dtype=np.float32)\n",
"audio_tensor = librosa.util.frame(audio_raw, args.window_size, args.window_size).transpose()\n",
"print 'Loaded audio raw:', audio_raw.shape\n",
"print 'Loaded audio tensor:', audio_tensor.shape"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(149989, 512) and (149989, 514)\n"
]
}
],
"source": [
"X_in = audio_tensor\n",
"X_dft = dft_batch(X_in) # dft on 150k 512-sample chunks takes 22 seconds\n",
"print '{} and {}'.format(X_in.shape, X_dft.shape)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"False\n",
"False\n",
"False\n"
]
}
],
"source": [
"# double check there are no NaNs\n",
"print np.isnan(X_in).any()\n",
"print np.isnan(X_dft).any()\n",
"print np.isnan(dft_error(X_dft[0:1000], X_dft[1:1001]).eval()).any()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABsIAAAE4CAYAAADhKua5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XeYlNX5//H3ccGCvWvs2HvBXldRwYqYWIg1fmPvMWrs\nLdGQ2GOiWH6WiL0SwYiFVRQUMYgNUDQgAiJFKSKywPn9cSCuCAg7u3NmZt+v69prmdl5Zj5LWZ55\n7nPuO8QYkSRJkiRJkiRJkirNQrkDSJIkSZIkSZIkSY3BQpgkSZIkSZIkSZIqkoUwSZIkSZIkSZIk\nVSQLYZIkSZIkSZIkSapIFsIkSZIkSZIkSZJUkSyESZIkSZIkSZIkqSIVXAgLIbQNIQwMIXwSQrhw\nDl8/KoTQP4TwXgjhjRDCFnW+NmTm/f1CCH0KzSJJkiRJkiRJkiTNEmKM9T84hCpgELA3MBx4G+gQ\nYxxQ5zE7AR/FGMeHENoCV8YYd5z5tf8CrWKM4wr4HiRJkiRJkiRJkqSfKHRH2PbA4BjjkBhjLfAI\n0K7uA2KMvWOM42fefAtYfbbnCAVmkCRJkiRJkiRJkn6i0ELYasCwOre/mHnf3Pwf0K3O7Qi8FELo\nG0I4scAskiRJkiRJkiRJ0v80K/D4+e6rGELYEzgB2KXO3bvEGEeGEFYEXgwhDIwx9iwwkyRJkiRJ\nkiRJklRwIWw4sEad22uQdoX9SAhhC+AuoG2M8etZ98cYR878PDqE8DSp1WLP2Y6t/xAzSZIkSZIk\nSZIklbUYY73HbBVaCOsLrB9CWBsYARwBdKj7gBDCmsBTwNExxsF17m8BVMUYJ4YQFgf2Ba6a04vE\naC1MUsO68sorufLKK3PHkFRh/NkiqTH4s0VSY/Bni6TG4M8WSY0hhHrXwIACC2ExxmkhhDOAF4Aq\n4J4Y44AQwskzv94JuBxYFrh9ZtjaGOP2wCrAUzPvawZ0jjF2LySPJEmSJEmSJEmSNEuhO8KIMT4P\nPD/bfZ3q/Pq3wG/ncNxnwFaFvr4kSZIkSZIkSZI0JwvlDiBJOVRXV+eOIKkC+bNFUmPwZ4ukxuDP\nFkmNwZ8tkkpRKPX5WyGEWOoZJUmSJEmSJEmS1PBCCMQY6z0ozB1hkiRJkiRJkiRJqkgWwiRJkiRJ\nkiRJklSRLIRJkiRJkiRJkiSpIlkIkyRJkiRJkiRJUkWyECZJkiRJkiRJkqSKZCFMkiRJkiRJkiRJ\nFclCmCRJkiRJkiRJkiqShTBJkiRJkiRJkiRVJAthkiRJkiRJkiRJqkgWwiRJkiRJkiRJklSRLIRJ\nkiRJkiRJkiSpIlkIkyRJkiRJkiRJUkWyECZJkiRJkiRJkqSKZCFMkiRJkiRJkiRJFclCmCRJkiRJ\nkiRJkiqShTBJkiRJkiRJkiRVpGa5A0gqrsmT4c03YdNNYeWVc6eRJElSKRo9Gi68EL79FjbeGLbY\nAtq1g6qq3MkkSZIkacG4I0yqcFOmQE0NXHEF7L47rLQSnHgi/O53uZNJkiSpFHXtCltuCcsvDwcf\nDNOmwV/+Aq1bwxdf5E4nSZIkSQsmxBhzZ5inEEIs9YxSqYkReveG22+HZ56BTTaBPfdMH7vsAjNm\nwLrrpsest17utJIkSSoFM2bABRfAk0/C/fenRVSzTJ8OHTvCLbfA3XfDQQflyylJkiSpaQkhEGMM\n9T6+1ItMFsKkBTN1KlRXp3Y2p5wCxx+fVvPO7oorYPjwdCFDkiRJTdv336fzxuHD4dlnYdll5/y4\nXr3gwAPho49glVWKGlGSJElSE2UhTNKP3HUXPP44/PvfsNA8mp+OHQsbbAD9+sGaaxYvnyRJkkrL\nxInQvj0svTR07gyLLjrvx591Fiy8MFx/fXHySZIkSWraLIRJ+p/aWthwQ3jgAdh1159//IUXwuTJ\n8Le/NX42SZIklZ7vv4f994d11oFOnaCq6ueP+eIL2GILGDQIVlyx8TNKkiRJatoshEn6n/vuS0Ww\nV16Zv8ePGgUbb2xrG0mSpKZoxgzo0AGmTYPHHpu/Itgsp5wCyy0H117bePkkSZIkCSyESZpp+vRU\n1OrUCfbcc/6P+93v0sWPW29tvGySJEkqPWedBe+9l1pq/1w7xNkNGQKtWsEnn6SCmCRJkiQ1lkIL\nYfOYIDTfAdqGEAaGED4JIVw4h68fFULoH0J4L4TwRghhi/k9VtL8e/RRWGklqK5esOMuuijNghgy\npDFSSZIkqRR98AE89RQ888yCF8EA1l4b2rWDjh0bPJokSZIkNaiCCmEhhCrgNqAtsAnQIYSw8WwP\n+wzYPca4BXANcOcCHCtpPt14I1x8MYQFrIuvuCKcfjpcdVXj5JIkSVLpeeEFOOggWGaZ+j/HNdek\nxVh33tlwuSRJkiSpoRW6I2x7YHCMcUiMsRZ4BGhX9wExxt4xxvEzb74FrD6/x0qaPwMGwMiR0KZN\n/Y4/7zzo2jU9jyRJkirfCy/U/9xxltVWg5degquvTh0GJEmSJKkUFVoIWw0YVuf2FzPvm5v/A7rV\n81hJc9G5Mxx55IINOK9r6aXh/PPhsssaNpckSZJKz+TJ0Ls37LVX4c+13nrQvTv8/vfw/POFP58k\nSZIkNbRCC2Fxfh8YQtgTOAGYNQtsvo+VNHcxwkMPwVFHFfY8p5+eZkVce23D5JIkSVJpeu012Gor\nWGqphnm+TTaBhx+Gk06CCRMa5jklSZIkqaE0K/D44cAadW6vQdrZ9SMhhC2Au4C2McavF+RYgCuv\nvPJ/v66urqa6urqQzFJF6d0bFlkEtt66sOdp0QJ69Egrg6dNg8svb5h8kiRJKi3duxfeFnF21dWw\n775w6aVw660N+9ySJEmSmpaamhpqamoa7PlCjPXfmBVCaAYMAloDI4A+QIcY44A6j1kTeAU4Osb4\n5oIcO/NxsZCMUqU7/XRYddV00aEhjBoFrVunVosN9ZySJEkqHZtuCvfdB9tt17DPO25c2h3WpQts\nv33DPrckSZKkpiuEQIwx1Pv4QotMIYT9gJuBKuCeGON1IYSTAWKMnUIIdwPtgc9nHlIbY9x+bsfO\n4fkthElzUVubhpS/+Sa0bNlwz/vll+kixocfpiKbJEmSKsOwYamTwKhR9Z8vOy8PPgjXXw99+0Kz\nQvuPSJIkSRIlUAhrbBbCpLnr2hX+9Cfo1avhn/vMM2HJJZ0ZJkmSVEn+3/9LrREfeaRxnj9G2Hln\nuOgiOPjgxnkNSZIkSU1LoYWwhRoyjKTievxx6NChcZ77nHPgrrtg0qTGeX5JkiQV3wsvpFlejSUE\naNcOXn658V5DkiRJkhaEhTCpTE2fnnaEtWvXOM+/7rqwxx5w772N8/ySJEkqrtpaeOklaNOmcV+n\ndev0OpIkSZJUCiyESWWqd29YfXVYc83Ge43zzoObbkpFN0mSJJW3mhpYb700Y7YxbbMNjByZPiRJ\nkiQpNwthUpnq0qXx5y7stBOsuio89VTjvo4kSZIa31NPwaGHNv7rVFVBdbXtESVJkiSVBgthUpkq\nRiEM4Kyz0qwwSZIkla8ZM+CZZ6B9++K83t57WwiTJEmSVBoshEllaNAgmDgxtZ1pbAcfDH36wJdf\nNv5rSZIkqXG8+SassAJssEFxXm/WnLAYi/N6kiRJkjQ3FsKkMvSvf8FBB0EIjf9aiy2WimGPPdb4\nryVJkqTGUay2iLPMKrh98knxXlOSJEmS5sRCmFSGitUWcZYOHeDhh4v3epIkSWo4MRa/EBbCD7vC\nJEmSJCknC2FSmRkzBvr3h732Kt5r7r03fPopfPZZ8V5TkiRJDaN//1SY2mKL4r6uc8IkSZIklQIL\nYVKZefxx2HdfWHTR4r1m8+bwq1/BI48U7zUlSZLUMJ58Mu0GK0Zb7bpat4YePWD69OK+riRJkiTV\nZSFMKiMzZsDNN8OZZxb/tX/9a+jc2YHnkiRJ5WTiRLjrLjjmmOK/9qqrwlprQa9exX9tSZIkSZrF\nQphURp57DpZcEnbbrfivvfPOMGkSvP9+8V9bkiRJ9XPjjWlnVrHbIs7Srh0880ye15YkSZIkgBBL\nfHtHCCGWekapWKqr4eSToUOHPK9/ySXw7bdpV5okSZJK2+jRsNFG8Pbb0LJlngzvvptabH/ySfFb\nM0qSJEmqDCEEYoz1fkdhIUwqE++8A+3bw6efppldOQwZAq1awbBh0KJFngySJEmaP+eck+Zz/e1v\n+TLECOuskzobbLZZvhySJEmSylehhTBbI0pl4oYb4Oyz8xXBANZeG3baCR55JF8GSZIk/bwhQ+Cf\n/4RLL82bI4TUHvHZZ/PmkCRJktR0WQiTysCXX8K//w2//W3uJHDaaXD77blTSJIkaV5uuw1OPBFW\nXjl3EueESZIkScrLQphUBrp1g332gaWXzp0E2rSBMWOgb9/cSSRJkjQnMcLTT8ORR+ZOkuy2G3z2\nGXzxRe4kkiRJkpoiC2FSGejWDfbfP3eKpKoKTj7ZXWGSJEml6v33YcYM2HLL3EmS5s3TuWyXLrmT\nSJIkSWqKLIRJJW7qVHjpJdhvv9xJfnDCCfDUUzBuXO4kkiRJmt3TT8Mhh6T5XKXikENSLkmSJEkq\nNgthUol7/XXYYANYaaXcSX6w0krwq1/BX/+aO4kkSZJm98wz0L597hQ/tt9+8J//wJAhuZNIkiRJ\namoshEklrls3OOCA3Cl+6oor4M47YeTI3EkkSZI0y3//C8OHwy675E7yYy1awDHHwF135U4iSZIk\nqamxECaVuK5dS2c+WF2rrw6/+Q1cc03uJJIkSZrlmWfgoIPSXNdSc8opcM89qfW3JEmSJBWLhTCp\nhH32WZrD1apV7iRz9oc/wGOPwaef5k4iSZIkKM22iLNstBFsvHHKKEmSJEnFYiFMKmHduqV5CguV\n6L/UFVaAs86Cyy/PnUSSJEmjR8O778Lee+dOMnennAK33547hSRJkqSmpEQvr0uC1BaxFOeD1XXu\nufDcczBmTO4kkiRJTdvLL0N1NSy6aO4kc9e+PQwYAAMH5k4iSZIkqamwECaVqClT4PXXYZ99cieZ\ntyWXTKuOn3sudxJJkqSmrXdv2Hnn3CnmbeGF4YQT4O67cyeRJEmS1FQUXAgLIbQNIQwMIXwSQrhw\nDl/fKITQO4QwJYRw3mxfGxJCeC+E0C+E0KfQLFIl6dULNtsMllkmd5Kf164dPPts7hSSJElNW+/e\nsNNOuVP8vEMPTS3AJUmSJKkYQoyx/geHUAUMAvYGhgNvAx1ijAPqPGZFYC3gEODrGOMNdb72X6BV\njHHcPF4jFpJRKlcXXwxVVXDNNbmT/LyxY6FlS/jyS1hssdxpJEmSmp7vvoPll0/tqlu0yJ1m3qZP\nh5VXTvPMVl89dxpJkiRJpS6EQIwx1Pf4QneEbQ8MjjEOiTHWAo8A7eo+IMY4OsbYF6idy3PUO7xU\nyV56qbQHnde1/PKwzTYpsyRJkorvnXdgk01KvwgGabFX69bw4ou5k0iSJElqCgothK0GDKtz+4uZ\n982vCLwUQugbQjixwCxSxfj66zRAfMcdcyeZf+3awTPP5E4hSZLUNJVLW8RZ9tnHQpgkSZKk4ii0\nEFZoz8JdYoxbA/sBp4cQdivw+aSK0KMH7LILLLJI7iTzr107eO651OpGkiRJxVWOhbCXXoIZM3In\nkSRJklTpmhV4/HBgjTq31yDtCpsvMcaRMz+PDiE8TWq12HP2x1155ZX/+3V1dTXV1dX1SyuViRdf\nLJ+2iLOss06a9fDmm6mIJ0mSpOKIMRXCbrwxd5L5t9ZasOyy0L8/bL117jSSJEmSSklNTQ01NTUN\n9nwhxvpv6gohNAMGAa2BEUAfoEOMccAcHnslMDHGeMPM2y2AqhjjxBDC4kB34KoYY/fZjouFZJTK\n0frrwxNPwJZb5k6yYC67DL7/Hv7yl9xJJEmSmo4hQ9JusBEjIJTRBOYzzoA114QLLsidRJIkSVIp\nCyEQY6z3u52CWiPGGKcBZwAvAB8Bj8YYB4QQTg4hnDwz4CohhGHAucClIYTPQwhLAKsAPUMI7wJv\nAc/NXgSTmqIhQ2D8eNh889xJFly7dtClS+4UkiRJTcustojlVAQD54RJkiRJKo6CdoQVgzvC1NTc\nc0+al/Dww7mTLLgZM2C11aBnT1hvvdxpJEmSmoazzoI11oDzz8+dZMFMmJDOHb/6ChZbLHcaSZIk\nSaUq644wSQ3vhRfKbz7YLAstBAccAF275k4iSZLUdMzaEVZulloqtQLv+ZMp0ZIkSZLUcCyESSVk\n/Hjo3j21GCxXBxwAzz2XO4UkSVLT8O238NFH0KpV7iT1s+++tkeUJEmS1LgshEkl5LHHoHVrWGGF\n3Enqb++94c03YeLE3EkkSZIq38svww47lG9rwX32SQvBJEmSJKmxWAiTSsh998Hxx+dOUZgll4Sd\nd3ZlryRJUjF07Zp25Jer7baDzz+HUaNyJ5EkSZJUqSyESSVi0CD49FNo2zZ3ksLZHlGSJKnxxQjd\nupV3IaxZM9hzT3jppdxJJEmSJFUqC2FSibj/fjj6aGjePHeSwh1wQLooM2NG7iSSJEmV6733YOGF\nYcMNcycpjO0RJUmSJDUmC2FSCZg+HR54AI47LneShrHuurDccvDOO7mTSJIkVa5ZbRFDyJ2kMPvs\nk9pqx5g7iSRJkqRKZCFMKgEvvwyrrAKbb547ScM58EC4997cKSRJkipXuc8Hm2XddWHRReGjj3In\nkSRJklSJLIRJJeDZZ+GII3KnaFgXXJDaIz7xRO4kkiRJlWfsWPjgA9hjj9xJCheC7RElSZIkNR4L\nYVIJqKmBvfbKnaJhrbACPPkknHoqDBiQO40kSVJl+fe/obo67aSqBPvum9ojSpIkSVJDsxAmZfbV\nVzB8OGy1Ve4kDa9VK+jYEdq3hwkTcqeRJEmqHJXSFnGWvfaC11+H77/PnUSSJElSpbEQJmX22muw\n665QVZU7SeM44YT0/Z17bu4kkiRJlSHGNGO2TZvcSRrOssumebmvvJI7iSRJkqRKYyFMyqymJrW1\nqWQ33ZQuanTrljuJJElS+Rs8GBZeGNZaK3eShtWhA3TunDuFJEmSpEpjIUzKrKamMoacz8uSS8I9\n98BJJ8HXX+dOI0mSVN7eeCPtuK80RxwBzz0HkyblTiJJkiSpklgIkzIaPRqGDYOtt86dpPHttRcc\ncgicfXbuJJIkSeXt9ddhl11yp2h4K66Yvq9nn82dRJIkSVIlsRAmZTRrPlizZrmTFMef/5xaJL73\nXu4kkiRJ5euNNyqzEAZw1FHw4IO5U0iSJEmqJBbCpIyaQlvEupZYIs1+eOyx3EkkSZLK09ixMHw4\nbL557iSNo1076N0bRo3KnUSSJElSpbAQJmX06qtQXZ07RXEddlgqhMWYO4kkSVL56dULdtihcjsK\nLL44HHQQPPpo7iSSJEmSKoWFMCmTMWNg6FDYZpvcSYpru+1g6lTbI0qSJNXHG2+k1tqV7OijbY8o\nSZIkqeFYCJMy6dULdtyxclfzzk0IaVfY44/nTiJJklR+Knk+2CytW6dFY6++mjuJJEmSpEpgIUzK\n5D//gW23zZ0ij8MPtz2iJEnSgvr++3QOucMOuZM0rmbN4Kqr4OKLPV+UJEmSVDgLYVIm/frB1lvn\nTpHHtttCba3tESVJkhbEO+/AhhvCkkvmTtL4fv1rGD8eunXLnUSSJElSubMQJmXyn/80vflgs4QA\nv/qV7RElSZIWRFNoizhLVRX88Y9wySUwY0buNJIkSZLKmYUwKYPRo2HiRFhnndxJ8jn8cHj4YZg+\nPXcSSZKk8vDGG7DrrrlTFE+7drDIIqmltiRJkiTVl4UwKYNZbRFDyJ0kn223hZVXhkcfzZ1EkiSp\n9MUIvXo1nR1hkM6Vr7su7QqbMiV3GkmSJEnlykKYlEFTng82Swhw9dVpEPq0abnTSJIklbZPPoHF\nFoPVV8+dpLj22gu22gquvz53EkmSJEnlquBCWAihbQhhYAjhkxDChXP4+kYhhN4hhCkhhPMW5Fip\nUjXl+WB1tW4Nq6wCnTvnTiJJklTaXn+9ae0Gq+vGG+Hmm2Ho0NxJJEmSJJWjggphIYQq4DagLbAJ\n0CGEsPFsDxsLnAlcX49jpYrkjrBk1q6wq6+G2trcaSRJkkrXG2803ULYWmvB2WfDeef9/GMlSZIk\naXaF7gjbHhgcYxwSY6wFHgHa1X1AjHF0jLEvMPtl7p89VqpEEybA8OGw4Ya5k5SGPfaAddaB++/P\nnUSSJKl0NeVCGMD556euCi++mDuJJEmSpHJTaCFsNWBYndtfzLyvsY+Vylb//rD55tCsWe4kpWPW\nEPTPPsudRJIkqfSMGQMjR6ZzyKZq0UXhiivgtttyJ5EkSZJUbgq9FB+LceyVV175v19XV1dTXV1d\nwMtKeTkf7Ke22w4uvRTat4devWDxxXMnkiRJKh29esGOO0JVVe4keR14IJx5Jnz3HSy2WO40kiRJ\nkhpLTU0NNTU1DfZ8hRbChgNr1Lm9BmlnV4MeW7cQJpW7fv2adlubuTnjDOjbF048ETp3TvPDJEmS\nZFvEWZZfHrbaCnr0gP33z51GkiRJUmOZfUPUVVddVdDzFdoasS+wfghh7RDCwsARQJe5PHb2y9oL\ncqxUMdwRNmchwB13wKBB0KlT7jSSJEml4/XXLYTNcuCB8K9/5U4hSZIkqZyEGAvpbgghhP2Am4Eq\n4J4Y43UhhJMBYoydQgirAG8DSwEzgInAJjHGSXM6dg7PHwvNKJWK775LK1m//hoWWSR3mtLUvz+0\naQODB8MSS+ROI0mSlNeUKen8cdQoz40ABgyAffeFzz+3g4AkSZLUVIQQiDHW+x1AwYWwxmYhTJXk\ntdfg/PPhrbdyJyltHTrAZpvBJZfkTiJJkpTXG2/A2WenFtKCGGH99eGJJ1KbREmSJEmVr9BCWKGt\nESUtgNdeg912y52i9F19Ndx0E4wblzuJJElSXn36wI475k5ROkKAgw6yPaIkSZKk+WchTCqinj0t\nhM2P9deHQw+Fv/41dxJJkqS8Pvww7ZTXDyyESZIkSVoQtkaUimTatDTf4bPP0mfN27Bhqd3Nhx/C\nKqvkTiNJkpTHzjvDn/8Mu++eO0npmDoVVl45zQvzPFGSJEmqfLZGlMrEu+/CGmtYBJtfa6wB7dtD\n5865k0iSJOURI3z0EWyySe4kpWXhheGAA+Dee3MnkSRJklQOLIRJRWJbxAV3+OHw+OO5U0iSJOUx\nciQssgissELuJKXniivghhvgyy9zJ5EkSZJU6iyESUXSs6ctbRbUnnvC4MHw+ee5k0iSJBWfu8Hm\nbv314Te/gYsvzp1EkiRJUqmzECYVQYzuCKuP5s3hkEPgiSdyJ5EkSSo+C2Hzduml8Pzz0Ldv7iSS\nJEmSSpmFMKkIBg6EJZaA1VfPnaT8HHYYPPZY7hSSJEnFZyFs3pZeGv74Rzj77LTwTD9v6lSYPj13\nCkmSJKm4LIRJRWBbxPrbay/bI0qSpKbJQtjPO/74VNi54YbcSUrbxx/D734Hq64Km24KPXrkTiRJ\nkiQVj4UwqQhee822iPXVvDm0a2d7REmS1LTECB9+aCHs51RVpe4BN9zQdIs7d90F110H7733051x\nY8fCccel9yKLLJLaSHbsmAqIxxwDo0ZliSxJkiQVlYUwqQjeeAN23TV3ivJ12GHw+OO5U0iSJBXP\nV1+lzyutlDdHOVhzTXjwQfj1r2HYsNxpiuv11+GKK2DEiDRbd801U4GrUye45x7YbDNYfnn47LNU\nLFtnnbTI7MMP0+6wzTaDO+6AGTNg2jR4803o3Bm++CL3dyZJkiQ1nBBLvJl6CCGWekZpXsaOhZYt\n4euvYSFLz/VSW5vetP/5z3D00bnTSJIkNb4ePeDyy1OLbc2fjh2hS5dUHAohd5rG9913sNVWqcB1\n6KFpN9jHH6duFK+/nopjf/oTbL/93J/j/ffh1FNh9OhUfF1jDVh33fQcq60GZ54JJ55YvO9JkiRJ\nmpMQAjHGep/lN2vIMJJ+6p13YOutLYIVonlz6N4d9tknDfg+4YTciSRJkhrXRx+lWU6afxdckHY3\n9e+fCkSV7qqrYIstUhEMUvFvww3Tx/wWrzbf/IfC2QYbwCqrpPunT0+7w449FiZPhrPPbpzvQZIk\nSSoGC2FSI3vnHWjVKneK8rfJJmll9N57p9Wqhx6aVqtWVeVOJkmS1PA++sj5YAsqBDjySHjkkcov\nhL39Ntx7b5oLVqiFFoLdd//xfVVVsMsu8MorUF2dFqaddlrhryVJkiTl4B4VqZFZCGs4G2wANTXp\njX/btrD00nDOOblTSZIkNTwLYfUzqxBWKd31Y4QPPvjx99O3Lxx0UNr9tvLKjfv6a62VimEdO6bf\n27vvTvPGJEmSpHJiIUxqZO+8A9tumztF5WjZEp58Mr0BHzo0zYHo2jV3KkmSpIZlIax+ttgCWrRI\nbf3K3dSpqTXhjjum3Vm9e6eZcfvvD506Qfv2xcmxzjppIdree6cODTvvnH6f//Qni2KSJEkqDxbC\npEY0diyMGwfrrZc7SWVafnm46y445RQYPz53GkmSpIYxZgx8/z2sumruJOVnVnvEhx/OnaQw48en\ngtekSfDll3DyyXD44dCuXfre2rUrbp6VVoLf/hY6d4YRI+Dvf0+ft9sOXn65uFkkSZKkBRViifeM\nCCHEUs8ozU337nDttamdnxrPySenz5065c0hSZLUEF59FS66CHr1yp2kPH38MeyxB3zxRXnOk504\nMeXfaSe49dYfvofJk2HCBFhllbz56nr11VSgq6mBjTfOnUaSJEmVKoRAjDHU93h3hEmNyPlgxfGX\nv8Dzz8O//507iSRJUuE++AA23zx3ivK1wQbwi1+U52K0GTPg6KPTe4jbbvtxIa9Fi9IqgkEq2P3l\nL3DggTB6dO40kiRJ0pxZCJMakYWw4lh66dSm5dhjoU+f3GkkSZIK8/77FsIKVa7tES+9FL75JrUe\nDPVe71pcxx0HHTrAAQektp6SJElSqbE1otSI1lkn7VLacMPcSZqG555Lswtefjn9nr/4Irz0Ehx0\nUFqtWi5ZuKGxAAAgAElEQVQXEyRJUtO2yy6pvfYee+ROUr5GjIBNN4UhQ9KiqVLy3nvw17/Ckkum\nmbeLL57OU7/6Cp5+Oi3sWmGF3CkXTIypiPf446lTw7rr5k4kSZKkSmJrRKlEjR2bPtZfP3eSpuPA\nA+HGG2HvvWGNNeCqq1ILmdNPT6uqH300d0JJkqR5izG1Rtxss9xJytsvfgH77AP//GfuJD82eDDs\ntx9sskkq1DVvDl9/nd43VFWlIlK5FcEgFfL+9Cf43e9g112hSxeYOjV3KkmSJClxR5jUSLp3Tyt5\ny3E2Qbnr2RNWXBE22ijdjhF69EiDvN96yxWqkiSpdA0dCjvtlHY0qTA1NXDaafDhh6XRGWD4cNht\nN/jDH+Ckk3KnaTzdusEf/wgDBkCbNtCuHey/f+ntzJMkSVL5cEeYVKKcD5bPbrv9UASDdOFjr73g\nnHNSyxZJkqRS9cEHzgdrKLNaY7/6au4kMHkytG2bCmCVXASDVPTq1QsGDkydGh56KHVraNMGhg3L\nnU6SJElNkYUwqZFYCCs9556bLoS8807uJJIkSXP2/vsWwhpKCGlH2N//njtJ6hSxySZw4YW5kxTP\nyiun+b3/+lfa4bjzzqmV+cSJuZNJkiSpqbE1otRI1loLXnrJGWGl5o474Mkn4cUXcyeRJEn6qaOO\ngn33heOOy52kMkyYkM7LP/wwzQ3LYcAA2H136N8/X4ZSECOccgp88QU8+yw0a5Y7kSRJkspF9taI\nIYS2IYSBIYRPQghzXN8WQrh15tf7hxC2rnP/kBDCeyGEfiGEPoVmkUrFV1+lN93rrZc7iWb3f/+X\nZm907547iSRJ0k+9/z5stlnuFJVjqaXg6KPTnKp7763fbqTvv4ebb4bPP5/7YyZNgv/8Jz22rhjT\nrrTLLmvaRTBIO/Ruuw2mTk0ty13vKkmSpGIpaEdYCKEKGATsDQwH3gY6xBgH1HnM/sAZMcb9Qwg7\nALfEGHec+bX/Aq1ijOPm8RruCFPZ6do1vVl211Fpeu45OP10eOstWGWV3GnmT21tauv4xBPQpw/c\ncAPsueecHztuHPTrl2YwfPkl7LRTmpu2kM1wJUkqabW1qXAzbhwstljuNJVj6tTUnu+BB9L51B57\npHlVbdtCy5bzPvatt+CEE6B5c6iqgtdf/+mfzfffwz77pHOvUaNSC8Tttksf48alGVl9+rgDapZv\nvkm/97/4Bdx3X/o7L0mSJM1L7h1h2wODY4xDYoy1wCNAu9keczBwP0CM8S1gmRDCynW+Xu/wUql6\n++30xlel6cAD0wWNQw6BKVNyp0kGD04XWl56Kc0wm1X/nzEDHnwwXaS5+GJYZ500W+LII1Obx9n1\n6ZPmilxzDbzyStqdeNZZsPbacOqp8Otfp8JYy5apTdCaa6aB7dOmFfXblSRJczBoUPq/2SJYw1p4\nYfjlL1M7vsGD4Ygj0jnTjjvC+eenQtmcXHddOl+84oq0yGj99dPurrrrNGNMc7BWWgk+/RTGjIFb\nb4WNNoIePeDRR+HOOy2C1bXMMqkgudJKsMMOaRekJEmS1JgK3RH2K6BNjPHEmbePBnaIMZ5Z5zH/\nAq6LMfaaefsl4IIY439CCJ8B44HpQKcY411zeA13hKnsHHBAekPcvn3uJJqbGFMxqXnzdLHi3Xfh\nk0/ShZFllilulmuvhZtuSkWuJZdMq4mnTk1/f958MxWpbrklDRifZfBgOOgg2HbbNEtk992hW7dU\n7Lr77tT+p64PPkjtIFdaKRXFVl01rWqeMSPtjltsMXj4YVhkkaJ+65IkqY5HHkm7v594IneSpmHM\nmNQ2e/jwdB5Ud7bvddelHWQ9evzQQWDSpFQ8O+20tKiqqio97rnnoKYGWrTI8m2UtXvugYsuguWX\nT7v0fvtbW4NKkiTppwrdEVZoIeyXQNv5KIT9Ocb4xszbdQthv4gxjgghrAi8CJwZY+w522vEK664\n4n+3q6urqa6urndmqbHFCCuvnGYErL567jSal8mTYa+9UpFoq61SEWrMmFQwWnbZ4mT4299Skatn\nz1ScgvR36IMP4KmnUnHs6KPn3NZw/Ph0fPfuaZXyssumlc5bb/3Tx87L99+nnWKTJsHTT3sRR5Kk\nXC65JO1eqvP2R40sRvjHP+DSS+Hgg+HMM+G11+D229Oupdnnen3ySWpPPXo0TJ+eztV69iyfdtul\naMaMdC7btWs6t73+ejjuuNypJEmSlFNNTQ01NTX/u33VVVdlLYTtCFwZY2w78/ZFwIwYY8c6j7kD\nqIkxPjLz9kBgjxjjqNme6wpgUozxhtnud0eYysrQoWml6IgRaSC0StuMGekCSFVV+vz736eVvy++\nmFamNoTa2lTIqqr68f333psudL32WtqlVYiJE9PftyWWqN/x06bBb34DI0emGRq2ZJIkqfgOPjgV\nAH75y9xJmp6xY9PupH/8I523vfoqrLFG7lRNz4cfwqGHQuvWaebywgvnTiRJkqRSkHtGWF9g/RDC\n2iGEhYEjgC6zPaYLcCz8r3D2TYxxVAihRQhhyZn3Lw7sC9gdXGVv1nwwi2DloW6BKoS0AnXvvdPH\npElzPqa2NrVT7NLlxzMiZjdyJFx+edoZuPHGaWYXpJ1cJ52UimDduxdeBIO0m62+RTBIcyvuuy+1\nTmzfvnRmp0mS1JS8/36a9aniW355uOCCNOfr448tguWy6abp/dSnn6a5uJIkSVJDKKgQFmOcBpwB\nvAB8BDwaYxwQQjg5hHDyzMd0Az4LIQwGOgGnzTx8FaBnCOFd4C3guRhj90LySKXg7bfT3CaVpxCg\nY0fYZpu0Q2r2QtdHH8FOO6VdUxddBPvs89MB3zNmwB//mN7IjxmTVhRff316vsMOSxe4QkjHbbRR\n8b63n1NVlWZhLLEE/OpX6e/y99/nTiVJUtMwblzalbTuurmTNG1VVWmBkPJZail46CF49NHUOUGS\nJEkqVEGtEYvB1ogqN3vtBeefD/vtlzuJCjFlCuy+eyoIXXBB2h12ww1w223wpz/BiSemuRCdOsFV\nV0F1dVq12rIlHHMMfPMNPPbYj+dKTJqUdpLtsENq91KqamtTke/FF9McjG22gcsuSwPMJUlS4+ja\nFW66CV56KXcSqTR06QLnngv9+xfW+UCSJEnlr9DWiBbCpAY0YwYsu2xq5bHCCrnTqFDDhsH226fC\n1oMPpmLXtdf+tJXhxIlw113p4tWkSWm2x1//Cs2b50jdsCZPhm7d4OKL0/d9442w2Wa5U0mSVHku\nuSTtRrr66txJpNJx/PHQokWa3Sap4c2YAX37plnn1dWw4oo/3P/f/6ZOJquu6gxpSVJ+FsKkEjJw\nYNoJ9t//5k6ihvLaa2lQ9yWXQKtW837s1KkweDBssklxshVTbW3a/XbNNdCrl22bJElqaNXVaUe2\nO7ClH3zzDWy9NZxzDpx9du40UuUYODC9z+3SBZZZJnU2ef319HnJJeHdd9P9AF9+CUsvnWZcn3pq\nmrMtSVKxWQiTSsiDD6YTyccey51Eahz/+Ef66N07vUGSJEmFq61NXQWGD08XGyX9YOjQNJe3Qwe4\n8sq0Q0XSgps+PRXAOnaE55+Hs86CI4+E9ddPX6+thT590piArbeG5ZZL98cIH34IJ50ECy8Md98N\n662X7/uQJDVNhRbCHAMsNaC334bttsudQmo8p54K/fql9o9PPOFqQEmSGsK776ZV+BbBpJ9aa620\nU6VNGxg1KrUgd0GW9FO1tal7x8CB8PHHMGJEanX/7bdpocWQIan14YknptnXSy314+ObN4dddvnp\n84aQ2uP37Am33JI6pbRsCXvuCYcdBjvtVJRvT5KkgrgjTGpAO++cZkhVV+dOIjWe77+HvfZKFyCO\nOAIOPPCHXvKSJGnB3XILDBgAd9yRO4lUusaPhzPPhO7d4dJLf9idIjUFMaZ2/UssAeef/+N51N99\nB/fck4rEK60EW2wBG24Iq60Giy+e5uz94hepvX1DzPqaOjXNFevRA26/HQ4/PF0HWXTRwp9bkqS5\nsTWiVCJmtbQZOdIViqp8kybBM8/As8+mixELLZTe+Cy7bHoDdsABuRNKklQ+Dj8cDjoIjjkmdxKp\n9PXvDxdcAGPHpvPQWe3bpEoVYyoC9+2bdg6PGQP33pvekz3yCDz6aNqVddFFsMMOxc02dmzqGvLR\nR/DPf6aWipIkNQYLYVKJePdd+PWv0wmg1JRMmwYTJ6aViB9+CCeckFonXnUVVFXlTidJUmmLEVZf\nHV57La3Wl/TzYoTf/x5qauDFFy2GqXLFCGefDW+9lQq/Sy2Vdn+dd176v6NDh9SlY9acr1wZH3oI\nzj0Xfve7tGPN94GSpIZmIUwqEXfdlXrX339/7iRSXl99ld6QNW+edo3ZIkOSpLkbOjSt4B85Ms1h\nkTR/YkzFgFdfhZdeSp0JpErSuzdcfnlqC9q9OyyzzA9fq639cXvEUvD553D88al14tNP2z5fktSw\nCi2ELdSQYaSm7O23YbvtcqeQ8ltppfRGbdll4aijYPr03IkkSSpdvXqlObMWwaQFEwLccAPsthsc\nfDBMmZI7kdQwPvwQ2rRJiwsPOywtuK1bBIPSK4IBrLlmKkpvvjlceGHuNJIk/ZiFMKmBWAiTflBV\nBffdl1YvnnFGWrErSZJ+6o03YJddcqeQylMIcOONsOqq8JvfwIwZuRNJ9TdlClx2GVRXp+Luxx/D\nSSfBwgvnTjb/FloIOnaEF15I7RwlSSoVtkaUGsB338Hyy8O4cbaBk+qaMCG9kdtqqzQ7bKed7Bcv\nSVJd22wDt92WdoVJqp8pU6B1a9h9d7juutxppPk3YAD07Al9+6Z5d61awa23wi9+kTtZYR54IP3f\n9uabqTgmSVKhbI0olYB334WNN7YIJs1uqaXSasDVV4fTT0+rdc84I7X7kCSpqfvuOxg4MBXDJNXf\noovCs8/Ck0/CTTflTiPN27ffwj33wI47wj77pFlgW24JTzyRPsq9CAZw9NHQrFnqEiJJUimwECY1\nANsiSnO34opw9dXQv39qj7HccukN3+67w6BBudNJkpRPv36wySYuppIawgorpPlEt90GN9+cO400\nZ88+mxbRPvMMXHopDBkC996bFg22apU7XcNZaCH429/gkktg1KjcaSRJshAmNQgLYdL8WWedVBQb\nOhQOPxz23hsGD86dSpKkPN56C7bfPncKqXKsuSb06JFay91yS+40UjJxIrz6Khx6KFxwQWob+K9/\nwYEHpl1TlapVKzjxRDjiCKitzZ1GktTUVfB/uVLxvP02nH9+7hRS+WjePLVIXHjhNM/h1Vdh7bVz\np5Ikqbj69IG2bXOnkCrLrGJYdTW0aJEuxEvF8u23aUfiJ5+knVBDh6aPLbZIha+HHmpau4CvuAIO\nOgguvBBuvDF3GklSU2YhTCrQ+PHwxReprY2kBXPSSTB1Kuy1V2pl07Jl7kSSJBVPnz5w+eW5U0iV\nZ621oHt32GMPWHZZ+NWvcidSU/D222k2VqtWqfPFKqvAaqulawXNm+dOl0dVFTz4YOqgs9120KFD\n7kSSpKbKQphUoDffTAPOK7mlgdSYzjgjvUHabTfo1i0NipYkqdKNGZM+NtwwdxKpMq2/fjq3bNMG\nll46zaiVGsPo0WkX2F13pRl1hx+eO1FpWW45eOqpVBzcYIPKmoUmSSofzgiTCtS1K+y3X+4UUnk7\n9dT05nGffeDll3OnkSSp8fXpA9tuCwv5jkxqNFttBU8+CUcdBWPH5k6jSjNgAJxySirujBoF77xj\nEWxuttwSOnWCQw6BESNyp5EkNUW+7ZIKECM891zq9S2pMIcdBg8/DMcfD1tvDddfD199lTuVJEmN\no08f2GGH3Cmkyrfrrqk14jXX5E6iSjBtWnrPssceqb37yivDwIFw992wxhq505W2Qw9NCyDbtYPJ\nk3OnkSQ1NSHGmDvDPIUQYqlnVNM1YEBqtTF0KISQO41UGWbMgFdfhfvvh1deSR/rrZc7lSRJDWv/\n/dOszEMOyZ1EqnxffZXmNPXqlXbvSPUxZQoccUT6+/T738PBBzfd2V/1FSMccwwsvDD8v/+XO40k\nqZyEEIgx1vsKvIUwqQDXXw+ffgq33547iVSZ7rwzrd595ZU050GSpEoQI6y4Irz3HvziF7nTSE1D\nx45pvvPTT+dOonI0aVLaybTiivDPf1oAK8SkSbDppqkQ1rp17jSSpHJRaCHM1ohSAWyLKDWuk06C\nK6+EPfeETz7JnUZNwYgR6QLZM8+k1jd1xZh2At94I3ToAH/7GwwblienpPL22Wew6KIWwaRiOvts\n6NcvdR6QFsQHH8Dee0PLltC5s0WwQi2xBPz972m+2nff5U4jSWoq3BEm1dM338Caa8KXX0KLFrnT\nSJXtH/+AO+6At96CxRbLnUblZtgw6NoV+vZNMxw+/hgWWSRdgF5ppfQGfMIEGDkyzSvYccd0e+hQ\nOO00WGGFdNFs1oWz/feH7beH115LCyJatkwtXjp0SI+VpJ/z8MPwxBPw5JO5k0hNy2OPpW4Dffum\ncwFpXt5/H666Cl5/HS68EM45x5EIDemww2DDDeGPf8ydRJJUDmyNKGXy2GNphlHXrrmTSJUvRjjq\nqLR68M47c6dRuXjhBbjggrTLq21b2HVX2Gij1GaztjbdP3p0Kq4utVQqiq299g8XOPr1S6tVp0xJ\nA9F32y29Wa97AWTaNHj5ZXjggfT/wQYbpOdaYon0+N/8BpZbLsu3L6mEnX12KsZfeGHuJFLTEmNq\nb7fVVnD11bnTqFRNnw7XXgu33ZZ+Tp98Miy+eO5UlWfECNhyS6ipSa0SJUmaFwthUibHHgs77QSn\nnpo7idQ0TJgArVqlixYdOuROo1J3771w0UVw332wzz5QVdX4rzlhAnz4YZp7MH48PPts2jHWvn3a\nWbbtto2fQVJ52HrrVGjfeefcSaSmZ8SIVAjr3j191s/79luYOBFWWeXH9w8dCjNm/HghUbkbOhSO\nPhoWXjgtdFpttdyJKtuNN0KvXmmXtCRJ82IhTMqgtjadEPftm9ojSiqOfv1g333T/KZddsmdRqUo\nxtTy6L774Pnn0w6unEaPhnvuSa09V145FcSOOCLNBpLUNH39dTp/HDs2XWiVVHz33Qe33AJ9+jjv\naW5GjIDrroOePdOs3ubNYffd4cwz069vuikVMBZZJC0G2nxzaNMmLQDabLPyLIw98gicdRacfz6c\ndx4stFDuRJXv229Tm/GaGth449xpJEmlLHshLITQFrgZqALujjF2nMNjbgX2AyYDx8cY+y3AsRbC\nVHIeeCC9eXrlldxJpKbn+efh+OPh4ovTG9VyfJOtxjF4MJx4Ypr59cwzP121nNP06env7m23wX/+\nAyecAL/8Zbr/u+9Si8VmzdKFpa23nnP7ncmT4Y034PPP0wWDDTZIrdXq/hsYNSo9ZtiwNMPyu+/S\nTsqddoJ11/Xfi1QKunRJPwu6d8+dRGq6YoQDDkgzP6+8MneafKZPh+HD07nFssumFtILLZTe755/\nfjpfad8+7ZybNg06d04/v2pr07ysY45J87LHjUvnN889B08/ne679FI48sji7Mov1PjxqWVt797w\n0EPp3EnF86c/pRm+99+fO4kkqZRlLYSFEKqAQcDewHDgbaBDjHFAncfsD5wRY9w/hLADcEuMccf5\nOXbm8RbCVFJmzEj9q2+7DVq3zp1Gapr++99URFhvvdRaasUVcydSTtOmpVXJHTumAunZZ5f2RZdP\nPoF//CMtplh00XSxqKoqXYyaPDldjLroojSP4quvUquYZ56Bd95JRbKWLeGzz9LzTJyY/h20bJlu\nDx+edku2bJkKgc2bw9tvpxXbAIcckj722MMV8FIuv/sdrLBC+nklKZ8RI9L/q126wA475E5TXJ9/\nnnY8demSfh6tuSaMGZMW0ay2Wjo/ue+++rWOjBF69EiFsAkTUkFt331h1VUb/Nso2KBB6X19585w\n+OFwww3OAsvhm2/Sgq133kltNiVJmpPchbCdgCtijG1n3v4DQIzxz3UecwfQI8b46MzbA4FqYJ2f\nO3bm/RbCVFKefBL+8hd4801X1ks5TZmSigWdO8Mf/wi//a3tS5qid99Nf/bLLAN33pkKQOXu3Xfh\nssvSzq4QoF27VPjdYw9YYokfP3bChLQT7tNPYZ110gW9uRUBBwxIBbWnn06PP+CAtMr7gANszyYV\nU6tW8Le/OR9MKgVPPQUXXpjab8/+f2wlqq2F669PH2eemYpUdQs/33yTzhe23bbwBTMxQrducPfd\n8OqrqUV0u3bwf/8H669f2HMXqrY2vY944AE46SQ45RRYffW8mZq6iy5K57V//3vuJJKkUpW7EPYr\noE2M8cSZt48GdogxnlnnMf8Crosx9pp5+yXgQmBtoO28jp15v4UwlYwY05uCK66Agw/OnUYSpKLB\n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\nsdjUAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fe75d7f88d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(30,5))\n",
"plt.plot(X_in[100].transpose())\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"after_pooling = args.window_size / (args.pool_size_0 * args.pool_size_1 * args.pool_size_2)\n",
"flat_length = args.num_filters_2 * after_pooling\n",
"flatten = (ReshapeLayer, {'shape': (([0], -1))})\n",
"layers = [\n",
" (InputLayer, {'shape': (None, args.window_size)}),\n",
" (ReshapeLayer, {'shape': (([0], 1, -1))}),\n",
" (Conv1DLayer, {'num_filters': args.num_filters_0, 'filter_size': args.filter_size_0, 'pad': 'same'}),\n",
" (Pool1DLayer, {'pool_size': args.pool_size_0, 'mode': args.pool_mode}),\n",
" (Conv1DLayer, {'num_filters': args.num_filters_1, 'filter_size': args.filter_size_1, 'pad': 'same'}),\n",
" (Pool1DLayer, {'pool_size': args.pool_size_1, 'mode': args.pool_mode}),\n",
" (Conv1DLayer, {'num_filters': args.num_filters_2, 'filter_size': args.filter_size_2, 'pad': 'same'}),\n",
" (Pool1DLayer, {'pool_size': args.pool_size_2, 'mode': args.pool_mode}),\n",
" flatten,\n",
" (DenseLayer, {'num_units': args.fc1_size}),\n",
" (DenseLayer, {'name': 'encode', 'num_units': args.encode_size}),\n",
" (DenseLayer, {'num_units': args.fc1_size}),\n",
" (DenseLayer, {'num_units': flat_length}),\n",
" (ReshapeLayer, {'shape': (([0], args.num_filters_2, after_pooling))}),\n",
" (Upscale1DLayer, {'scale_factor': args.pool_size_2}),\n",
" (Conv1DLayer, {'num_filters': args.num_filters_1, 'filter_size': args.filter_size_2, 'pad': 'same'}),\n",
" (Upscale1DLayer, {'scale_factor': args.pool_size_1}),\n",
" (Conv1DLayer, {'num_filters': args.num_filters_0, 'filter_size': args.filter_size_1, 'pad': 'same'}),\n",
" (Upscale1DLayer, {'scale_factor': args.pool_size_0}),\n",
" (Conv1DLayer, {'num_filters': 1, 'filter_size': args.filter_size_0, 'nonlinearity': linear, 'pad': 'same'}),\n",
" flatten,\n",
" (DFTLayer, {})\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"# Neural Network with 548081 learnable parameters\n",
"\n",
"## Layer information\n",
"\n",
" # name size\n",
"--- ----------- ------\n",
" 0 input0 512\n",
" 1 reshape1 1x512\n",
" 2 conv1d2 16x512\n",
" 3 pool1d3 16x128\n",
" 4 conv1d4 24x128\n",
" 5 pool1d5 24x64\n",
" 6 conv1d6 32x64\n",
" 7 pool1d7 32x32\n",
" 8 reshape8 1024\n",
" 9 dense9 128\n",
" 10 encode 32\n",
" 11 dense11 128\n",
" 12 dense12 1024\n",
" 13 reshape13 32x32\n",
" 14 upscale1d14 32x64\n",
" 15 conv1d15 24x64\n",
" 16 upscale1d16 24x128\n",
" 17 conv1d17 16x128\n",
" 18 upscale1d18 16x512\n",
" 19 conv1d19 1x512\n",
" 20 reshape20 512\n",
" 21 dft21 514\n",
"\n"
]
}
],
"source": [
"ae = NeuralNet(\n",
" layers=layers,\n",
" max_epochs=args.epochs,\n",
" \n",
" objective_loss_function=dft_error,\n",
" \n",
" update=nesterov_momentum,\n",
" update_learning_rate=0.01,\n",
" update_momentum=0.975,\n",
" \n",
" regression=True,\n",
" verbose=1\n",
")\n",
"ae.initialize()\n",
"PrintLayerInfo()(ae)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"# Neural Network with 548081 learnable parameters\n",
"\n",
"## Layer information\n",
"\n",
" # name size\n",
"--- ----------- ------\n",
" 0 input0 512\n",
" 1 reshape1 1x512\n",
" 2 conv1d2 16x512\n",
" 3 pool1d3 16x128\n",
" 4 conv1d4 24x128\n",
" 5 pool1d5 24x64\n",
" 6 conv1d6 32x64\n",
" 7 pool1d7 32x32\n",
" 8 reshape8 1024\n",
" 9 dense9 128\n",
" 10 encode 32\n",
" 11 dense11 128\n",
" 12 dense12 1024\n",
" 13 reshape13 32x32\n",
" 14 upscale1d14 32x64\n",
" 15 conv1d15 24x64\n",
" 16 upscale1d16 24x128\n",
" 17 conv1d17 16x128\n",
" 18 upscale1d18 16x512\n",
" 19 conv1d19 1x512\n",
" 20 reshape20 512\n",
" 21 dft21 514\n",
"\n",
" epoch train loss valid loss train/val dur\n",
"------- ------------ ------------ ----------- ------\n",
" 1 nan nan nan 25.83s\n"
]
},
{
"data": {
"text/plain": [
"NeuralNet(X_tensor_type=None,\n",
" batch_iterator_test=<nolearn.lasagne.base.BatchIterator object at 0x7fe7a95719d0>,\n",
" batch_iterator_train=<nolearn.lasagne.base.BatchIterator object at 0x7fe7a9571950>,\n",
" custom_score=None,\n",
" layers=[(<class 'lasagne.layers.input.InputLayer'>, {'shape': (None, 512)}), (<class 'lasagne.layers.shape.ReshapeLayer'>, {'shape': ([0], 1, -1)}), (<class 'lasagne.layers.conv.Conv1DLayer'>, {'filter_size': 3, 'pad': 'same', 'num_filters': 16}), (<class 'lasagne.layers.pool.Pool1DLayer'>, {'mode':... 'lasagne.layers.shape.ReshapeLayer'>, {'shape': ([0], -1)}), (<class 'DFTUtilities.DFTLayer'>, {})],\n",
" loss=None, max_epochs=50, more_params={},\n",
" objective=<function objective at 0x7fe7a86471b8>,\n",
" objective_loss_function=<function dft_error at 0x7fe7a864a7d0>,\n",
" on_epoch_finished=[<nolearn.lasagne.handlers.PrintLog instance at 0x7fe7960cc050>],\n",
" on_training_finished=[],\n",
" on_training_started=[<nolearn.lasagne.handlers.PrintLayerInfo instance at 0x7fe7960cc098>],\n",
" regression=True,\n",
" train_split=<nolearn.lasagne.base.TrainSplit object at 0x7fe7a9571a10>,\n",
" update=<function nesterov_momentum at 0x7fe7a95d3398>,\n",
" update_learning_rate=0.01, update_momentum=0.975,\n",
" use_label_encoder=False, verbose=1,\n",
" y_tensor_type=TensorType(float32, matrix))"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ae.fit(X_in, X_dft)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from lasagne.layers import get_output\n",
"graph = get_output(ae.get_all_layers()[-1], X_in)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Reshape{2} [@A] '' \n",
" |dot [@B] '' \n",
" | |Reshape{2} [@C] '' \n",
" | | |Elemwise{add,no_inplace} [@D] '' \n",
" | | | |Subtensor{::, ::, int64:int64:} [@E] '' \n",
" | | | | |Subtensor{::, ::, int64, ::} [@F] '' \n",
" | | | | | |ConvOp{('imshp', (16, 1, 512)),('kshp', (1, 3)),('nkern', 1),('bsize', None),('dx', 1),('dy', 1),('out_mode', 'full'),('unroll_batch', None),('unroll_kern', None),('unroll_patch', True),('imshp_logical', (16, 1, 512)),('kshp_logical', (1, 3)),('kshp_logical_top_aligned', True)} [@G] '' \n",
" | | | | | | |DimShuffle{0,1,x,2} [@H] '' \n",
" | | | | | | | |Reshape{3} [@I] '' \n",
" | | | | | | | |Alloc [@J] '' \n",
" | | | | | | | | |DimShuffle{0,1,2,x} [@K] '' \n",
" | | | | | | | | | |Elemwise{mul,no_inplace} [@L] '' \n",
" | | | | | | | | | |DimShuffle{x,x,x} [@M] '' \n",
" | | | | | | | | | | |TensorConstant{0.5} [@N]\n",
" | | | | | | | | | |Elemwise{add,no_inplace} [@O] '' \n",
" | | | | | | | | | |Elemwise{add,no_inplace} [@P] '' \n",
" | | | | | | | | | | |Subtensor{::, ::, int64:int64:} [@Q] '' \n",
" | | | | | | | | | | | |Subtensor{::, ::, int64, ::} [@R] '' \n",
" | | | | | | | | | | | | |ConvOp{('imshp', (24, 1, 128)),('kshp', (1, 3)),('nkern', 16),('bsize', None),('dx', 1),('dy', 1),('out_mode', 'full'),('unroll_batch', None),('unroll_kern', None),('unroll_patch', True),('imshp_logical', (24, 1, 128)),('kshp_logical', (1, 3)),('kshp_logical_top_aligned', True)} [@S] '' \n",
" | | | | | | | | | | | | | |DimShuffle{0,1,x,2} [@T] '' \n",
" | | | | | | | | | | | | | | |Reshape{3} [@U] '' \n",
" | | | | | | | | | | | | | | |Alloc [@V] '' \n",
" | | | | | | | | | | | | | | | |DimShuffle{0,1,2,x} [@W] '' \n",
" | | | | | | | | | | | | | | | | |Elemwise{mul,no_inplace} [@X] '' \n",
" | | | | | | | | | | | | | | | | |DimShuffle{x,x,x} [@Y] '' \n",
" | | | | | | | | | | | | | | | | | |TensorConstant{0.5} [@Z]\n",
" | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@BA] '' \n",
" | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@BB] '' \n",
" | | | | | | | | | | | | | | | | | |Subtensor{::, ::, int64:int64:} [@BC] '' \n",
" | | | | | | | | | | | | | | | | | | |Subtensor{::, ::, int64, ::} [@BD] '' \n",
" | | | | | | | | | | | | | | | | | | | |ConvOp{('imshp', (32, 1, 64)),('kshp', (1, 7)),('nkern', 24),('bsize', None),('dx', 1),('dy', 1),('out_mode', 'full'),('unroll_batch', None),('unroll_kern', None),('unroll_patch', True),('imshp_logical', (32, 1, 64)),('kshp_logical', (1, 7)),('kshp_logical_top_aligned', True)} [@BE] '' \n",
" | | | | | | | | | | | | | | | | | | | | |DimShuffle{0,1,x,2} [@BF] '' \n",
" | | | | | | | | | | | | | | | | | | | | | |Reshape{3} [@BG] '' \n",
" | | | | | | | | | | | | | | | | | | | | | |Alloc [@BH] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{0,1,2,x} [@BI] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | |Reshape{3} [@BJ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{mul,no_inplace} [@BK] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{x,x} [@BL] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{0.5} [@BM]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@BN] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@BO] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | |dot [@BP] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{mul,no_inplace} [@BQ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{x,x} [@BR] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{0.5} [@BS]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@BT] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@BU] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | |dot [@BV] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{mul,no_inplace} [@BW] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{x,x} [@BX] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{0.5} [@BY]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@BZ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@CA] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |dot [@CB] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{mul,no_inplace} [@CC] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{x,x} [@CD] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{0.5} [@CE]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@CF] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@CG] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |dot [@CH] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Reshape{2} [@CI] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{::, ::, ::, int64} [@CJ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DownsampleFactorMax{ds=(2, 1), ignore_border=True, st=(2, 1), padding=(0, 0), mode='max'} [@CK] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{0,1,2,x} [@CL] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{mul,no_inplace} [@CM] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{x,x,x} [@CN] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{0.5} [@CO]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@CP] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@CQ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{::, ::, int64:int64:} [@CR] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{::, ::, int64, ::} [@CS] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |ConvOp{('imshp', (24, 1, 64)),('kshp', (1, 7)),('nkern', 32),('bsize', None),('dx', 1),('dy', 1),('out_mode', 'full'),('unroll_batch', None),('unroll_kern', None),('unroll_patch', True),('imshp_logical', (24, 1, 64)),('kshp_logical', (1, 7)),('kshp_logical_top_aligned', True)} [@CT] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{0,1,x,2} [@CU] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{::, ::, ::, int64} [@CV] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DownsampleFactorMax{ds=(2, 1), ignore_border=True, st=(2, 1), padding=(0, 0), mode='max'} [@CW] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{0,1,2,x} [@CX] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{mul,no_inplace} [@CY] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{x,x,x} [@CZ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{0.5} [@DA]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@DB] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@DC] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{::, ::, int64:int64:} [@DD] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{::, ::, int64, ::} [@DE] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |ConvOp{('imshp', (16, 1, 128)),('kshp', (1, 3)),('nkern', 24),('bsize', None),('dx', 1),('dy', 1),('out_mode', 'full'),('unroll_batch', None),('unroll_kern', None),('unroll_patch', True),('imshp_logical', (16, 1, 128)),('kshp_logical', (1, 3)),('kshp_logical_top_aligned', True)} [@DF] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{0,1,x,2} [@DG] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{::, ::, ::, int64} [@DH] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DownsampleFactorMax{ds=(4, 1), ignore_border=True, st=(4, 1), padding=(0, 0), mode='max'} [@DI] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{0,1,2,x} [@DJ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{mul,no_inplace} [@DK] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{x,x,x} [@DL] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{0.5} [@DM]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@DN] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@DO] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{::, ::, int64:int64:} [@DP] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{::, ::, int64, ::} [@DQ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |ConvOp{('imshp', (1, 1, 512)),('kshp', (1, 3)),('nkern', 16),('bsize', None),('dx', 1),('dy', 1),('out_mode', 'full'),('unroll_batch', None),('unroll_kern', None),('unroll_patch', True),('imshp_logical', (1, 1, 512)),('kshp_logical', (1, 3)),('kshp_logical_top_aligned', True)} [@DR] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{0,1,x,2} [@DS] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Reshape{3} [@DT] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{[[ 4.0866..7396e-04]]} [@DU]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |MakeVector{dtype='int64'} [@DV] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{int64} [@DW] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Shape [@DX] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{[[ 4.0866..7396e-04]]} [@DU]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Constant{0} [@DY]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{Cast{int64}} [@DZ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{1} [@EA]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{Cast{int64}} [@EB] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{-1} [@EC]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{0,1,x,2} [@ED] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |HostFromGpu [@EE] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |conv1d2.W [@EF]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Constant{0} [@EG]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Constant{1} [@EH]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |ScalarFromTensor [@EI] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@EJ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{int64} [@EK] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Shape [@EL] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Reshape{3} [@DT] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Constant{2} [@EM]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{1} [@EA]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{x,0,x} [@EN] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |HostFromGpu [@EO] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |conv1d2.b [@EP]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{abs_,no_inplace} [@EQ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@DO] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Constant{0} [@ER]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{0,1,x,2} [@ES] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |HostFromGpu [@ET] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |conv1d4.W [@EU]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Constant{0} [@EV]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Constant{1} [@EW]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |ScalarFromTensor [@EX] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@EY] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{int64} [@EZ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Shape [@FA] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{::, ::, ::, int64} [@DH] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Constant{2} [@FB]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{1} [@EA]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{x,0,x} [@FC] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |HostFromGpu [@FD] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |conv1d4.b [@FE]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{abs_,no_inplace} [@FF] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@DC] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Constant{0} [@FG]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{0,1,x,2} [@FH] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |HostFromGpu [@FI] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |conv1d6.W [@FJ]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Constant{0} [@FK]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Constant{3} [@FL]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |ScalarFromTensor [@FM] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@FN] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{int64} [@FO] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Shape [@FP] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{::, ::, ::, int64} [@CV] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Constant{2} [@FQ]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{3} [@FR]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{x,0,x} [@FS] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |HostFromGpu [@FT] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |conv1d6.b [@FU]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{abs_,no_inplace} [@FV] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@CQ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Constant{0} [@FW]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |MakeVector{dtype='int64'} [@FX] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{int64} [@FY] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Shape [@FZ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{::, ::, ::, int64} [@CJ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Constant{0} [@GA]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{Cast{int64}} [@GB] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{-1} [@EC]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |HostFromGpu [@GC] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |dense9.W [@GD]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{x,0} [@GE] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |HostFromGpu [@GF] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |dense9.b [@GG]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{abs_,no_inplace} [@GH] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@CG] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |HostFromGpu [@GI] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |encode.W [@GJ]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{x,0} [@GK] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |HostFromGpu [@GL] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |encode.b [@GM]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{abs_,no_inplace} [@GN] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@CA] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |HostFromGpu [@GO] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |dense11.W [@GP]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{x,0} [@GQ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | |HostFromGpu [@GR] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | | |dense11.b [@GS]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{abs_,no_inplace} [@GT] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@BU] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | |HostFromGpu [@GU] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | | |dense12.W [@GV]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | | |DimShuffle{x,0} [@GW] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | |HostFromGpu [@GX] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | |dense12.b [@GY]\n",
" | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{abs_,no_inplace} [@GZ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@BO] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | |MakeVector{dtype='int64'} [@HA] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | |Subtensor{int64} [@HB] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | |Shape [@HC] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{mul,no_inplace} [@BK] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | |Constant{0} [@HD]\n",
" | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{Cast{int64}} [@HE] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{32} [@HF]\n",
" | | | | | | | | | | | | | | | | | | | | | | | |Elemwise{Cast{int64}} [@HG] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{32} [@HH]\n",
" | | | | | | | | | | | | | | | | | | | | | | |Subtensor{int64} [@HI] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | |Shape [@HJ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | |Reshape{3} [@BJ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | |Constant{0} [@HK]\n",
" | | | | | | | | | | | | | | | | | | | | | | |Subtensor{int64} [@HL] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | |Shape [@HM] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | |Reshape{3} [@BJ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | |Constant{1} [@HN]\n",
" | | | | | | | | | | | | | | | | | | | | | | |Subtensor{int64} [@HO] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | |Shape [@HP] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | | |Reshape{3} [@BJ] '' \n",
" | | | | | | | | | | | | | | | | | | | | | | | |Constant{2} [@HQ]\n",
" | | | | | | | | | | | | | | | | | | | | | | |TensorConstant{2} [@HR]\n",
" | | | | | | | | | | | | | | | | | | | | | |MakeVector{dtype='int64'} [@HS] '' \n",
" | | | | | | | | | | | | | | | | | | | | | |Subtensor{int64} [@HI] '' \n",
" | | | | | | | | | | | | | | | | | | | | | |Subtensor{int64} [@HL] '' \n",
" | | | | | | | | | | | | | | | | | | | | | |Elemwise{mul,no_inplace} [@HT] '' \n",
" | | | | | | | | | | | | | | | | | | | | | |Subtensor{int64} [@HO] '' \n",
" | | | | | | | | | | | | | | | | | | | | | |TensorConstant{2} [@HR]\n",
" | | | | | | | | | | | | | | | | | | | | |DimShuffle{0,1,x,2} [@HU] '' \n",
" | | | | | | | | | | | | | | | | | | | | |HostFromGpu [@HV] '' \n",
" | | | | | | | | | | | | | | | | | | | | |conv1d15.W [@HW]\n",
" | | | | | | | | | | | | | | | | | | | |Constant{0} [@HX]\n",
" | | | | | | | | | | | | | | | | | | |Constant{3} [@HY]\n",
" | | | | | | | | | | | | | | | | | | |ScalarFromTensor [@HZ] '' \n",
" | | | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@IA] '' \n",
" | | | | | | | | | | | | | | | | | | |Subtensor{int64} [@IB] '' \n",
" | | | | | | | | | | | | | | | | | | | |Shape [@IC] '' \n",
" | | | | | | | | | | | | | | | | | | | | |Reshape{3} [@BG] '' \n",
" | | | | | | | | | | | | | | | | | | | |Constant{2} [@ID]\n",
" | | | | | | | | | | | | | | | | | | |TensorConstant{3} [@FR]\n",
" | | | | | | | | | | | | | | | | | |DimShuffle{x,0,x} [@IE] '' \n",
" | | | | | | | | | | | | | | | | | |HostFromGpu [@IF] '' \n",
" | | | | | | | | | | | | | | | | | |conv1d15.b [@IG]\n",
" | | | | | | | | | | | | | | | | |Elemwise{abs_,no_inplace} [@IH] '' \n",
" | | | | | | | | | | | | | | | | |Elemwise{add,no_inplace} [@BB] '' \n",
" | | | | | | | | | | | | | | | |Subtensor{int64} [@II] '' \n",
" | | | | | | | | | | | | | | | | |Shape [@IJ] '' \n",
" | | | | | | | | | | | | | | | | | |Elemwise{mul,no_inplace} [@X] '' \n",
" | | | | | | | | | | | | | | | | |Constant{0} [@IK]\n",
" | | | | | | | | | | | | | | | |Subtensor{int64} [@IL] '' \n",
" | | | | | | | | | | | | | | | | |Shape [@IM] '' \n",
" | | | | | | | | | | | | | | | | | |Elemwise{mul,no_inplace} [@X] '' \n",
" | | | | | | | | | | | | | | | | |Constant{1} [@IN]\n",
" | | | | | | | | | | | | | | | |Subtensor{int64} [@IO] '' \n",
" | | | | | | | | | | | | | | | | |Shape [@IP] '' \n",
" | | | | | | | | | | | | | | | | | |Elemwise{mul,no_inplace} [@X] '' \n",
" | | | | | | | | | | | | | | | | |Constant{2} [@IQ]\n",
" | | | | | | | | | | | | | | | |TensorConstant{2} [@HR]\n",
" | | | | | | | | | | | | | | |MakeVector{dtype='int64'} [@IR] '' \n",
" | | | | | | | | | | | | | | |Subtensor{int64} [@II] '' \n",
" | | | | | | | | | | | | | | |Subtensor{int64} [@IL] '' \n",
" | | | | | | | | | | | | | | |Elemwise{mul,no_inplace} [@IS] '' \n",
" | | | | | | | | | | | | | | |Subtensor{int64} [@IO] '' \n",
" | | | | | | | | | | | | | | |TensorConstant{2} [@HR]\n",
" | | | | | | | | | | | | | |DimShuffle{0,1,x,2} [@IT] '' \n",
" | | | | | | | | | | | | | |HostFromGpu [@IU] '' \n",
" | | | | | | | | | | | | | |conv1d17.W [@IV]\n",
" | | | | | | | | | | | | |Constant{0} [@IW]\n",
" | | | | | | | | | | | |Constant{1} [@IX]\n",
" | | | | | | | | | | | |ScalarFromTensor [@IY] '' \n",
" | | | | | | | | | | | |Elemwise{add,no_inplace} [@IZ] '' \n",
" | | | | | | | | | | | |Subtensor{int64} [@JA] '' \n",
" | | | | | | | | | | | | |Shape [@JB] '' \n",
" | | | | | | | | | | | | | |Reshape{3} [@U] '' \n",
" | | | | | | | | | | | | |Constant{2} [@JC]\n",
" | | | | | | | | | | | |TensorConstant{1} [@EA]\n",
" | | | | | | | | | | |DimShuffle{x,0,x} [@JD] '' \n",
" | | | | | | | | | | |HostFromGpu [@JE] '' \n",
" | | | | | | | | | | |conv1d17.b [@JF]\n",
" | | | | | | | | | |Elemwise{abs_,no_inplace} [@JG] '' \n",
" | | | | | | | | | |Elemwise{add,no_inplace} [@P] '' \n",
" | | | | | | | | |Subtensor{int64} [@JH] '' \n",
" | | | | | | | | | |Shape [@JI] '' \n",
" | | | | | | | | | | |Elemwise{mul,no_inplace} [@L] '' \n",
" | | | | | | | | | |Constant{0} [@JJ]\n",
" | | | | | | | | |Subtensor{int64} [@JK] '' \n",
" | | | | | | | | | |Shape [@JL] '' \n",
" | | | | | | | | | | |Elemwise{mul,no_inplace} [@L] '' \n",
" | | | | | | | | | |Constant{1} [@JM]\n",
" | | | | | | | | |Subtensor{int64} [@JN] '' \n",
" | | | | | | | | | |Shape [@JO] '' \n",
" | | | | | | | | | | |Elemwise{mul,no_inplace} [@L] '' \n",
" | | | | | | | | | |Constant{2} [@JP]\n",
" | | | | | | | | |TensorConstant{4} [@JQ]\n",
" | | | | | | | |MakeVector{dtype='int64'} [@JR] '' \n",
" | | | | | | | |Subtensor{int64} [@JH] '' \n",
" | | | | | | | |Subtensor{int64} [@JK] '' \n",
" | | | | | | | |Elemwise{mul,no_inplace} [@JS] '' \n",
" | | | | | | | |Subtensor{int64} [@JN] '' \n",
" | | | | | | | |TensorConstant{4} [@JQ]\n",
" | | | | | | |DimShuffle{0,1,x,2} [@JT] '' \n",
" | | | | | | |HostFromGpu [@JU] '' \n",
" | | | | | | |conv1d19.W [@JV]\n",
" | | | | | |Constant{0} [@JW]\n",
" | | | | |Constant{1} [@JX]\n",
" | | | | |ScalarFromTensor [@JY] '' \n",
" | | | | |Elemwise{add,no_inplace} [@JZ] '' \n",
" | | | | |Subtensor{int64} [@KA] '' \n",
" | | | | | |Shape [@KB] '' \n",
" | | | | | | |Reshape{3} [@I] '' \n",
" | | | | | |Constant{2} [@KC]\n",
" | | | | |TensorConstant{1} [@EA]\n",
" | | | |DimShuffle{x,0,x} [@KD] '' \n",
" | | | |HostFromGpu [@KE] '' \n",
" | | | |conv1d19.b [@KF]\n",
" | | |MakeVector{dtype='int64'} [@KG] '' \n",
" | | |Subtensor{int64} [@KH] '' \n",
" | | | |Shape [@KI] '' \n",
" | | | | |Elemwise{add,no_inplace} [@D] '' \n",
" | | | |Constant{0} [@KJ]\n",
" | | |Elemwise{Cast{int64}} [@KK] '' \n",
" | | |TensorConstant{-1} [@EC]\n",
" | |HostFromGpu [@KL] '' \n",
" | |dft21.W [@KM]\n",
" |TensorConstant{[ -1 514]} [@KN]\n"
]
}
],
"source": [
"from theano.printing import debugprint\n",
"debugprint(graph)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"summary = \"{}_{}x{}p{}_{}x{}p{}_{}x{}p{}_{}_{}_p{}\".format(\n",
" args.window_size,\n",
" args.num_filters_0, args.filter_size_0, args.pool_size_0,\n",
" args.num_filters_1, args.filter_size_1, args.pool_size_1,\n",
" args.num_filters_2, args.filter_size_2, args.pool_size_2,\n",
" args.fc1_size,\n",
" args.encode_size,\n",
" 'avg' if args.pool_mode == 'average_exc_pad' else 'max')\n",
"print 'Saving ', summary"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"!mkdir -p results/loss\n",
"plot_loss(ae)\n",
"plt.savefig('results/loss/{}.png'.format(summary))\n",
"plt.close()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"X_pred = ae.predict(X_in[0:1000])\n",
"figs, axes = plt.subplots(3, 1, figsize=(30, 15))\n",
"axes[0].plot(X_in[40448:40960])\n",
"axes[0].plot(X_pred.flatten()[40448:40960])\n",
"axes[1].plot(X_in[20000:30000])\n",
"axes[2].plot(X_pred.flatten()[20000:30000])\n",
"plt.savefig('results/reconstruct/{}.png'.format(summary))\n",
"plt.close()\n",
"!mkdir -p results/reconstruct\n",
"plt.savefig('results/reconstruct/{}.png'.format(summary))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"!mkdir -p results/nets\n",
"with gzip.open('results/nets/{}.pkl.gz'.format(summary), 'w') as f:\n",
" pickle.dump(ae, f)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"IPython.display.Audio(data=X_pred.flatten(), rate=sr)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"IPython.display.Audio(data=X_in[0:1000].flatten(), rate=sr)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"## we find the encode layer from our ae, and use it to define an encoding function\n",
"def get_layer_by_name(net, name):\n",
" for i, layer in enumerate(net.get_all_layers()):\n",
" if layer.name == name:\n",
" return layer, i\n",
" return None, None\n",
"encode_layer, encode_layer_index = get_layer_by_name(ae, 'encode')\n",
"\n",
"def encode_input(encode_layer, X):\n",
" return get_output(encode_layer, inputs=X).eval()\n",
"\n",
"X_encoded = encode_input(encode_layer, X_in[0:1000])\n",
"# X_encoded = encode_input(encode_layer, X_in)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"!ipython nbconvert --to python ./Audio\\ Autoencoder.ipynb"
]
}
],
"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.6"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
import theano
import theano.tensor as T
from lasagne import init
from lasagne import nonlinearities
from lasagne.utils import as_tuple
from lasagne.layers.base import Layer, MergeLayer
import numpy as np
# from scipy.linalg.dft, this method prepares a matrix of complex numbers that computes the dft
def dft(n, scale=None):
if scale not in [None, 'sqrtn', 'n']:
raise ValueError("scale must be None, 'sqrtn', or 'n'; "
"%r is not valid." % (scale,))
omegas = np.exp(-2j * np.pi * np.arange(n) / n).reshape(-1, 1)
m = omegas ** np.arange(n)
if scale == 'sqrtn':
m /= math.sqrt(n)
elif scale == 'n':
m /= n
return m
# this computes the real half of the dft using only real numbers
def hdft(n, scale=None):
half = dft(n, scale)[:n//2+1]
return np.vstack([np.real(half), np.imag(half)]).astype(np.float32)
class DFTLayer(Layer):
def __init__(self, incoming, **kwargs):
super(DFTLayer, self).__init__(incoming, **kwargs)
n = incoming.output_shape[-1]
dft_matrix = hdft(n).transpose()
self.num_units = dft_matrix.shape[1]
self.W = self.add_param(dft_matrix, dft_matrix.shape, name="W")
self.params[self.W].remove("trainable")
def get_output_shape_for(self, input_shape):
return (input_shape[0], self.num_units)
def get_output_for(self, input, **kwargs):
activation = T.dot(input, self.W)
return activation.reshape((-1, self.num_units))
def real(x):
mid = x.shape[1]//2
return x[:,:mid]
def imag(x):
mid = x.shape[1]//2
return x[:,mid:]
# input a and b are in format [r0, r1, r2.. rn, i0, i1, i2... in]
def dft_error(a, b):
ra = real(a)
rb = real(b)
ia = imag(a)
ib = imag(b)
realdiff = ra - rb
imagdiff = ia - ib
rmsdiff = realdiff**2 + imagdiff**2
amag = T.sqrt(ra**2 + ia**2)
bmag = T.sqrt(rb**2 + ib**2)
magdiff = (amag - bmag)**2
n = rmsdiff.shape[1]
weights = (T.cast(1., 'float32') + theano.tensor.arange(n)) / T.cast(1. + n, 'float32') # linspace (0, 1)
return T.stack([rmsdiff * (1. - weights), magdiff * weights]).dimshuffle(2,1,3,).flatten(2)
from lasagne.layers import get_output, InputLayer
def dft_batch(x):
input_layer = InputLayer((None, 1, x.shape[1]))
dft_layer = DFTLayer(input_layer)
return get_output(dft_layer, x).eval()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment