Files
hands-on/14_recurrent_neural_networks.ipynb
2016-09-27 23:31:21 +02:00

2011 lines
309 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Chapter 14 Recurrent Neural Networks**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"_This notebook contains all the sample code and solutions to the exercices in chapter 14._"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Setup"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, let's make sure this notebook works well in both python 2 and 3, import a few common modules, ensure MatplotLib plots figures inline and prepare a function to save the figures:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# To support both python 2 and python 3\n",
"from __future__ import division, print_function, unicode_literals\n",
"\n",
"# Common imports\n",
"import numpy as np\n",
"import numpy.random as rnd\n",
"import os\n",
"\n",
"# to make this notebook's output stable across runs\n",
"rnd.seed(42)\n",
"\n",
"# To plot pretty figures\n",
"%matplotlib inline\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"plt.rcParams['axes.labelsize'] = 14\n",
"plt.rcParams['xtick.labelsize'] = 12\n",
"plt.rcParams['ytick.labelsize'] = 12\n",
"\n",
"# Where to save the figures\n",
"PROJECT_ROOT_DIR = \".\"\n",
"CHAPTER_ID = \"rnn\"\n",
"\n",
"def save_fig(fig_id, tight_layout=True):\n",
" path = os.path.join(PROJECT_ROOT_DIR, \"images\", CHAPTER_ID, fig_id + \".png\")\n",
" print(\"Saving figure\", fig_id)\n",
" if tight_layout:\n",
" plt.tight_layout()\n",
" plt.savefig(path, format='png', dpi=300)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then of course we will need TensorFlow:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import tensorflow as tf"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Basic RNNs"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Manual RNN"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"tf.reset_default_graph()\n",
"\n",
"n_inputs = 3\n",
"n_neurons = 5\n",
"\n",
"X0 = tf.placeholder(tf.float32, [None, n_inputs])\n",
"X1 = tf.placeholder(tf.float32, [None, n_inputs])\n",
"\n",
"Wx = tf.Variable(tf.random_normal(shape=[n_inputs, n_neurons], dtype=tf.float32))\n",
"Wy = tf.Variable(tf.random_normal(shape=[n_neurons, n_neurons], dtype=tf.float32))\n",
"b = tf.Variable(tf.zeros([1, n_neurons], dtype=tf.float32))\n",
"\n",
"Y0 = tf.tanh(tf.matmul(X0, Wx) + b)\n",
"Y1 = tf.tanh(tf.matmul(Y0, Wy) + tf.matmul(X1, Wx) + b)\n",
"\n",
"init = tf.initialize_all_variables()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"X0_batch = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 0, 1]]) # t = 0\n",
"X1_batch = np.array([[9, 8, 7], [0, 0, 0], [6, 5, 4], [3, 2, 1]]) # t = 1\n",
"\n",
"with tf.Session() as sess:\n",
" init.run()\n",
" Y0_val, Y1_val = sess.run([Y0, Y1], feed_dict={X0: X0_batch, X1: X1_batch})"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 0.99715191 -0.96573043 0.48263517 0.75103307 0.63005513]\n",
" [ 0.72274023 -0.99146956 -0.2785553 0.99997073 -0.09475061]\n",
" [-0.89563441 -0.99789727 -0.80001158 1. -0.7313292 ]\n",
" [-1. 1. 0.499874 0.99996275 -1. ]]\n"
]
}
],
"source": [
"print(Y0_val)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[-0.99999994 -0.30562368 -0.99982792 1. -0.99349439]\n",
" [ 0.97062987 -0.23609701 -0.92210275 0.48410925 -0.56634736]\n",
" [-1. 0.93040472 -0.87783211 0.99999487 -0.99165547]\n",
" [-0.99999988 0.99961126 0.94231671 -0.27352917 -0.9958083 ]]\n"
]
}
],
"source": [
"print(Y1_val)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Using `rnn()`"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"tf.reset_default_graph()\n",
"\n",
"n_inputs = 3\n",
"n_neurons = 5\n",
"\n",
"X0 = tf.placeholder(tf.float32, [None, n_inputs])\n",
"X1 = tf.placeholder(tf.float32, [None, n_inputs])\n",
"\n",
"basic_cell = tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons)\n",
"output_seqs, states = tf.nn.rnn(basic_cell, [X0, X1], dtype=tf.float32)\n",
"Y0, Y1 = output_seqs\n",
"\n",
"init = tf.initialize_all_variables()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"X0_batch = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 0, 1]])\n",
"X1_batch = np.array([[9, 8, 7], [0, 0, 0], [6, 5, 4], [3, 2, 1]])\n",
"\n",
"with tf.Session() as sess:\n",
" init.run()\n",
" Y0_val, Y1_val = sess.run([Y0, Y1], feed_dict={X0: X0_batch, X1: X1_batch})"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[-0.6512959 , 0.89083946, -0.85044301, 0.323282 , -0.8783927 ],\n",
" [-0.45838216, 0.99845564, -0.99198878, -0.54369295, -0.99836361],\n",
" [-0.20981368, 0.99997938, -0.99959975, -0.91445529, -0.99997944],\n",
" [ 0.99947661, -0.91491669, 0.80572295, -0.99604207, 0.81913596]], dtype=float32)"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Y0_val"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.76672292, 0.99991781, -0.9992581 , -0.99868894, -0.99994487],\n",
" [-0.79488361, 0.53733993, -0.80716753, -0.56864417, 0.08659729],\n",
" [ 0.13486399, 0.99889988, -0.99441969, -0.99375516, -0.9938038 ],\n",
" [ 0.88772398, 0.83640993, 0.25747493, -0.68455571, -0.60166305]], dtype=float32)"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"Y1_val"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from IPython.display import clear_output, Image, display, HTML\n",
"\n",
"def strip_consts(graph_def, max_const_size=32):\n",
" \"\"\"Strip large constant values from graph_def.\"\"\"\n",
" strip_def = tf.GraphDef()\n",
" for n0 in graph_def.node:\n",
" n = strip_def.node.add() \n",
" n.MergeFrom(n0)\n",
" if n.op == 'Const':\n",
" tensor = n.attr['value'].tensor\n",
" size = len(tensor.tensor_content)\n",
" if size > max_const_size:\n",
" tensor.tensor_content = \"b<stripped %d bytes>\"%size\n",
" return strip_def\n",
"\n",
"def show_graph(graph_def, max_const_size=32):\n",
" \"\"\"Visualize TensorFlow graph.\"\"\"\n",
" if hasattr(graph_def, 'as_graph_def'):\n",
" graph_def = graph_def.as_graph_def()\n",
" strip_def = strip_consts(graph_def, max_const_size=max_const_size)\n",
" code = \"\"\"\n",
" <script>\n",
" function load() {{\n",
" document.getElementById(\"{id}\").pbtxt = {data};\n",
" }}\n",
" </script>\n",
" <link rel=\"import\" href=\"https://tensorboard.appspot.com/tf-graph-basic.build.html\" onload=load()>\n",
" <div style=\"height:600px\">\n",
" <tf-graph-basic id=\"{id}\"></tf-graph-basic>\n",
" </div>\n",
" \"\"\".format(data=repr(str(strip_def)), id='graph'+str(np.random.rand()))\n",
"\n",
" iframe = \"\"\"\n",
" <iframe seamless style=\"width:1200px;height:620px;border:0\" srcdoc=\"{}\"></iframe>\n",
" \"\"\".format(code.replace('\"', '&quot;'))\n",
" display(HTML(iframe))"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <iframe seamless style=\"width:1200px;height:620px;border:0\" srcdoc=\"\n",
" <script>\n",
" function load() {\n",
" document.getElementById(&quot;graph0.3745401188473625&quot;).pbtxt = 'node {\\n name: &quot;Placeholder&quot;\\n op: &quot;Placeholder&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;shape&quot;\\n value {\\n shape {\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;Placeholder_1&quot;\\n op: &quot;Placeholder&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;shape&quot;\\n value {\\n shape {\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/Shape&quot;\\n op: &quot;Shape&quot;\\n input: &quot;Placeholder&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice/pack&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 0\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice/pack_1&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice/pack_2&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice&quot;\\n op: &quot;StridedSlice&quot;\\n input: &quot;RNN/Shape&quot;\\n input: &quot;RNN/strided_slice/pack&quot;\\n input: &quot;RNN/strided_slice/pack_1&quot;\\n input: &quot;RNN/strided_slice/pack_2&quot;\\n attr {\\n key: &quot;Index&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;begin_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;ellipsis_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;end_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;new_axis_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;shrink_axis_mask&quot;\\n value {\\n i: 1\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/pack/1&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n }\\n int_val: 5\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/pack&quot;\\n op: &quot;Pack&quot;\\n input: &quot;RNN/strided_slice&quot;\\n input: &quot;RNN/pack/1&quot;\\n attr {\\n key: &quot;N&quot;\\n value {\\n i: 2\\n }\\n }\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;axis&quot;\\n value {\\n i: 0\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/zeros/Const&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/zeros&quot;\\n op: &quot;Fill&quot;\\n input: &quot;RNN/pack&quot;\\n input: &quot;RNN/zeros/Const&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix&quot;\\n op: &quot;Variable&quot;\\n attr {\\n key: &quot;container&quot;\\n value {\\n s: &quot;&quot;\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;shape&quot;\\n value {\\n shape {\\n dim {\\n size: 8\\n }\\n dim {\\n size: 5\\n }\\n }\\n }\\n }\\n attr {\\n key: &quot;shared_name&quot;\\n value {\\n s: &quot;&quot;\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/shape&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Matrix&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 2\\n }\\n }\\n tensor_content: &quot;\\\\010\\\\000\\\\000\\\\000\\\\005\\\\000\\\\000\\\\000&quot;\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/min&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Matrix&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: -0.6123724579811096\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/max&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Matrix&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.6123724579811096\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/RandomUniform&quot;\\n op: &quot;RandomUniform&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/shape&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Matrix&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;seed&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;seed2&quot;\\n value {\\n i: 0\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/sub&quot;\\n op: &quot;Sub&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/max&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/min&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Matrix&quot;\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/mul&quot;\\n op: &quot;Mul&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/RandomUniform&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/sub&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Matrix&quot;\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform&quot;\\n op: &quot;Add&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/mul&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/min&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Matrix&quot;\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/Assign&quot;\\n op: &quot;Assign&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Matrix&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;use_locking&quot;\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: &quot;validate_shape&quot;\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/read&quot;\\n op: &quot;Identity&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/concat/concat_dim&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/concat&quot;\\n op: &quot;Concat&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/concat/concat_dim&quot;\\n input: &quot;Placeholder&quot;\\n input: &quot;RNN/zeros&quot;\\n attr {\\n key: &quot;N&quot;\\n value {\\n i: 2\\n }\\n }\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/MatMul&quot;\\n op: &quot;MatMul&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/concat&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/read&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;transpose_a&quot;\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: &quot;transpose_b&quot;\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Bias&quot;\\n op: &quot;Variable&quot;\\n attr {\\n key: &quot;container&quot;\\n value {\\n s: &quot;&quot;\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;shape&quot;\\n value {\\n shape {\\n dim {\\n size: 5\\n }\\n }\\n }\\n }\\n attr {\\n key: &quot;shared_name&quot;\\n value {\\n s: &quot;&quot;\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Bias/Initializer/Const&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Bias&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n dim {\\n size: 5\\n }\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Bias/Assign&quot;\\n op: &quot;Assign&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Bias&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Bias/Initializer/Const&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Bias&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;use_locking&quot;\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: &quot;validate_shape&quot;\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Bias/read&quot;\\n op: &quot;Identity&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Bias&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/add&quot;\\n op: &quot;Add&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/MatMul&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Bias/read&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Tanh&quot;\\n op: &quot;Tanh&quot;\\n input: &quot;RNN/BasicRNNCell/add&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell_1/Linear/concat/concat_dim&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell_1/Linear/concat&quot;\\n op: &quot;Concat&quot;\\n input: &quot;RNN/BasicRNNCell_1/Linear/concat/concat_dim&quot;\\n input: &quot;Placeholder_1&quot;\\n input: &quot;RNN/BasicRNNCell/Tanh&quot;\\n attr {\\n key: &quot;N&quot;\\n value {\\n i: 2\\n }\\n }\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell_1/Linear/MatMul&quot;\\n op: &quot;MatMul&quot;\\n input: &quot;RNN/BasicRNNCell_1/Linear/concat&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/read&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;transpose_a&quot;\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: &quot;transpose_b&quot;\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell_1/add&quot;\\n op: &quot;Add&quot;\\n input: &quot;RNN/BasicRNNCell_1/Linear/MatMul&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Bias/read&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell_1/Tanh&quot;\\n op: &quot;Tanh&quot;\\n input: &quot;RNN/BasicRNNCell_1/add&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;init&quot;\\n op: &quot;NoOp&quot;\\n input: &quot;^RNN/BasicRNNCell/Linear/Matrix/Assign&quot;\\n input: &quot;^RNN/BasicRNNCell/Linear/Bias/Assign&quot;\\n}\\n';\n",
" }\n",
" </script>\n",
" <link rel=&quot;import&quot; href=&quot;https://tensorboard.appspot.com/tf-graph-basic.build.html&quot; onload=load()>\n",
" <div style=&quot;height:600px&quot;>\n",
" <tf-graph-basic id=&quot;graph0.3745401188473625&quot;></tf-graph-basic>\n",
" </div>\n",
" \"></iframe>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"show_graph(tf.get_default_graph())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Packing sequences"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"tf.reset_default_graph()\n",
"\n",
"n_steps = 2\n",
"n_inputs = 3\n",
"n_neurons = 5\n",
"\n",
"X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])\n",
"X_seqs = tf.unpack(tf.transpose(X, perm=[1, 0, 2]))\n",
"\n",
"basic_cell = tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons)\n",
"output_seqs, states = tf.nn.rnn(basic_cell, X_seqs, dtype=tf.float32)\n",
"outputs = tf.transpose(tf.pack(output_seqs), perm=[1, 0, 2])\n",
"\n",
"init = tf.initialize_all_variables()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"X_batch = np.array([\n",
" # t = 0 t = 1 \n",
" [[0, 1, 2], [9, 8, 7]], # instance 1\n",
" [[3, 4, 5], [0, 0, 0]], # instance 2\n",
" [[6, 7, 8], [6, 5, 4]], # instance 3\n",
" [[9, 0, 1], [3, 2, 1]], # instance 4\n",
" ])\n",
"\n",
"with tf.Session() as sess:\n",
" init.run()\n",
" outputs_val = outputs.eval(feed_dict={X: X_batch})"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[-0.97331583 1. 1. 0.97554523 -0.98747736]\n",
" [-0.82908219 -0.52926612 0.32085186 -0.54714954 0.79990309]\n",
" [-0.98323536 0.99997234 0.99994755 0.56912678 -0.41493124]\n",
" [-0.4494451 0.91924781 0.99745786 0.24391253 0.39466459]]\n"
]
}
],
"source": [
"print(np.transpose(outputs_val, axes=[1, 0, 2])[1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Using `dynamic_rnn()`"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"tf.reset_default_graph()\n",
"\n",
"n_steps = 2\n",
"n_inputs = 3\n",
"n_neurons = 5\n",
"\n",
"X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])\n",
"\n",
"basic_cell = tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons)\n",
"outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)\n",
"\n",
"init = tf.initialize_all_variables()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"outputs = [[[-0.23382208 0.76683432 0.93643713 -0.80472916 -0.60019767]\n",
" [-0.99351406 0.99999964 0.99759728 -0.98060888 0.76075202]]\n",
"\n",
" [[-0.88139206 0.99887061 0.99753082 -0.981947 -0.64462322]\n",
" [ 0.29748455 0.72552329 0.09691043 0.03584142 0.32892999]]\n",
"\n",
" [[-0.98728108 0.99999523 0.99990696 -0.99846756 -0.68508393]\n",
" [-0.94087839 0.99995995 0.92983443 -0.8774581 0.71102041]]\n",
"\n",
" [[-0.99994767 0.99989921 -0.99988997 0.99813324 0.99946588]\n",
" [-0.96028382 0.98852354 -0.18959917 -0.63675886 -0.86672658]]]\n"
]
}
],
"source": [
"X_batch = np.array([\n",
" [[0, 1, 2], [9, 8, 7]], # instance 1\n",
" [[3, 4, 5], [0, 0, 0]], # instance 2\n",
" [[6, 7, 8], [6, 5, 4]], # instance 3\n",
" [[9, 0, 1], [3, 2, 1]], # instance 4\n",
" ])\n",
"\n",
"with tf.Session() as sess:\n",
" init.run()\n",
" print(\"outputs =\", outputs.eval(feed_dict={X: X_batch}))"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <iframe seamless style=\"width:1200px;height:620px;border:0\" srcdoc=\"\n",
" <script>\n",
" function load() {\n",
" document.getElementById(&quot;graph0.9507143064099162&quot;).pbtxt = 'node {\\n name: &quot;Placeholder&quot;\\n op: &quot;Placeholder&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;shape&quot;\\n value {\\n shape {\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;transpose/perm&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 3\\n }\\n }\\n tensor_content: &quot;\\\\001\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\\\\002\\\\000\\\\000\\\\000&quot;\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;transpose&quot;\\n op: &quot;Transpose&quot;\\n input: &quot;Placeholder&quot;\\n input: &quot;transpose/perm&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/Shape&quot;\\n op: &quot;Shape&quot;\\n input: &quot;transpose&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice/pack&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice/pack_1&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 2\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice/pack_2&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice&quot;\\n op: &quot;StridedSlice&quot;\\n input: &quot;RNN/Shape&quot;\\n input: &quot;RNN/strided_slice/pack&quot;\\n input: &quot;RNN/strided_slice/pack_1&quot;\\n input: &quot;RNN/strided_slice/pack_2&quot;\\n attr {\\n key: &quot;Index&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;begin_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;ellipsis_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;end_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;new_axis_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;shrink_axis_mask&quot;\\n value {\\n i: 1\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice_1/pack&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice_1/pack_1&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 2\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice_1/pack_2&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice_1&quot;\\n op: &quot;StridedSlice&quot;\\n input: &quot;RNN/Shape&quot;\\n input: &quot;RNN/strided_slice_1/pack&quot;\\n input: &quot;RNN/strided_slice_1/pack_1&quot;\\n input: &quot;RNN/strided_slice_1/pack_2&quot;\\n attr {\\n key: &quot;Index&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;begin_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;ellipsis_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;end_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;new_axis_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;shrink_axis_mask&quot;\\n value {\\n i: 1\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/pack/1&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n }\\n int_val: 5\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/pack&quot;\\n op: &quot;Pack&quot;\\n input: &quot;RNN/strided_slice&quot;\\n input: &quot;RNN/pack/1&quot;\\n attr {\\n key: &quot;N&quot;\\n value {\\n i: 2\\n }\\n }\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;axis&quot;\\n value {\\n i: 0\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/zeros/Const&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/zeros&quot;\\n op: &quot;Fill&quot;\\n input: &quot;RNN/pack&quot;\\n input: &quot;RNN/zeros/Const&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/Shape_1&quot;\\n op: &quot;Shape&quot;\\n input: &quot;transpose&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice_2/pack&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 0\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice_2/pack_1&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice_2/pack_2&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice_2&quot;\\n op: &quot;StridedSlice&quot;\\n input: &quot;RNN/Shape_1&quot;\\n input: &quot;RNN/strided_slice_2/pack&quot;\\n input: &quot;RNN/strided_slice_2/pack_1&quot;\\n input: &quot;RNN/strided_slice_2/pack_2&quot;\\n attr {\\n key: &quot;Index&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;begin_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;ellipsis_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;end_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;new_axis_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;shrink_axis_mask&quot;\\n value {\\n i: 1\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice_3/pack&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice_3/pack_1&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 2\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice_3/pack_2&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 1\\n }\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/strided_slice_3&quot;\\n op: &quot;StridedSlice&quot;\\n input: &quot;RNN/Shape_1&quot;\\n input: &quot;RNN/strided_slice_3/pack&quot;\\n input: &quot;RNN/strided_slice_3/pack_1&quot;\\n input: &quot;RNN/strided_slice_3/pack_2&quot;\\n attr {\\n key: &quot;Index&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;begin_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;ellipsis_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;end_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;new_axis_mask&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;shrink_axis_mask&quot;\\n value {\\n i: 1\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/pack_1/1&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n }\\n int_val: 5\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/pack_1&quot;\\n op: &quot;Pack&quot;\\n input: &quot;RNN/strided_slice_3&quot;\\n input: &quot;RNN/pack_1/1&quot;\\n attr {\\n key: &quot;N&quot;\\n value {\\n i: 2\\n }\\n }\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;axis&quot;\\n value {\\n i: 0\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/zeros_1/Const&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/zeros_1&quot;\\n op: &quot;Fill&quot;\\n input: &quot;RNN/pack_1&quot;\\n input: &quot;RNN/zeros_1/Const&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/time&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n }\\n int_val: 0\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/TensorArray&quot;\\n op: &quot;TensorArray&quot;\\n input: &quot;RNN/strided_slice_2&quot;\\n attr {\\n key: &quot;clear_after_read&quot;\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;dynamic_size&quot;\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: &quot;tensor_array_name&quot;\\n value {\\n s: &quot;RNN/dynamic_rnn/output_0&quot;\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/TensorArray/Const&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/TensorArray&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/TensorArray_1&quot;\\n op: &quot;TensorArray&quot;\\n input: &quot;RNN/strided_slice_2&quot;\\n attr {\\n key: &quot;clear_after_read&quot;\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;dynamic_size&quot;\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: &quot;tensor_array_name&quot;\\n value {\\n s: &quot;RNN/dynamic_rnn/input_0&quot;\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/TensorArray_1/Const&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/TensorArray_1&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/TensorArrayUnpack&quot;\\n op: &quot;TensorArrayUnpack&quot;\\n input: &quot;RNN/TensorArray_1&quot;\\n input: &quot;transpose&quot;\\n input: &quot;RNN/TensorArray_1/Const&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/TensorArray_1&quot;\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/TensorArray_2/Const&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/TensorArray_1&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/Enter&quot;\\n op: &quot;Enter&quot;\\n input: &quot;RNN/time&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;frame_name&quot;\\n value {\\n s: &quot;RNN/while/RNN/while/&quot;\\n }\\n }\\n attr {\\n key: &quot;is_constant&quot;\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: &quot;parallel_iterations&quot;\\n value {\\n i: 32\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/Enter_1&quot;\\n op: &quot;Enter&quot;\\n input: &quot;RNN/TensorArray/Const&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;frame_name&quot;\\n value {\\n s: &quot;RNN/while/RNN/while/&quot;\\n }\\n }\\n attr {\\n key: &quot;is_constant&quot;\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: &quot;parallel_iterations&quot;\\n value {\\n i: 32\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/Enter_2&quot;\\n op: &quot;Enter&quot;\\n input: &quot;RNN/zeros&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;frame_name&quot;\\n value {\\n s: &quot;RNN/while/RNN/while/&quot;\\n }\\n }\\n attr {\\n key: &quot;is_constant&quot;\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: &quot;parallel_iterations&quot;\\n value {\\n i: 32\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/Merge&quot;\\n op: &quot;Merge&quot;\\n input: &quot;RNN/while/Enter&quot;\\n input: &quot;RNN/while/NextIteration&quot;\\n attr {\\n key: &quot;N&quot;\\n value {\\n i: 2\\n }\\n }\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/Merge_1&quot;\\n op: &quot;Merge&quot;\\n input: &quot;RNN/while/Enter_1&quot;\\n input: &quot;RNN/while/NextIteration_1&quot;\\n attr {\\n key: &quot;N&quot;\\n value {\\n i: 2\\n }\\n }\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/Merge_2&quot;\\n op: &quot;Merge&quot;\\n input: &quot;RNN/while/Enter_2&quot;\\n input: &quot;RNN/while/NextIteration_2&quot;\\n attr {\\n key: &quot;N&quot;\\n value {\\n i: 2\\n }\\n }\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/Less/Enter&quot;\\n op: &quot;Enter&quot;\\n input: &quot;RNN/strided_slice_2&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;frame_name&quot;\\n value {\\n s: &quot;RNN/while/RNN/while/&quot;\\n }\\n }\\n attr {\\n key: &quot;is_constant&quot;\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: &quot;parallel_iterations&quot;\\n value {\\n i: 32\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/Less&quot;\\n op: &quot;Less&quot;\\n input: &quot;RNN/while/Merge&quot;\\n input: &quot;RNN/while/Less/Enter&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/LoopCond&quot;\\n op: &quot;LoopCond&quot;\\n input: &quot;RNN/while/Less&quot;\\n}\\nnode {\\n name: &quot;RNN/while/Switch&quot;\\n op: &quot;Switch&quot;\\n input: &quot;RNN/while/Merge&quot;\\n input: &quot;RNN/while/LoopCond&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/while/Merge&quot;\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/Switch_1&quot;\\n op: &quot;Switch&quot;\\n input: &quot;RNN/while/Merge_1&quot;\\n input: &quot;RNN/while/LoopCond&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/while/Merge_1&quot;\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/Switch_2&quot;\\n op: &quot;Switch&quot;\\n input: &quot;RNN/while/Merge_2&quot;\\n input: &quot;RNN/while/LoopCond&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/while/Merge_2&quot;\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/Identity&quot;\\n op: &quot;Identity&quot;\\n input: &quot;RNN/while/Switch:1&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/Identity_1&quot;\\n op: &quot;Identity&quot;\\n input: &quot;RNN/while/Switch_1:1&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/Identity_2&quot;\\n op: &quot;Identity&quot;\\n input: &quot;RNN/while/Switch_2:1&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/TensorArrayRead/RefEnter&quot;\\n op: &quot;RefEnter&quot;\\n input: &quot;RNN/TensorArray_1&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/TensorArray_1&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;frame_name&quot;\\n value {\\n s: &quot;RNN/while/RNN/while/&quot;\\n }\\n }\\n attr {\\n key: &quot;is_constant&quot;\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: &quot;parallel_iterations&quot;\\n value {\\n i: 32\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/TensorArrayRead/Enter&quot;\\n op: &quot;Enter&quot;\\n input: &quot;RNN/TensorArrayUnpack&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/TensorArray_1&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;frame_name&quot;\\n value {\\n s: &quot;RNN/while/RNN/while/&quot;\\n }\\n }\\n attr {\\n key: &quot;is_constant&quot;\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: &quot;parallel_iterations&quot;\\n value {\\n i: 32\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/TensorArrayRead&quot;\\n op: &quot;TensorArrayRead&quot;\\n input: &quot;RNN/while/TensorArrayRead/RefEnter&quot;\\n input: &quot;RNN/while/Identity&quot;\\n input: &quot;RNN/while/TensorArrayRead/Enter&quot;\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/TensorArray_1&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix&quot;\\n op: &quot;Variable&quot;\\n attr {\\n key: &quot;container&quot;\\n value {\\n s: &quot;&quot;\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;shape&quot;\\n value {\\n shape {\\n dim {\\n size: 8\\n }\\n dim {\\n size: 5\\n }\\n }\\n }\\n }\\n attr {\\n key: &quot;shared_name&quot;\\n value {\\n s: &quot;&quot;\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/shape&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Matrix&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 2\\n }\\n }\\n tensor_content: &quot;\\\\010\\\\000\\\\000\\\\000\\\\005\\\\000\\\\000\\\\000&quot;\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/min&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Matrix&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: -0.6123724579811096\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/max&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Matrix&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.6123724579811096\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/RandomUniform&quot;\\n op: &quot;RandomUniform&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/shape&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Matrix&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;seed&quot;\\n value {\\n i: 0\\n }\\n }\\n attr {\\n key: &quot;seed2&quot;\\n value {\\n i: 0\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/sub&quot;\\n op: &quot;Sub&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/max&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/min&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Matrix&quot;\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/mul&quot;\\n op: &quot;Mul&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/RandomUniform&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/sub&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Matrix&quot;\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform&quot;\\n op: &quot;Add&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/mul&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform/min&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Matrix&quot;\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/Assign&quot;\\n op: &quot;Assign&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/Initializer/random_uniform&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Matrix&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;use_locking&quot;\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: &quot;validate_shape&quot;\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Matrix/read&quot;\\n op: &quot;Identity&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/BasicRNNCell/Linear/concat/concat_dim&quot;\\n op: &quot;Const&quot;\\n input: &quot;^RNN/while/Identity&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/BasicRNNCell/Linear/concat&quot;\\n op: &quot;Concat&quot;\\n input: &quot;RNN/while/BasicRNNCell/Linear/concat/concat_dim&quot;\\n input: &quot;RNN/while/TensorArrayRead&quot;\\n input: &quot;RNN/while/Identity_2&quot;\\n attr {\\n key: &quot;N&quot;\\n value {\\n i: 2\\n }\\n }\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/BasicRNNCell/Linear/MatMul/Enter&quot;\\n op: &quot;Enter&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Matrix/read&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;frame_name&quot;\\n value {\\n s: &quot;RNN/while/RNN/while/&quot;\\n }\\n }\\n attr {\\n key: &quot;is_constant&quot;\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: &quot;parallel_iterations&quot;\\n value {\\n i: 32\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/BasicRNNCell/Linear/MatMul&quot;\\n op: &quot;MatMul&quot;\\n input: &quot;RNN/while/BasicRNNCell/Linear/concat&quot;\\n input: &quot;RNN/while/BasicRNNCell/Linear/MatMul/Enter&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;transpose_a&quot;\\n value {\\n b: false\\n }\\n }\\n attr {\\n key: &quot;transpose_b&quot;\\n value {\\n b: false\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Bias&quot;\\n op: &quot;Variable&quot;\\n attr {\\n key: &quot;container&quot;\\n value {\\n s: &quot;&quot;\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;shape&quot;\\n value {\\n shape {\\n dim {\\n size: 5\\n }\\n }\\n }\\n }\\n attr {\\n key: &quot;shared_name&quot;\\n value {\\n s: &quot;&quot;\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Bias/Initializer/Const&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Bias&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n dim {\\n size: 5\\n }\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Bias/Assign&quot;\\n op: &quot;Assign&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Bias&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Bias/Initializer/Const&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/BasicRNNCell/Linear/Bias&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;use_locking&quot;\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: &quot;validate_shape&quot;\\n value {\\n b: true\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/BasicRNNCell/Linear/Bias/read&quot;\\n op: &quot;Identity&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Bias&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/BasicRNNCell/add/Enter&quot;\\n op: &quot;Enter&quot;\\n input: &quot;RNN/BasicRNNCell/Linear/Bias/read&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;frame_name&quot;\\n value {\\n s: &quot;RNN/while/RNN/while/&quot;\\n }\\n }\\n attr {\\n key: &quot;is_constant&quot;\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: &quot;parallel_iterations&quot;\\n value {\\n i: 32\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/BasicRNNCell/add&quot;\\n op: &quot;Add&quot;\\n input: &quot;RNN/while/BasicRNNCell/Linear/MatMul&quot;\\n input: &quot;RNN/while/BasicRNNCell/add/Enter&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/BasicRNNCell/Tanh&quot;\\n op: &quot;Tanh&quot;\\n input: &quot;RNN/while/BasicRNNCell/add&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/TensorArrayWrite/RefEnter&quot;\\n op: &quot;RefEnter&quot;\\n input: &quot;RNN/TensorArray&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_STRING\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/TensorArray&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;frame_name&quot;\\n value {\\n s: &quot;RNN/while/RNN/while/&quot;\\n }\\n }\\n attr {\\n key: &quot;is_constant&quot;\\n value {\\n b: true\\n }\\n }\\n attr {\\n key: &quot;parallel_iterations&quot;\\n value {\\n i: 32\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/TensorArrayWrite&quot;\\n op: &quot;TensorArrayWrite&quot;\\n input: &quot;RNN/while/TensorArrayWrite/RefEnter&quot;\\n input: &quot;RNN/while/Identity&quot;\\n input: &quot;RNN/while/BasicRNNCell/Tanh&quot;\\n input: &quot;RNN/while/Identity_1&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/TensorArray&quot;\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/TensorArray_2/Const&quot;\\n op: &quot;Const&quot;\\n input: &quot;^RNN/while/Identity&quot;\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/TensorArray&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_FLOAT\\n tensor_shape {\\n }\\n float_val: 0.0\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/add/y&quot;\\n op: &quot;Const&quot;\\n input: &quot;^RNN/while/Identity&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n }\\n int_val: 1\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/add&quot;\\n op: &quot;Add&quot;\\n input: &quot;RNN/while/Identity&quot;\\n input: &quot;RNN/while/add/y&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/NextIteration&quot;\\n op: &quot;NextIteration&quot;\\n input: &quot;RNN/while/add&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/NextIteration_1&quot;\\n op: &quot;NextIteration&quot;\\n input: &quot;RNN/while/TensorArrayWrite&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/NextIteration_2&quot;\\n op: &quot;NextIteration&quot;\\n input: &quot;RNN/while/BasicRNNCell/Tanh&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/Exit&quot;\\n op: &quot;Exit&quot;\\n input: &quot;RNN/while/Switch&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/Exit_1&quot;\\n op: &quot;Exit&quot;\\n input: &quot;RNN/while/Switch_1&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/while/Exit_2&quot;\\n op: &quot;Exit&quot;\\n input: &quot;RNN/while/Switch_2&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/TensorArrayPack&quot;\\n op: &quot;TensorArrayPack&quot;\\n input: &quot;RNN/TensorArray&quot;\\n input: &quot;RNN/while/Exit_1&quot;\\n attr {\\n key: &quot;_class&quot;\\n value {\\n list {\\n s: &quot;loc:@RNN/TensorArray&quot;\\n }\\n }\\n }\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n attr {\\n key: &quot;element_shape&quot;\\n value {\\n shape {\\n dim {\\n size: -1\\n }\\n dim {\\n size: 5\\n }\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/transpose/perm&quot;\\n op: &quot;Const&quot;\\n attr {\\n key: &quot;dtype&quot;\\n value {\\n type: DT_INT32\\n }\\n }\\n attr {\\n key: &quot;value&quot;\\n value {\\n tensor {\\n dtype: DT_INT32\\n tensor_shape {\\n dim {\\n size: 3\\n }\\n }\\n tensor_content: &quot;\\\\001\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000\\\\002\\\\000\\\\000\\\\000&quot;\\n }\\n }\\n }\\n}\\nnode {\\n name: &quot;RNN/transpose&quot;\\n op: &quot;Transpose&quot;\\n input: &quot;RNN/TensorArrayPack&quot;\\n input: &quot;RNN/transpose/perm&quot;\\n attr {\\n key: &quot;T&quot;\\n value {\\n type: DT_FLOAT\\n }\\n }\\n}\\nnode {\\n name: &quot;init&quot;\\n op: &quot;NoOp&quot;\\n input: &quot;^RNN/BasicRNNCell/Linear/Matrix/Assign&quot;\\n input: &quot;^RNN/BasicRNNCell/Linear/Bias/Assign&quot;\\n}\\n';\n",
" }\n",
" </script>\n",
" <link rel=&quot;import&quot; href=&quot;https://tensorboard.appspot.com/tf-graph-basic.build.html&quot; onload=load()>\n",
" <div style=&quot;height:600px&quot;>\n",
" <tf-graph-basic id=&quot;graph0.9507143064099162&quot;></tf-graph-basic>\n",
" </div>\n",
" \"></iframe>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"show_graph(tf.get_default_graph())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setting the sequence lengths"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"tf.reset_default_graph()\n",
"\n",
"n_steps = 2\n",
"n_inputs = 3\n",
"n_neurons = 5\n",
"\n",
"X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])\n",
"seq_length = tf.placeholder(tf.int32, [None])\n",
"\n",
"basic_cell = tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons)\n",
"outputs, states = tf.nn.dynamic_rnn(basic_cell, X, sequence_length=seq_length, dtype=tf.float32)\n",
"\n",
"init = tf.initialize_all_variables()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"X_batch = np.array([\n",
" # step 0 step 1\n",
" [[0, 1, 2], [9, 8, 7]], # instance 1\n",
" [[3, 4, 5], [0, 0, 0]], # instance 2 (padded with zero vectors)\n",
" [[6, 7, 8], [6, 5, 4]], # instance 3\n",
" [[9, 0, 1], [3, 2, 1]], # instance 4\n",
" ])\n",
"seq_length_batch = np.array([2, 1, 2, 2])\n",
"\n",
"with tf.Session() as sess:\n",
" init.run()\n",
" outputs_val, states_val = sess.run(\n",
" [outputs, states], feed_dict={X: X_batch, seq_length: seq_length_batch})"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[[ 0.942316 0.12856117 -0.34410363 -0.86847639 0.5787816 ]\n",
" [ 1. 0.99979937 -0.99980366 -0.87422884 0.99999756]]\n",
"\n",
" [[ 0.99999815 0.90053409 -0.96986437 -0.96849412 0.99667072]\n",
" [ 0. 0. 0. 0. 0. ]]\n",
"\n",
" [[ 1. 0.99293071 -0.9990412 -0.9927482 0.99997932]\n",
" [ 1. 0.99874562 -0.99058747 -0.28668702 0.99907541]]\n",
"\n",
" [[ 0.99998087 0.99997705 -0.98866355 0.99963832 0.98265362]\n",
" [ 0.96435863 0.97204041 -0.46794799 0.8993032 0.81080031]]]\n"
]
}
],
"source": [
"print(outputs_val)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 1. 0.99979937 -0.99980366 -0.87422884 0.99999756]\n",
" [ 0.99999815 0.90053409 -0.96986437 -0.96849412 0.99667072]\n",
" [ 1. 0.99874562 -0.99058747 -0.28668702 0.99907541]\n",
" [ 0.96435863 0.97204041 -0.46794799 0.8993032 0.81080031]]\n"
]
}
],
"source": [
"print(states_val)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Training a sequence classifier"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"tf.reset_default_graph()\n",
"\n",
"from tensorflow.contrib.layers import fully_connected\n",
"\n",
"n_steps = 28\n",
"n_inputs = 28\n",
"n_neurons = 150\n",
"n_outputs = 10\n",
"\n",
"learning_rate = 0.001\n",
"\n",
"X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])\n",
"y = tf.placeholder(tf.int32, [None])\n",
"\n",
"with tf.variable_scope(\"\", initializer=tf.contrib.layers.variance_scaling_initializer()):\n",
" basic_cell = tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons, activation=tf.nn.relu)\n",
" outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)\n",
"\n",
"logits = fully_connected(states, n_outputs, activation_fn=None)\n",
"xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, y)\n",
"loss = tf.reduce_mean(xentropy)\n",
"optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)\n",
"training_op = optimizer.minimize(loss)\n",
"correct = tf.nn.in_top_k(logits, y, 1)\n",
"accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))\n",
"\n",
"init = tf.initialize_all_variables()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Extracting /tmp/data/train-images-idx3-ubyte.gz\n",
"Extracting /tmp/data/train-labels-idx1-ubyte.gz\n",
"Extracting /tmp/data/t10k-images-idx3-ubyte.gz\n",
"Extracting /tmp/data/t10k-labels-idx1-ubyte.gz\n"
]
}
],
"source": [
"from tensorflow.examples.tutorials.mnist import input_data\n",
"mnist = input_data.read_data_sets(\"/tmp/data/\")\n",
"X_test = mnist.test.images.reshape((-1, n_steps, n_inputs))\n",
"y_test = mnist.test.labels"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 Train accuracy: 0.7 Test accuracy: 0.7218\n",
"1 Train accuracy: 0.72 Test accuracy: 0.776\n",
"2 Train accuracy: 0.866667 Test accuracy: 0.8695\n",
"3 Train accuracy: 0.926667 Test accuracy: 0.8955\n",
"4 Train accuracy: 0.94 Test accuracy: 0.9205\n",
"5 Train accuracy: 0.926667 Test accuracy: 0.92\n",
"6 Train accuracy: 0.966667 Test accuracy: 0.937\n",
"7 Train accuracy: 0.94 Test accuracy: 0.9383\n",
"8 Train accuracy: 0.913333 Test accuracy: 0.9453\n",
"9 Train accuracy: 0.953333 Test accuracy: 0.9363\n",
"10 Train accuracy: 0.98 Test accuracy: 0.9513\n",
"11 Train accuracy: 0.92 Test accuracy: 0.9499\n",
"12 Train accuracy: 0.98 Test accuracy: 0.9499\n",
"13 Train accuracy: 0.986667 Test accuracy: 0.9522\n",
"14 Train accuracy: 0.98 Test accuracy: 0.9509\n",
"15 Train accuracy: 0.953333 Test accuracy: 0.9579\n",
"16 Train accuracy: 0.98 Test accuracy: 0.9515\n",
"17 Train accuracy: 0.973333 Test accuracy: 0.9579\n",
"18 Train accuracy: 0.973333 Test accuracy: 0.9634\n",
"19 Train accuracy: 0.953333 Test accuracy: 0.9561\n",
"20 Train accuracy: 0.973333 Test accuracy: 0.9605\n",
"21 Train accuracy: 0.973333 Test accuracy: 0.9619\n",
"22 Train accuracy: 0.966667 Test accuracy: 0.9573\n",
"23 Train accuracy: 0.986667 Test accuracy: 0.9641\n",
"24 Train accuracy: 0.98 Test accuracy: 0.9575\n",
"25 Train accuracy: 0.966667 Test accuracy: 0.9542\n",
"26 Train accuracy: 0.973333 Test accuracy: 0.966\n",
"27 Train accuracy: 0.966667 Test accuracy: 0.964\n",
"28 Train accuracy: 0.966667 Test accuracy: 0.9644\n",
"29 Train accuracy: 0.953333 Test accuracy: 0.9676\n",
"30 Train accuracy: 0.96 Test accuracy: 0.9639\n",
"31 Train accuracy: 0.986667 Test accuracy: 0.9635\n",
"32 Train accuracy: 0.993333 Test accuracy: 0.9656\n",
"33 Train accuracy: 0.993333 Test accuracy: 0.9695\n",
"34 Train accuracy: 0.973333 Test accuracy: 0.963\n",
"35 Train accuracy: 0.98 Test accuracy: 0.9725\n",
"36 Train accuracy: 0.98 Test accuracy: 0.9694\n",
"37 Train accuracy: 0.986667 Test accuracy: 0.9689\n",
"38 Train accuracy: 1.0 Test accuracy: 0.9703\n",
"39 Train accuracy: 0.973333 Test accuracy: 0.9628\n",
"40 Train accuracy: 0.993333 Test accuracy: 0.9693\n",
"41 Train accuracy: 0.98 Test accuracy: 0.9716\n",
"42 Train accuracy: 1.0 Test accuracy: 0.968\n",
"43 Train accuracy: 0.986667 Test accuracy: 0.9719\n",
"44 Train accuracy: 0.986667 Test accuracy: 0.9695\n",
"45 Train accuracy: 0.96 Test accuracy: 0.9677\n",
"46 Train accuracy: 0.98 Test accuracy: 0.9724\n",
"47 Train accuracy: 0.973333 Test accuracy: 0.9727\n",
"48 Train accuracy: 0.993333 Test accuracy: 0.9721\n",
"49 Train accuracy: 0.98 Test accuracy: 0.9714\n",
"50 Train accuracy: 0.986667 Test accuracy: 0.9757\n",
"51 Train accuracy: 0.98 Test accuracy: 0.975\n",
"52 Train accuracy: 0.986667 Test accuracy: 0.9684\n",
"53 Train accuracy: 0.966667 Test accuracy: 0.9675\n",
"54 Train accuracy: 0.973333 Test accuracy: 0.9683\n",
"55 Train accuracy: 0.98 Test accuracy: 0.9693\n",
"56 Train accuracy: 0.98 Test accuracy: 0.9706\n",
"57 Train accuracy: 0.973333 Test accuracy: 0.9743\n",
"58 Train accuracy: 0.973333 Test accuracy: 0.9719\n",
"59 Train accuracy: 1.0 Test accuracy: 0.9748\n",
"60 Train accuracy: 0.98 Test accuracy: 0.9736\n",
"61 Train accuracy: 0.98 Test accuracy: 0.972\n",
"62 Train accuracy: 0.98 Test accuracy: 0.9671\n",
"63 Train accuracy: 0.993333 Test accuracy: 0.9762\n",
"64 Train accuracy: 0.993333 Test accuracy: 0.9758\n",
"65 Train accuracy: 0.993333 Test accuracy: 0.9759\n",
"66 Train accuracy: 0.986667 Test accuracy: 0.9725\n",
"67 Train accuracy: 0.993333 Test accuracy: 0.9796\n",
"68 Train accuracy: 0.993333 Test accuracy: 0.9719\n",
"69 Train accuracy: 1.0 Test accuracy: 0.977\n",
"70 Train accuracy: 1.0 Test accuracy: 0.9778\n",
"71 Train accuracy: 0.98 Test accuracy: 0.9774\n",
"72 Train accuracy: 0.993333 Test accuracy: 0.9753\n",
"73 Train accuracy: 0.986667 Test accuracy: 0.9769\n",
"74 Train accuracy: 0.986667 Test accuracy: 0.9732\n",
"75 Train accuracy: 1.0 Test accuracy: 0.9754\n",
"76 Train accuracy: 0.986667 Test accuracy: 0.9744\n",
"77 Train accuracy: 0.98 Test accuracy: 0.9798\n",
"78 Train accuracy: 0.986667 Test accuracy: 0.9764\n",
"79 Train accuracy: 0.993333 Test accuracy: 0.9783\n",
"80 Train accuracy: 0.98 Test accuracy: 0.9752\n",
"81 Train accuracy: 0.973333 Test accuracy: 0.9775\n",
"82 Train accuracy: 0.986667 Test accuracy: 0.9793\n",
"83 Train accuracy: 0.986667 Test accuracy: 0.9707\n",
"84 Train accuracy: 0.986667 Test accuracy: 0.9721\n",
"85 Train accuracy: 0.973333 Test accuracy: 0.9782\n",
"86 Train accuracy: 0.986667 Test accuracy: 0.9756\n",
"87 Train accuracy: 1.0 Test accuracy: 0.9775\n",
"88 Train accuracy: 0.986667 Test accuracy: 0.9786\n",
"89 Train accuracy: 0.973333 Test accuracy: 0.9731\n",
"90 Train accuracy: 0.973333 Test accuracy: 0.9722\n",
"91 Train accuracy: 0.986667 Test accuracy: 0.9783\n",
"92 Train accuracy: 0.993333 Test accuracy: 0.9783\n",
"93 Train accuracy: 0.96 Test accuracy: 0.9761\n",
"94 Train accuracy: 0.98 Test accuracy: 0.9767\n",
"95 Train accuracy: 0.966667 Test accuracy: 0.9764\n",
"96 Train accuracy: 0.993333 Test accuracy: 0.971\n",
"97 Train accuracy: 1.0 Test accuracy: 0.9783\n",
"98 Train accuracy: 0.986667 Test accuracy: 0.9804\n",
"99 Train accuracy: 1.0 Test accuracy: 0.9772\n"
]
}
],
"source": [
"n_epochs = 100\n",
"batch_size = 150\n",
"\n",
"with tf.Session() as sess:\n",
" init.run()\n",
" for epoch in range(n_epochs):\n",
" for iteration in range(len(mnist.test.labels)//batch_size):\n",
" X_batch, y_batch = mnist.train.next_batch(batch_size)\n",
" X_batch = X_batch.reshape((-1, n_steps, n_inputs))\n",
" sess.run(training_op, feed_dict={X: X_batch, y: y_batch})\n",
" acc_train = accuracy.eval(feed_dict={X: X_batch, y: y_batch})\n",
" acc_test = accuracy.eval(feed_dict={X: X_test, y: y_test})\n",
" print(epoch, \"Train accuracy:\", acc_train, \"Test accuracy:\", acc_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Multi-layer RNN"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"tf.reset_default_graph()\n",
"\n",
"from tensorflow.contrib.layers import fully_connected\n",
"\n",
"n_steps = 28\n",
"n_inputs = 28\n",
"n_neurons1 = 150\n",
"n_neurons2 = 100\n",
"n_outputs = 10\n",
"\n",
"learning_rate = 0.001\n",
"\n",
"X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])\n",
"y = tf.placeholder(tf.int32, [None])\n",
"\n",
"hidden1 = tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons1, activation=tf.nn.relu)\n",
"hidden2 = tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons2, activation=tf.nn.relu)\n",
"multi_layer_cell = tf.nn.rnn_cell.MultiRNNCell([hidden1, hidden2])\n",
"outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32)\n",
"\n",
"logits = fully_connected(states, n_outputs, activation_fn=None)\n",
"xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, y)\n",
"loss = tf.reduce_mean(xentropy)\n",
"optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)\n",
"training_op = optimizer.minimize(loss)\n",
"correct = tf.nn.in_top_k(logits, y, 1)\n",
"accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))\n",
"\n",
"init = tf.initialize_all_variables()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 Train accuracy: 0.693333 Test accuracy: 0.6555\n",
"1 Train accuracy: 0.84 Test accuracy: 0.8482\n",
"2 Train accuracy: 0.853333 Test accuracy: 0.8747\n",
"3 Train accuracy: 0.96 Test accuracy: 0.9187\n",
"4 Train accuracy: 0.96 Test accuracy: 0.9432\n",
"5 Train accuracy: 0.933333 Test accuracy: 0.9385\n",
"6 Train accuracy: 0.926667 Test accuracy: 0.9435\n",
"7 Train accuracy: 0.96 Test accuracy: 0.9517\n",
"8 Train accuracy: 0.966667 Test accuracy: 0.9461\n",
"9 Train accuracy: 0.953333 Test accuracy: 0.9553\n",
"10 Train accuracy: 0.98 Test accuracy: 0.9625\n",
"11 Train accuracy: 0.946667 Test accuracy: 0.9605\n",
"12 Train accuracy: 0.96 Test accuracy: 0.9676\n",
"13 Train accuracy: 0.993333 Test accuracy: 0.9589\n",
"14 Train accuracy: 0.973333 Test accuracy: 0.9644\n",
"15 Train accuracy: 0.96 Test accuracy: 0.9632\n",
"16 Train accuracy: 0.966667 Test accuracy: 0.962\n",
"17 Train accuracy: 0.98 Test accuracy: 0.9649\n",
"18 Train accuracy: 0.966667 Test accuracy: 0.9648\n",
"19 Train accuracy: 0.986667 Test accuracy: 0.968\n",
"20 Train accuracy: 0.946667 Test accuracy: 0.9666\n",
"21 Train accuracy: 0.98 Test accuracy: 0.9706\n",
"22 Train accuracy: 0.94 Test accuracy: 0.9553\n",
"23 Train accuracy: 0.98 Test accuracy: 0.9735\n",
"24 Train accuracy: 0.966667 Test accuracy: 0.967\n",
"25 Train accuracy: 0.986667 Test accuracy: 0.9683\n",
"26 Train accuracy: 0.966667 Test accuracy: 0.9757\n",
"27 Train accuracy: 0.986667 Test accuracy: 0.9713\n",
"28 Train accuracy: 0.986667 Test accuracy: 0.9745\n",
"29 Train accuracy: 0.993333 Test accuracy: 0.9688\n",
"30 Train accuracy: 0.946667 Test accuracy: 0.9683\n",
"31 Train accuracy: 0.98 Test accuracy: 0.9726\n",
"32 Train accuracy: 0.98 Test accuracy: 0.971\n",
"33 Train accuracy: 0.973333 Test accuracy: 0.9728\n",
"34 Train accuracy: 0.98 Test accuracy: 0.9752\n",
"35 Train accuracy: 0.98 Test accuracy: 0.9767\n",
"36 Train accuracy: 0.98 Test accuracy: 0.9754\n",
"37 Train accuracy: 0.986667 Test accuracy: 0.9758\n",
"38 Train accuracy: 0.98 Test accuracy: 0.9742\n",
"39 Train accuracy: 0.993333 Test accuracy: 0.9656\n",
"40 Train accuracy: 0.986667 Test accuracy: 0.977\n",
"41 Train accuracy: 0.973333 Test accuracy: 0.9778\n",
"42 Train accuracy: 0.966667 Test accuracy: 0.9764\n",
"43 Train accuracy: 0.986667 Test accuracy: 0.9778\n",
"44 Train accuracy: 0.98 Test accuracy: 0.9753\n",
"45 Train accuracy: 0.993333 Test accuracy: 0.9798\n",
"46 Train accuracy: 0.98 Test accuracy: 0.9723\n",
"47 Train accuracy: 0.98 Test accuracy: 0.9709\n",
"48 Train accuracy: 0.993333 Test accuracy: 0.9774\n",
"49 Train accuracy: 0.973333 Test accuracy: 0.9789\n",
"50 Train accuracy: 1.0 Test accuracy: 0.9769\n",
"51 Train accuracy: 0.993333 Test accuracy: 0.9748\n",
"52 Train accuracy: 0.966667 Test accuracy: 0.9739\n",
"53 Train accuracy: 0.986667 Test accuracy: 0.9768\n",
"54 Train accuracy: 0.986667 Test accuracy: 0.9739\n",
"55 Train accuracy: 0.993333 Test accuracy: 0.9795\n",
"56 Train accuracy: 0.993333 Test accuracy: 0.9788\n",
"57 Train accuracy: 1.0 Test accuracy: 0.9782\n",
"58 Train accuracy: 0.973333 Test accuracy: 0.9696\n",
"59 Train accuracy: 0.973333 Test accuracy: 0.9694\n",
"60 Train accuracy: 1.0 Test accuracy: 0.9804\n",
"61 Train accuracy: 0.993333 Test accuracy: 0.9789\n",
"62 Train accuracy: 0.993333 Test accuracy: 0.9776\n",
"63 Train accuracy: 0.993333 Test accuracy: 0.9786\n",
"64 Train accuracy: 1.0 Test accuracy: 0.9746\n",
"65 Train accuracy: 0.986667 Test accuracy: 0.9815\n",
"66 Train accuracy: 1.0 Test accuracy: 0.9787\n",
"67 Train accuracy: 0.986667 Test accuracy: 0.9793\n",
"68 Train accuracy: 0.98 Test accuracy: 0.9811\n",
"69 Train accuracy: 0.986667 Test accuracy: 0.976\n",
"70 Train accuracy: 1.0 Test accuracy: 0.9776\n",
"71 Train accuracy: 0.986667 Test accuracy: 0.9779\n",
"72 Train accuracy: 0.986667 Test accuracy: 0.9844\n",
"73 Train accuracy: 0.98 Test accuracy: 0.9807\n",
"74 Train accuracy: 1.0 Test accuracy: 0.9792\n",
"75 Train accuracy: 1.0 Test accuracy: 0.9794\n",
"76 Train accuracy: 0.993333 Test accuracy: 0.9771\n",
"77 Train accuracy: 1.0 Test accuracy: 0.9786\n",
"78 Train accuracy: 0.993333 Test accuracy: 0.9802\n",
"79 Train accuracy: 0.973333 Test accuracy: 0.9819\n",
"80 Train accuracy: 0.986667 Test accuracy: 0.9779\n",
"81 Train accuracy: 0.993333 Test accuracy: 0.9777\n",
"82 Train accuracy: 0.993333 Test accuracy: 0.982\n",
"83 Train accuracy: 0.993333 Test accuracy: 0.9797\n",
"84 Train accuracy: 1.0 Test accuracy: 0.9787\n",
"85 Train accuracy: 0.993333 Test accuracy: 0.9788\n",
"86 Train accuracy: 0.986667 Test accuracy: 0.9808\n",
"87 Train accuracy: 0.973333 Test accuracy: 0.9762\n",
"88 Train accuracy: 0.993333 Test accuracy: 0.9772\n",
"89 Train accuracy: 0.993333 Test accuracy: 0.9833\n",
"90 Train accuracy: 1.0 Test accuracy: 0.9819\n",
"91 Train accuracy: 0.993333 Test accuracy: 0.9786\n",
"92 Train accuracy: 1.0 Test accuracy: 0.984\n",
"93 Train accuracy: 0.993333 Test accuracy: 0.9816\n",
"94 Train accuracy: 0.986667 Test accuracy: 0.9831\n",
"95 Train accuracy: 0.986667 Test accuracy: 0.9839\n",
"96 Train accuracy: 0.993333 Test accuracy: 0.9826\n",
"97 Train accuracy: 1.0 Test accuracy: 0.9835\n",
"98 Train accuracy: 0.986667 Test accuracy: 0.981\n",
"99 Train accuracy: 0.993333 Test accuracy: 0.9843\n"
]
}
],
"source": [
"n_epochs = 100\n",
"batch_size = 150\n",
"\n",
"with tf.Session() as sess:\n",
" init.run()\n",
" for epoch in range(n_epochs):\n",
" for iteration in range(len(mnist.test.labels)//batch_size):\n",
" X_batch, y_batch = mnist.train.next_batch(batch_size)\n",
" X_batch = X_batch.reshape((-1, n_steps, n_inputs))\n",
" sess.run(training_op, feed_dict={X: X_batch, y: y_batch})\n",
" acc_train = accuracy.eval(feed_dict={X: X_batch, y: y_batch})\n",
" acc_test = accuracy.eval(feed_dict={X: X_test, y: y_test})\n",
" print(epoch, \"Train accuracy:\", acc_train, \"Test accuracy:\", acc_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Time series"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"t_min, t_max = 0, 30\n",
"resolution = 0.1\n",
"\n",
"def time_series(t):\n",
" return t * np.sin(t) / 3 + 2 * np.sin(t*5)\n",
"\n",
"def next_batch(batch_size, n_steps):\n",
" t0 = np.random.rand(batch_size, 1) * (t_max - t_min - n_steps * resolution)\n",
" Ts = t0 + np.arange(0., n_steps + 1) * resolution\n",
" ys = time_series(Ts)\n",
" return ys[:, :-1].reshape(-1, n_steps, 1), ys[:, 1:].reshape(-1, n_steps, 1)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Saving figure time_series_plot\n"
]
},
{
"data": {
"image/png": "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\nHej+oKLp/2HF0zmvWDrfFU/nvGLF4v5ASZDS2wfQtm1bOnXqFOtYqoxjjz1W56uUdM7KRuet9HTO\nykbnrcwqe1eRb4A+Zna6c25NyPTr8EPkrixkPd0fxID+H1Y8nfOKpfNd8XTOY6bC7g+UBBERERHJ\n8yiQArxvZn/FD5F7Ob67yzPOuU2xDE5ERESOjJIgIiIiIgHOuaVm1g24H18f5ARgLX7I3EdjGJqI\niIiUAyVBREREREI45z4B+sU6DhERESl/cbEOQGqGwYMHxzqEKkfnrGx03kpP56xsdN5EYk//Dyue\nznnF0vmueDrn1Z8552IdQ5ViZp2AtLS0NBXMERERKaH09HQ6d+4M0Nk5lx7reMpbSe4P1q9fz+bN\nmys2MKl0GjZsSNOmTWMdhohIpRCL+wN1hxERERGJsvXr19O2bVv27NkT61AkxurUqcPq1auVCBER\niRElQURERESibPPmzezZs4eZM2fStm3bWIcjMbJ69WqGDBnC5s2blQQREYkRJUFEREREKkjbtm3V\nnVZERCSGVBhVRERERERERGoEJUFEREREREREpEZQEkREREREREREagQlQURERERERESkRlASRERE\nRESOyPPPP09cXBzr16+PdSgiIiJF0ugwIiIiIpVEVlYWkydPY+HCDzh0CGrXhpSUbowePYKkpKRK\nu20zw8yOaBuFeeONN1i+fDnjx4+PyvZFRKRmURJEREREJMb27t3L0KFjSE3dzKZNN5KT83t8g90c\nVq58kxkzbiM5uREzZ04iISGh0mw76Prrr2fw4MEcddRRZVq/KK+//jpTp05VEkRERMqFusOIiIiI\nxNDevXvp0eMa5s27gszMl8nJSSHvFi2OnJwUMjNfZt68AXTvfjX79u2rFNsOZWZRSYAAOOeisl0R\nEamZlAQRERERiaGhQ3/LihV3cPDgxUUud/BgX1asuJ0hQ8ZUim2HCq8J0rx5c/r378+yZcs477zz\nSExMpGXLlrzwwgv51jt06BATJkygdevWJCYm0rBhQ7p3784777wDwPDhw5k6dSoAcXFxxMXFUatW\nrdz1//znP3P++efTsGFD6tSpQ5cuXXjllVcKxBcXF8eoUaOYO3cuZ511FgkJCbRv355FixYVWDYz\nM5Mbb7yRU045hYSEBE477TRuvfVWDh06lLvM9u3b+c1vfkPTpk1JSEigVatWPPLII0rYiIhUAeoO\n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\n76FDh9i9ezd169YtUuz16tXj+++/D7ht+/bt1KxZs8BzXH/99Vx//fXs37+fTvigzWwAACAASURB\nVJ06MWvWLKZPn07lysG/LZ13410k77zzDqtWreLNN9+kTp06Qe1TWq7TunXrMLOs50OGDKFTp045\n5mIp6rUUkdC1bAn/+1+koxARERHJS40gpUiNGtC+faSjKB7p6el8+umnXHfddSHt16VLF3bs2MHx\nxx9Pnz596NixIwMGDOCOO+4Iav+2bdvmeF61alUOHcq54M++ffsA8v1wHWzs9erVyxpqkdusWbO4\n8sorg4q5du3a3HPPPVx33XU0b96cxx57LE+efv36sXXr1hxpzjm+++472geoNCeddBKzZs0q9NzJ\nycncdtttTJ48mYsvvjioeKF0XCcgRwMIkDWc5q233qJ///7Fci1FJHQtW8KWLZCW5g2PERERESkt\nNDGqlIiEhARSU1NDXhmmUaNGfPLJJ1x++eUsXbqU2267jaZNm/LBBx8EtX/mBJ8FyfzgnJGREXB7\nsLH7fL58J+xcsGABl156acBtGzZsyDNZaGZDxtSpUwPu8+abb5KYmJjj8dlnn3HGGWfkSU9MTAyq\nASQtLY0rr7ySxx57jGuvvbbQ/NmVhuvUtWvXPNcoM29mj5TiuJYiErqWLeHIEdi8+Y+0d96JXDzB\nMrMeZjbFzL42s0Nm9p2ZvWJmsYXvLSIiImWB7vqlRHz88cc0atSIFi1aALBly5aglnP94osvqF69\nOq+88grbt29n8+bNdO3aldtuu63YYsvsWbBnz54ixb579+48K78AfP/99zRs2JCaNWvm2bZ//346\ndOjAGWeckWMllkqVKgHw22+/hfRaijIc5vbbb+eGG27gmmuuyUp7/fXXg9q3NFynzz77LE/vkV27\ndgHeCjjgDYUpyrUUkaNz5pneCjHLl/+Rtnhx5OIJwRPAucB/gTuAGcCVQKKZNYxkYCIiIlI81Agi\nJeKTTz6hc+fOWc+ffvppoqKisp5v3rw5xxKtmXL3YjjhhBOYPn06P/74Y7HFVr16dWJiYvj111+P\nKvZMv/76Kw0b5r0nnjlzZr5DYapVq8aRI0do3bp1jpVgNmzYAJBjnoxg5B4OEqxnn32WM844I0cD\nyOHDh1m3bl3W8/yuEZSO69SrVy+WLVuWI2316tWYGVdffXXW86JcSxE5OjVrwtlnw3vvec9/+w3W\n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\nccexd+9eFi1axM0338w333zDU089leNYgYbeZA7Jee6551i8eDGXXnop5513HosWLeK5557j119/\n5fXXXy/09WQee+DAgXz66adceOGFVKpUidmzZzN8+HCqVq3KsGHDsvIfOnSIrl27smnTJjp37kyX\nLl346aefGDhwIL169QppmFB+w4rMjAULFvD222/Tp08fOnfuTHx8PK+99hpbtmzJakwCsvLUq1eP\nSy+9lEaNGpGcnMy6deuIi4vjxhtvpHnz5owdO5axY8fSvHlzhg4dmrV/27ZtAa9ujB07lu7du3PZ\nZZcRHR3Npk2bmDFjBu+88w6JiYkcf/zxRSr/Z555hlGjRlGjRg369etH06ZN2b59OytXrmTevHl0\n7tw5K+8111zDjBkzaNmyJddccw1Vq1Zl6dKlDBs2jI0bN/Lkk08GXc4iIuXB4cOHGTx4FKtW7WLn\nzmE4dzrHHnsr69cP54sv4LXXhtOxYwxxcROIioqKdLgiIiLBc87pEcIDaA+4hIQEl5+EhARXWJ7s\nkpKcg8g9kpKCCjNko0aNcj6fz82ePds559zBgwddzZo1XfPmzUM6ztChQ53P53Nbt24NuN3MnM/n\nczfccIPLyMjIs/2HH37Ik3bkyBHXq1cvV6VKFbdt27Yc25o3b+5atGiRI23s2LHOzFy9evXc5s2b\ns9JTU1Ndq1atXKVKldyOHTtynNPM3HXXXZfjON26dXNm5jp27OgOHjyYlf7111+7KlWquDZt2uTI\nP2bMGGdm7tZbb82RvmzZsqzXPX369IDlklu3bt2cz+fLkfbqq686M3NVq1Z1q1atykrPyMhw3bt3\ndz6fz61evTor/fLLL3c+n8998cUXeY7/66+/5nhuZq579+4BY9m/f7/bs2dPnvQPP/zQVapUyd10\n00050kMt/3Xr1rlKlSq5448/3v344495zpM978svv+zMzA0bNsylp6dnpaelpbk+ffo4n8/nEhMT\nA76O7EJ934tUNJnvEaC9KwX/z4v7Ecz9QVmRkpLizjjjYlelyuKse4XGja9yiYmJrnHjAVlpVaos\ncmeccbE7fPhwpEMWEZEyKhL3BxoOIyUiPT2duLg4ateuTZ8+fQCIjo6mX79+/Pjjj7z33nvFer6q\nVavyxBNPBOzp0KxZszxpPp+PW265hSNHjvDBBx8EfZ677rqLE088Met5tWrVGDhwIM45EhISgjqG\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x116f6e4a8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"t = np.linspace(t_min, t_max, (t_max - t_min) // resolution)\n",
"\n",
"n_steps = 20\n",
"t_instance = np.linspace(12.2, 12.2 + resolution * (n_steps + 1), n_steps + 1)\n",
"\n",
"plt.figure(figsize=(11,4))\n",
"plt.subplot(121)\n",
"plt.title(\"A time series (generated)\", fontsize=14)\n",
"plt.plot(t, time_series(t), label=r\"$t . \\sin(t) / 3 + 2 . \\sin(5t)$\")\n",
"plt.plot(t_instance[:-1], time_series(t_instance[:-1]), \"b-\", linewidth=3, label=\"A training instance\")\n",
"plt.legend(loc=\"lower left\", fontsize=14)\n",
"plt.axis([0, 30, -17, 13])\n",
"plt.xlabel(\"Time\")\n",
"plt.ylabel(\"Value\")\n",
"\n",
"plt.subplot(122)\n",
"plt.title(\"A training instance\", fontsize=14)\n",
"plt.plot(t_instance[:-1], time_series(t_instance[:-1]), \"bo\", markersize=10, label=\"instance\")\n",
"plt.plot(t_instance[1:], time_series(t_instance[1:]), \"w*\", markersize=10, label=\"target\")\n",
"plt.legend(loc=\"upper left\")\n",
"plt.xlabel(\"Time\")\n",
"\n",
"\n",
"save_fig(\"time_series_plot\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"X_batch, y_batch = next_batch(1, n_steps)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[-2.92904642, -3.67374968],\n",
" [-3.67374968, -3.918505 ],\n",
" [-3.918505 , -3.72330675],\n",
" [-3.72330675, -3.25210323],\n",
" [-3.25210323, -2.73142518],\n",
" [-2.73142518, -2.39372837],\n",
" [-2.39372837, -2.41933451],\n",
" [-2.41933451, -2.89119797],\n",
" [-2.89119797, -3.77358492],\n",
" [-3.77358492, -4.91989615],\n",
" [-4.91989615, -6.10772886],\n",
" [-6.10772886, -7.09260281],\n",
" [-7.09260281, -7.6672054 ],\n",
" [-7.6672054 , -7.71165809],\n",
" [-7.71165809, -7.22250348],\n",
" [-7.22250348, -6.31332144],\n",
" [-6.31332144, -5.18682705],\n",
" [-5.18682705, -4.08528436],\n",
" [-4.08528436, -3.23137752],\n",
" [-3.23137752, -2.77401558]])"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.c_[X_batch[0], y_batch[0]]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Using an `OuputProjectionWrapper`"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"tf.reset_default_graph()\n",
"\n",
"from tensorflow.contrib.layers import fully_connected\n",
"\n",
"n_steps = 20\n",
"n_inputs = 1\n",
"n_neurons = 100\n",
"n_outputs = 1\n",
"\n",
"X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])\n",
"y = tf.placeholder(tf.float32, [None, n_steps, n_outputs])\n",
"\n",
"cell = tf.nn.rnn_cell.OutputProjectionWrapper(\n",
" tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons, activation=tf.nn.relu),\n",
" output_size=n_outputs)\n",
"outputs, states = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32)\n",
"\n",
"n_outputs = 1\n",
"learning_rate = 0.001\n",
"\n",
"loss = tf.reduce_sum(tf.square(outputs - y))\n",
"optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)\n",
"training_op = optimizer.minimize(loss)\n",
"\n",
"init = tf.initialize_all_variables()"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 \tMSE: 18363.0\n",
"100 \tMSE: 460.264\n",
"200 \tMSE: 188.349\n",
"300 \tMSE: 79.7485\n",
"400 \tMSE: 55.1912\n",
"500 \tMSE: 62.5532\n",
"600 \tMSE: 48.6516\n",
"700 \tMSE: 48.1635\n",
"800 \tMSE: 43.9179\n",
"900 \tMSE: 48.5993\n",
"[[[-3.47008657]\n",
" [-2.51267362]\n",
" [-1.18296444]\n",
" [ 0.68082786]\n",
" [ 2.2347033 ]\n",
" [ 3.12824368]\n",
" [ 3.52223229]\n",
" [ 3.32184052]\n",
" [ 2.83389449]\n",
" [ 2.18490314]\n",
" [ 1.69169581]\n",
" [ 1.5186218 ]\n",
" [ 1.9225558 ]\n",
" [ 2.73621488]\n",
" [ 3.85639024]\n",
" [ 5.07873535]\n",
" [ 6.10591364]\n",
" [ 6.67857647]\n",
" [ 6.67601919]\n",
" [ 6.06514454]]]\n"
]
}
],
"source": [
"n_iterations = 1000\n",
"batch_size = 50\n",
"\n",
"with tf.Session() as sess:\n",
" init.run()\n",
" for iteration in range(n_iterations):\n",
" X_batch, y_batch = next_batch(batch_size, n_steps)\n",
" sess.run(training_op, feed_dict={X: X_batch, y: y_batch})\n",
" if iteration % 100 == 0:\n",
" mse = loss.eval(feed_dict={X: X_batch, y: y_batch})\n",
" print(iteration, \"\\tMSE:\", mse)\n",
" \n",
" X_new = time_series(np.array(t_instance[:-1].reshape(-1, n_steps, n_inputs)))\n",
" y_pred = sess.run(outputs, feed_dict={X: X_new})\n",
" print(y_pred)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Saving figure time_series_pred_plot\n"
]
},
{
"data": {
"image/png": "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\nYWZnzayvmX3HzA6b2Wkz22lmt4Tr5JrZUjN728yazOxXZvaJTo6Tb2ZLzGy/mTWbWcjMnjOz1Ll9\nwgAAAg9JREFUa/04TxHp+fSoTkRSWdst8R8DHwfWAdnALOAFM7sBeBrIBJ4F8oEZwCYzu9o5d7Jt\nR2Y2CNgKfBR4EXgeKAD+CphoZjc75/7Dl7MSkR5LiZOIpDoDLgf+wjnXBGBmL+IlUy8BW4DPOeda\nw+t2AY8Cc4DH2u3nR8AAIOCc++n7Ozf7NlCLl4CN7PazEZEeTY/qRCTVOeAbbUlT2HNAC3Ap8FBb\n0hS2Gi/ZGtFWYGYjgXJgRfukCcA5dwAvabrOzEq65xREpLfQHScR6Ql2tf/inHNmFgSynXNvd6hb\nH/78aLuy0eHPQjP7+wj7H97uc29XgxWR3kuJk4ikPOdcY4TiM8C7EeqeNTPw+j21uTz8eXt46Uy/\neGMUkfSgxElE0kFbgvWAc+7JpEYiIj2a+jiJSDrYHv4sT2oUItLjKXESkV4vPM3AdmCmmU3ruN48\n4/yPTER6Gj2qE5F0MRN4GVhjZl8B6oAm4Eq8O1H9gUuSF56I9ARKnETELxd7v1NnL/m90HadrfvA\nvpxzb5rZKKAKmArcA5zFG4W3FVh7kfhERPSuOhEREZFoqY+TiIiISJSUOImIiIhESYmTiIiISJSU\nOImIiIhESYmTiIiISJSUOImIiIhESYmTiIiISJSUOImIiIhESYmTiIiISJSUOImIiIhESYmTiIiI\nSJSUOImIiIhESYmTiIiISJT+P/OTKb2pXYTlAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11748fac8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.title(\"Testing the model\", fontsize=14)\n",
"plt.plot(t_instance[:-1], time_series(t_instance[:-1]), \"bo\", markersize=10, label=\"instance\")\n",
"plt.plot(t_instance[1:], time_series(t_instance[1:]), \"w*\", markersize=10, label=\"target\")\n",
"plt.plot(t_instance[1:], y_pred[0,:,0], \"r.\", markersize=10, label=\"prediction\")\n",
"plt.legend(loc=\"upper left\")\n",
"plt.xlabel(\"Time\")\n",
"\n",
"save_fig(\"time_series_pred_plot\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Without using an `OutputProjectionWrapper`"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"tf.reset_default_graph()\n",
"\n",
"from tensorflow.contrib.layers import fully_connected\n",
"\n",
"n_steps = 20\n",
"n_inputs = 1\n",
"n_neurons = 100\n",
"\n",
"X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])\n",
"y = tf.placeholder(tf.float32, [None, n_steps, n_outputs])\n",
"\n",
"basic_cell = tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons, activation=tf.nn.relu)\n",
"rnn_outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)\n",
"\n",
"n_outputs = 1\n",
"learning_rate = 0.001\n",
"\n",
"stacked_rnn_outputs = tf.reshape(rnn_outputs, [-1, n_neurons])\n",
"stacked_outputs = fully_connected(stacked_rnn_outputs, n_outputs, activation_fn=None)\n",
"outputs = tf.reshape(stacked_outputs, [-1, n_steps, n_outputs])\n",
"\n",
"loss = tf.reduce_sum(tf.square(outputs - y))\n",
"optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)\n",
"training_op = optimizer.minimize(loss)\n",
"\n",
"init = tf.initialize_all_variables()"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 \tMSE: 22003.0\n",
"100 \tMSE: 627.62\n",
"200 \tMSE: 277.0\n",
"300 \tMSE: 147.352\n",
"400 \tMSE: 76.7669\n",
"500 \tMSE: 58.6978\n",
"600 \tMSE: 51.0611\n",
"700 \tMSE: 58.2317\n",
"800 \tMSE: 43.9699\n",
"900 \tMSE: 49.0574\n",
"[[[-3.50358176]\n",
" [-2.55776238]\n",
" [-1.18039787]\n",
" [ 0.65069014]\n",
" [ 2.09318376]\n",
" [ 3.07957363]\n",
" [ 3.51863217]\n",
" [ 3.34387612]\n",
" [ 2.83897853]\n",
" [ 2.18822718]\n",
" [ 1.71263635]\n",
" [ 1.46465611]\n",
" [ 1.85618472]\n",
" [ 2.77506709]\n",
" [ 3.92803097]\n",
" [ 5.13883114]\n",
" [ 6.15240669]\n",
" [ 6.66308022]\n",
" [ 6.65433741]\n",
" [ 6.08840942]]]\n"
]
}
],
"source": [
"n_iterations = 1000\n",
"batch_size = 50\n",
"\n",
"with tf.Session() as sess:\n",
" init.run()\n",
" for iteration in range(n_iterations):\n",
" X_batch, y_batch = next_batch(batch_size, n_steps)\n",
" sess.run(training_op, feed_dict={X: X_batch, y: y_batch})\n",
" if iteration % 100 == 0:\n",
" mse = loss.eval(feed_dict={X: X_batch, y: y_batch})\n",
" print(iteration, \"\\tMSE:\", mse)\n",
" \n",
" X_new = time_series(np.array(t_instance[:-1].reshape(-1, n_steps, n_inputs)))\n",
" y_pred = sess.run(outputs, feed_dict={X: X_new})\n",
" print(y_pred)"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x116ca94a8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.title(\"Testing the model\", fontsize=14)\n",
"plt.plot(t_instance[:-1], time_series(t_instance[:-1]), \"bo\", markersize=10, label=\"instance\")\n",
"plt.plot(t_instance[1:], time_series(t_instance[1:]), \"w*\", markersize=10, label=\"target\")\n",
"plt.plot(t_instance[1:], y_pred[0,:,0], \"r.\", markersize=10, label=\"prediction\")\n",
"plt.legend(loc=\"upper left\")\n",
"plt.xlabel(\"Time\")\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Generating a creative new sequence"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 \tMSE: 14983.2\n",
"100 \tMSE: 469.065\n",
"200 \tMSE: 201.205\n",
"300 \tMSE: 67.0939\n",
"400 \tMSE: 66.6101\n",
"500 \tMSE: 59.1983\n",
"600 \tMSE: 51.0404\n",
"700 \tMSE: 52.3786\n",
"800 \tMSE: 52.3609\n",
"900 \tMSE: 47.2635\n",
"1000 \tMSE: 50.3522\n",
"1100 \tMSE: 50.9879\n",
"1200 \tMSE: 52.5301\n",
"1300 \tMSE: 39.9322\n",
"1400 \tMSE: 46.3595\n",
"1500 \tMSE: 32.6317\n",
"1600 \tMSE: 47.2008\n",
"1700 \tMSE: 36.8811\n",
"1800 \tMSE: 43.6736\n",
"1900 \tMSE: 40.6173\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA7oAAAGECAYAAAAY61yZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xl8XWW1//HP07l0ogMd0tK5pdAytUILyiDDBUVAFJQo\nouIVuCJoFUd+iCgq6PVWES/ghApSBHGAKldlKNAyFCitlBY6t0nnZmw6t3l+f6xsc5KeJCcnezjD\n9/165bXbc/bZeXLanL3XXutZj/PeIyIiIiIiIlIoOiU9ABEREREREZEwKdAVERERERGRgqJAV0RE\nRERERAqKAl0REREREREpKAp0RUREREREpKAo0BUREREREZGCokBXRERERERECooCXRERERERESko\nCnRFRERERESkoCjQFRERERERkYJSUIGuc+4dzrm7nHNLnHN1zrl1zrnfO+cmZPDajzvn6tN8HXTO\nDY5j/CIiInFwzvVyzt3qnHvCOVfRcL67Ms1+97VwblyaZl/nnPuyc261c263c26xc+7yeH4iERGR\nprokPYCQfQU4FXgE+BcwFLgeWOicm+69P+TE3IwHbgbWNnu8OuRxioiIJGkQdr5bBywCzmxl3z3A\npwCX8lhNmv2+B3wZuBd4FbgYeNA5V++9fziEMYuIiGTMee+THkNonHMzgFe99wdSHhsPLAEe9t4f\ncrc6Zb+PA78CTvLeL4x8sCIiIglxznUF+nvvtzrnpgGvAJ/w3v+22X73AR/03vdt43glwBrgHu/9\n51IefxYYDYz2hXTBISIiOa+gSpe99y+lBrkNj63EAt2jMz2Oc663c66g3hsREZGA936/935rpvs3\nlCX3bmWX92NVYnc3e/xuYARwSvtHKSIikr1iCeaGANsz2M8Bc4FaYJdz7i8NGWEREZFidRiwA6ht\nmM97l3OuV7N9TgB2eu/favb4AuzcemIM4xQREfm3Qpujewjn3BXAcOD/tbHrLuA+4Bks0J0GfBGY\n75yb6r3fEOlARUREcs9G4PvAQuzm+PnAZ4DjnHNneu/rG/YbBmxJ8/pNDduSqAcqIiKSqqADXefc\nJOAuYD7w29b29d4/gjWxCjzmnPsH8BxwE3ZiFxERKRre+5uaPfSwc24FcBtwKRA0meoJ7E1ziD0p\nz4uIiMSmYAPdhiWB/gpUAZdl0wTDez/fOfcycE4b32sgcB7WrXlPa/uKiEjB6oE1Xvq7974i4bFE\naRbwbezcGAS6u4HuafbtkfJ8WjqHiogIEZxDCzLQdc71Bf4O9AXe5b3f3IHDlQET29jnPOB3Hfge\nIiJSOD4KPJj0IKLivd/jnKsABqQ8vIn0SxQNa9hubOWQOoeKiEggtHNowQW6zrnuwOPAeOBs7/3b\nHTzkWGBbG/usBXjggQc4+uiMmzsXlJkzZzJr1qykh5EovQd6D4r954fifg+WLVvGFVdcAYeuxV5Q\nGrovD6LpuXER8Cnn3KRmDalmYGvUL2rlkGtB59Bi/b0JFPt7UOw/P+g9gOJ+D6I4hxZUoNuwJNDD\n2In1Iu/9ghb2Gwr0A1Z67w82PDbIe7+92X7vxZpS/aiNb70H4Oijj2bq1Kkd+yHyVL9+/Yr2Zw/o\nPdB7UOw/P+g9aFAQ5bcNN467eu/rmj31jYbtEymP/QU7V34GuCHl8WuBDcALrXwrnUP1e1P070Gx\n//yg9wD0HjQI7RxaUIEu8D/AhcBjwCDn3EdTn/TeB6VRtwNXYnXg6xsee8E59zrwKlCDBbifBNYB\n34t85CIiIjFyzl0HHI6tTABwkXPuyIY/34mVJr/unJsNBFna84H3AH/z3j8WHMt7v8E5Nwu40TnX\nDXgFuAR4J/CRbPpkiIiIdEShBbrHYyVSFzZ8NRcEuh6ob/bcQ8AFwLnYmoGbgHuBb3nv2ypdFhER\nyTc3AiMb/uyxwPSShr/fD1RjU4HOwW4OdwZWAl8Fftj8YN77rzjnKoFrgI8DK4CPeu9/H+HPICIi\nklZBBbre+3dnuN8nsWxt6mPfoLEcS0REpKB578dksNvH23nMO4A7shuRiIhIeDolPQApDKWlpUkP\nIXF6D/QeFPvPD3oPRLKh3xu9B8X+84PeA9B7EDanaTMd55ybCrz22muvaQK5iEiRWrhwIdOmTQOY\n5r1fmPR48oXOoSIiEsU5VBldERERERERKSgKdEVERERERKSgKNAVERERERGRgqJAV0RERERERAqK\nAl0REREREREpKAp0RUREREREpKAo0BUREREREZGCokBXRERERERECooCXRERERERESkoCnRFRERE\nRESkoCjQFRERERERkYKiQFdEREREREQKigJdERERERERKSgKdEVERERERKSgKNAVERERERGRgqJA\nV0RERERERAqKAl0REREREREpKAp0RURE0qiuho9+FDZvzmz/JUuiHY+IiIhkToGuiIhIGnfdBQ8+\nCI8+mtn+L7wQ7XhEREQkcwp0RUREmtm1C+680/785JOZvaasLLrxiIiISPso0BUREWnm4YehogI+\n/nF4+mk4cKDt1yjQFRERyR0KdEVERJpZuhRGj4ZrroHaWnj11bZfo0BXREQkdyjQFRERaWbDBhgx\nAk46Cfr2haeean3/2lprXiUiIiK5oaACXefcO5xzdznnljjn6pxz65xzv3fOTcjw9f2ccz9zzm1t\neP3TzrkTox63iIjklvJyGD4cunSB446DZcta33/VqnjGJSIiIpkpqEAX+ApwCfAkcANwL3A6sNA5\nd0xrL3TOOeBvwOXAncCXgCOAuc65cVEOWkREckuQ0QUYOxZWr259/5Urox+TiIiIZK5L0gMI2Q+B\nUu/9v9uGOOceBpYAXwWubOW1lwGnAB/03v+p4bWPAMuBW4Erohq0iIjkDu8t0B0+3P4+diz83/+1\n/pqVK6F3b6iri358IiIi0raCyuh6719KDXIbHluJBbpHt/HyDwKbgyC34bXbgYeBi51zXcMer4hI\nodq7N3/nrFZWwp49jYHuuHGwdWvrQezKlTByZDzjExERkbYVVKDbiiHA9jb2ORFYmObxBcBhwMSw\nByUiUqg+/3l4xzvg4MGkR9J+GzbYNrV0GVovX161qnF/ERERSV7BB7rOuSuA4cBDbew6DNiU5vHg\nsZIwxyUiUqjq6uCBByz4mzMn6dG0XxDopmZ0ofVAd/16GDYs2nGJiIhI5go60HXOTQLuAuYDv21j\n957A3jSP7wFcw/MiItKGhx+GnTvhqKPgrruSHk37lZdDp04wdKj9ffBgOOywlgPd+np7TbC/iIiI\nJK/QmlH9m3NuMPBXoAq4zHvv23jJbqB7msd7AL7h+VbNnDmTfv36NXmstLSU0tLSjMYsIlIIfv1r\nOPdc+NjH7Ku8PL/KejdsgCFDoGtDZwbnrHw5dQmh2bNnM3v2bMDm8+7fD3Pm1CQwWhEREUmnIANd\n51xf4O9AX+Bd3vvNGbxsE1a+3Fzw2Ma2DjBr1iymTp2a8ThFRAqN97BoEdx8M5xxhj22eHH+BbrN\nxztuXNOMbupNzAUL4J//hJtuWshHPjItxpGKiIhISwqudNk51x14HBgPXOC9fzvDly4C0kWpM4Bd\n2DJDIiLSiqoq2LEDxoyxYLFvX1iyJOlRtU95eeP83EDzjG6q9ettO2RItOMSERGRzBVUoOuc64Qt\nBzQDuNR7v6CF/YY6545yznVOefgPwBDn3AdS9hsEXAo85r3fH+HQRUQKwtq1th092kp+p0zJv0C3\nogKOOKLpY6NHW0BbX3/o/mVlNoe32cwVERERSVChlS7/D3Ah8BgwyDn30dQnvfe/a/jj7cCVwGig\n4V48fwA+D9znnJuMLUf0GaAz8M2oBy4iUghSA12wQPfll5MaTXaqquDww5s+Nnq0rQ28Zcuh3ZXL\nyuDIIy2wFxERKWaf+pQ1Z/zOd5IeSeEFusdjjaMubPhqLgh0PdDkvrz3vt459x7gB8D1WJflBcCV\n3vsVkY1YRKSArFtn2c2BA+3vU6ZYc6oDB6BLnpxxqquhf/+mj40aZdt16w4NdNevt0BXRESkmK1c\nCffdBz16wBe/CAMGJDuegipd9t6/23vfuaWvlP0+6b3v4r1f3+z1Nd77q733g733fbz3Z3vvX4//\nJxERyU9r1zaWLYMFuvv22ckvH3hvgW7zjG4Q6AYZ61RlZTByZORDExERyWk//amdPw8ehF/9KunR\nFFigKyIiyQoC3cDkybbNl3m6u3ZZ9rl5oHv44faVLtBVRldERIrdvn2Wzb3mGrj8crjnnqRHpEBX\nRERC1DzQHTzYSpfeeiupEbVPdbVtmwe6YD/XunVNHwvm7SrQFRGRYrZ8OdTUwAUXwPnn20oFNQkv\nL69AV0REQrNuXdNAFw5dgzaXtRbojhp1aEZ37Vordx47NuqRiYiI5K5ly2x79NEwcaL9eXnCi7Mq\n0BURkVBUV9vd23SBbktr0OaatjK6zQPdYO7xhAlRjkpERCS3LVsGgwZZM8rgnPj228mOSYGuiIiE\noqzMts3LeAsp0F23zjK4gRUrrLtkSUkswxMREclJy5ZZNhegb19boUAZXRERKQjbttl28OCmj48b\nBxs2wJ498Y+pvaqqbNtS6fLu3bB1a+NjK1faz9dJZ1MRESliqYEuWPmyAl0RESkI27fbdtCgpo8H\n81fXrIl3PNmoroZu3SxL21y6UqyVK1W2LCIixe3gQTs3Ng90VbosIiIFYft26NoV+vRp+vi4cbbN\nh/Ll6mro379xHeBURx1lP98bbzQ+tnIljB8f3/hERERyzbp1VrWVGugedZRldFOn+8RNga6IiIRi\n2zbL5jYPEktKoHv3/Oi8XF2dvmwZLMidNKkx0N2/35pTKdAVEZFiltpxOTBxoq1Nv2FDMmMCBbqS\np7xvbBojIrlh+3Y44ohDH+/UCcaMyZ+MbkuBLsCUKY2B7tq1Vq6Vj6XLzrlezrlbnXNPOOcqnHP1\nzrkrW9h3knPu/5xzOxr2/a1zblCa/Zxz7svOudXOud3OucXOucuj/2lERCRJa9bYzeARIxofC86N\nweoESVCgK3lnzhz75Rk6NPnafxFpFGR008mXzsttBbrHHgtLltjNthUr7LE8zegOAm4GJgGLgLTF\nZc654cDzwFjgq8APgAuAfzjnujTb/XvA7cDfgc8C64AHnXMfiuIHEBGR3FBWZkFuamPGYcNsu3lz\nMmMCBbqSZ3btgv/8T/tlGjIEvva1pEckIoHt21sPdPO9dBks0K2ttZP6s89ah+nUO9h5ZCMw1Hs/\nBvgykGZWMgA3AT2Bd3vvf+q9vx34EHAC8IlgJ+dcCTAT+In3/r+897/03l+EBck/cC7drGcRESkE\nZWWHLi3Yt681dtyyJZkxgQJdyTP33GMX07/6FXz3u/CnP8FLLyU9KhGB1gPdsWMt0K2vj3dM7ZVJ\noAtWvvzYY/C+9+Xn0kLe+/3e+61t78kHgDne+3/PsvLePwUsxwLewPuBLsDdzV5/NzACOKVjIxYR\nkVyVLtB1zpJSyuiKZKC+Hv77v+HKK+2iubTUyiIefTTpkYkIWOlyujm6YBndvXth48Z4x9ReVVWt\nB7ojR1oW9/bb4a234KKL4htb3BqytIOBV9M8vQA4MeXvJwA7vfdvpdnPNdtXREQKSFC63NzQocro\nimRkwQLYtAmuusr+3qkTnHMOPPVUsuMSEZuz2lbpMuT+PN22MrrOwZ13wrx51kn6nHPiG1sCGmZY\nsSnNc5uAAc65rin7prucCV5bEvLYREQkBxw8aJ2Vm2d0wQJdZXRFMjBnDgwYAKekFMCdfTYsWmQX\n2CKSnLo62Lev5UB3zBjb5vI83aCbe2uBLsCHPwyf/zx8+tPQq1c8Y0tIz4bt3jTP7Wm2T88M9xMR\nkQKyZQscOJA+0B0yJNmMbvOOiSI56/HH4b3vhc6dGx87+2y7OH3mGbjssuTGJlLstm2zbUulyz16\nwPDhuZ3RrauzKRJtBboAs2ZFP54csLth2z3Ncz2a7bM7w/1ERKSAlJfbNhczugp0JS+sXw//+hfc\ndFPTx0eMgKOOsvJlBboiyQmqKlrK6ELuLzFUV2fb3r2THUcOCcqOh6V5bhhQ6b3fn7LvmS3sB9bl\nuVUzZ86kX79+TR4rLS2ltLQ0o8GKiEj8ysps21Kgu3Wr3URObdw4e/ZsZs+e3WTfmpqa0MemQFfy\nwty5tk03H27GDHj99ViHIxKpigoLtrqny4/lqEwD3TffjGc82di507YKdI33fqNzbhvwjjRPn4yt\nvxtYBHzKOTepWUOqGdgavan7pjVr1iymTp3akSGLiEjMysqsamvgwEOfGzLEyporK5teH6S7iblw\n4UKmTZsW6tg0R1fywrx5MHmyzdFtbsoUWLo095ctEcnEvn0wfrydEH7yk6RHk7mgdLm1QHfs2PzI\n6Bb4vNv2ehR4n3NuePCAc+5sYCLwcMp+fwEOAp9p9vprgQ3ACxGPU0REEhAsLZRutfShQ22b1Dxd\nZXQlL8ybB6efnv65yZPtAnX9ehg9OtZhiYRu0SJriDR1qi1h89nPpj955Jrt29vOQk+caNnqior0\nd36TVmwZXefcdcDhQBDEXuScC4rP7vTe7wC+C1wKzHXO/RjoA9wILAZ+HRzLe7/BOTcLuNE51w14\nBbgEeCfwEe+9j+FHEhGRkHif2fVHujV0A0OG2HbzZrtej5syupLzKipg2TJ417vSPx/84uRySaRI\npl54wUqAvvlNW3P2rearkuao6mro37/1fY4/3raL2ixiTUYRztG9EfgWcA1WXnxJw9+/BfQH8N6X\nA2cAK4HvNbxmDvAfKfNzadj3K8DXgf8A7gJGAh/13v8+jh9GRETCsWCBrRufyRKemQS6SWV0FehK\nznuhoeDtne9M//yRR0KfPgp0pTC8+CJMmwZnnQXdusGTTyY9osxksizP+PFw2GG5G+gGGd1iKV32\n3o/x3ndu4Wt9yn7LvPfv8d738d4P9N5/3Hu/rYVj3uG9H+u97+m9P857/1B8P5GIiHTU6tVw/vnW\nTfmee9rev7VAt3dv+0qq87ICXcl58+dDSUnLZcnOWVZ3yZJYhyUSiRdftLWie/WCU0/Nn0C3pgaa\nNcw9ROfOcNxxuds8rggzuiIiIk08+qj1C7npJlvas7a25X0PHIBNm1oOdCHZtXQV6ErOmzfPsrmt\nzROYPFkZXcl/GzbYndFTTrG/n3uurRF98GCy48pEJhldgBNPzN2Mbl0ddOlimXQREZFi9Nprdq6+\n9loLeP/0p5b33bjRmsG2FugecUTjygxxK7hA1znXyzl3q3PuCedchXOu3jl3ZYav/XjD/s2/Djrn\nBkc9djnUnj3wyistz88NTJ5s83jV7kTyWRAAnnSSbadPhx07YOXK5MaUqUwyugAnnGDzjnfvjn5M\n7bVzp7K5IiJS3BYutIaYI0ZYZdnjj7e8b7CG7ogRLe8zaJAC3TANAm4GJmHr9rU39PHA/wOuSPn6\nGFAd4hglQ6+9ZneT2gp0x4+3C+ek5gCIhGH9essolpTY3487zrZvvJHcmDLVnozuwYO5OdWgrq54\n5ueKiIg0V1MDK1ZYrxCwG++LF7e8f3m5bVvL6A4cqEA3TBuBod77McCXgWwW5vg/7/2Dzb72hTtM\nycS8eXbhGVzwt2TMGNuuXh39mESiUl5uQW7nzvb3I46wuS3/+ley48pEphndY4+1hlT/+Ef0Y2ov\nZXRFRKSYBZVlU6fa9oQTrKpsx470+5eV2XmztfO/Mroh8t7v995v7ehxnHO9nXMF9/7km/nzbb5i\nlzZWfA4C3TVroh+TSFTKyw+9K3rccYWV0e3RA97/fvjd73JvqkFdnQJdEREpXgsX2nl60iT7e7As\nYEvXIUHH5db66CjQzS0OmAvUArucc39xzo1PdkjFqb7eAt2WlhVK1asXDB6sjK7kt7KyQ+e5HHts\n7md06+utK2MmGV2AK66wOfW51pRq506VLouISPFatMhusAcJpmOOga5dWz5ft7a0UGDQIKiqSqax\npgLdpnYB9wGfAd4P3AGcDcx3zg1PcmDF6K23oLKy7fm5gbFjFehKfisvPzTQPe44+38dLH2Ti+rq\nLDubaaB77rlWlv3tb8PevdGOrT2U0RURkWJWVtZYJQm2CsHRR7c8TzfTQNd7C3bjpkA3hff+Ee/9\np7z3D3jvH/Pe3wKchzW4uinh4RWd+fNtruL06ZntP2aMSpclf3mfvnT52GNtm4vNmwLVDa36Mild\nBrtTfOed8Ne/2g2q6dNh6dLoxpcpNaMSEZFitnFjY0PMwAkndDyjC8mUL7cx81G89/Odcy8D57S1\n78yZM+nXLKVRWlpKaWlpVMMraPPm2dyAPn0y23/sWHj++WjHJBKVykrrHN48o3vMMdCpk82PmTEj\nmbG1pabGtplmdAEuvxwmTIAHH4THHoOPfQxeeslKpJKyc2fbJ+zA7NmzmT17dpPHaoI3QkREJA9t\n2nRooHv88fDII1Z6HDTLBLs5vGULjB7d+jEV6Oa+MmBiWzvNmjWLqUGbMumw+fPhggsy33/sWNiw\nwUohu3ePblwiUQha9DcPdHv0gIkTc3uebnszuoFp0+zr8sut6dzdd8MNN4Q/vky1J6Ob7ibmwoUL\nmRasySAiIpJH6uqs38awYU0fP/54uxG/ciUcdVTj4ytX2jb1sXSSDHRVupyZscC2pAdRTDZtglWr\nMmtEFRgzxso/162LblwiUQkWXU+XUcz1zsvZZHRTnXQSnHUWPPlkeGPKhpYXEhGRYrVpk23TZXTh\n0PLlFStsO2FC68ft39+6MivQjZFzbqhz7ijnXOeUxwal2e+9wDTgiTjHV+zmz7dtewNd0DxdyU/l\n5VYSNGTIoc8FnZdzbTmeQLYZ3VTveAe8+mo448mWmlGJiEixainQHTQIhg8/tCHV8uUwYAAMHNj6\ncTt3tmBXpcshcc5dBxwOBJ2SL3LOBXmSO733O4DbgSuB0cD6hudecM69DrwK1GAB7ieBdcD34hm9\ngAW6Y8bYL1amSkrsjlFQApoPHn0U9u2D886zDwspXuXl9n84df5L4LjjrFvhxo3t+52IS02Nza3t\n0SP7Y5x0Enzve+kbYcRFywuJiEix2rjRts1LlyF9Q6rly9vO5gaSWku3IANd4EZgZMOfPXBJwxfA\n/cCOhsfrm73uIeAC4FzgMGATcC/wLe+9SpdjNG9e+7K5YC3QhwzJn0D36afh0kvtz5MnW8auU9HW\nWMjmzelPLtDYeflf/8rNQLe62rK5rS0Y35Z3vMO2r74KF10Uzrjao75epcsiIlK8Nm2ym73pmsAe\nfzz8+tdNH1uxwnqIZCKpQLcgL6u992O8951b+FrfsM8nvfddgr83PPYN7/007/0A732PhuNcryA3\nXjt3wuuvZ75+bqoRI6whVa6rq4OrroIzz4RnnoE337SlVqR4bd/e2LChuVGj7MSTq/N0a2qyn58b\nGDECBg+GV14JZ0zttWuXbZXRFRGRYhRUVKW7aX3CCfb8tpSIaPny9gW6FRXhjLM9CjLQlfz28svW\nwjzbQDcfMrqPPALr18MvfmHB7imnwA9/mPSoJEkVFS3Pc+nUCaZMyd3Oy2EEus5Z+XJSge7OnbZV\nRldERIrRxo0tV5adeKJtg3N0ZaVdt+R66bICXck58+dbGeTRR7f/tfkS6M6eDWecAePG2d8/9zl4\n9lk10ipmrWV0Ibc7Lwelyx01ZQq89VbHj5ONujrbKqMrIiLFKN0auoFx4+waO1gdIThXK9AVaadg\nfm4281WHD8/9QHfzZnjqKUhdgvPcc237/PPJjKnQbNsGX/kKPPZY0iPJXGsZXbBAd9ky2L8/vjFl\nKoyMLtjv76ZNyXSXVkZXRESKWWvNIJ2za9Ug0J0zx5qoBj1E2qJAVwQrWX7xxfY3ogqMGGHdaYOL\n1lz0hz9YZ90PfrDxsQEDLJulQLfjqqvhmGPg+9+Ha6+FPXuSHlHb6uutDKi1QPfYYy3Iffvt+MaV\nqbAyuiUl1oW8srLjx2qvIKOrQFdERIrRpk0wdGjLz59zjlWWbd4MDz8Ml1xiKy5kYuBAu1aI+2a9\nAl3JKW+8ATt2ZDc/FyzQhdxuSPXEE3D66YcGNaedpkA3DM8+a3cNH3sMtmyB++5LekRtq6mxmzyt\nlS6ndl7ONWFldIM7ycFafnEKbo6pdFlERIrN/v1QW9v6dcjZZ9v2lltg1Sr40IcyP35w3LhvZCvQ\nlZwyb54tE3TSSdm9Pgh0c7V8ed8+C8SCUuVUp51m2botW+IfVyF59lkYORLe9z748IfhBz9IphS2\nPYJOhK1ldA8/HI48Mjfn6YaZ0YXGtfzipIyuiIgUq+pq2w4Y0PI+Q4bAe98LP/uZXa+8+92ZHz8I\ndOMuX1agKzll/nyYNg169Mju9cEao7ka6L70kmWOzjnn0OdOP9228+fHO6ZCM3eudbJ2Dv7zP63B\n18KFSY+qdUGg29qdVLB5uoWc0Q1KppIMdJXRFRGRYhNkWvv3b32/xx+31VH++c/My5ZBga4IYIHg\njBnZv75nT7vLlKuB7pNP2t2yoE17quHD7UJ/0aL4x5WtqiqYNQtuuy3pkZjqanv/zjjD/n766fZ+\n//GPyY6rLcEHf2sZXbDy5ddfz60M9b59sHt3OBnd7t3tZJhEoLtzp82d7949/u8tIiKSpKoq27aW\n0QVrFHvyyemvY1sTBLpxr6WrQFdyxrZtsHYtTJ/esePkcuflJ5+0OQ4tdZSeMgWWLIl3TNnat8+a\nhn35y3DzzfDnPyc9Iit9994yugBdusBFF+V+oJtJ6TLAWWfZ/NXFi6MfU6ZqamwbRkYXrHw5qYxu\nr15WCSAiIlJMMs3oZuvww+3aVxldKVrBItQnn9yx4wwbZh3hck1dHSxY0DiZP518CnTvucfmFL/y\nis2H/exnG8s/k7JsGfTpA2PGND52ySW23tubbyY3rrZs325zQ9vKJp5xBvTtC3/5SzzjykQwryeM\njC4kF+ju3Kn5uSIiUpyCjG5UgW6nTnYzX4GuFK0FC6y0YfTojh1n6NDcDHTnzbPOukG2MZ0pU2Dl\nSti1K7bRaL93AAAgAElEQVRhZaW2Fm69Fa66Ck44Af77v63T9VNPJTuu9eutEVVqVu688ywIe+CB\nQ/evq4Pnnks+Q9rWGrqBbt2sEUQuBbphZ3SHDUsuo6tAV0REilFVld1s79kzuu+RxFq6CnQlZyxY\nYNncjpYODhuWzPIkbZk714LwiRNb3ufYY630dtmy2IaVlV/8wpaB+uY37e8TJ1rH63nzEh0WZWXW\nmThV9+5w+eUW6B482Pj4rl1wyimWJZ02LZngKlBR0XYjqsDFF9s83VxZT7dQSpd37lQjKhERKU6V\nlZbNjXL6jjK6EqmqKrj6auuWlmu8bwx0OyrI6OZSwx5o2g24JcccY9tcLl8+cAB+/GMoLW3scu1c\nbqwDnC7QBfj4x23e9jPPND72hS9Y9vxvf7O5vA8+GN84m9u+PbOMLsCFF1rVwyc+Ef/C6+lEUbq8\neTPU14dzvEwpoysiIsWqqqrtRlQdpYyuRKaqyhrZ/PznVsqZa519N2ywrFZ7u7ilM2wY7NnTmGnK\nBTt2wKuvtr3mWO/eNr80lwPdP/zBSoS/8IWmj592Grz2mmXGktJSoDt9umXLb77ZsrqPPgr33gs/\n+hG85z2WJf3Nb5K7OZJp6TJY1nH2bJsbXVraOK8mKcHvWd++4RyvpMQC+LhPhkEzKhERkWITZHSj\npEBXIhM0Dpo/H0aNguuuS3pETQWNgqZM6fixgrU4c2mebibzcwOTJ+du4yTv4Yc/tHWAjz++6XPv\nepdle5OqGNi92zp3jxx56HPOwd1329g+8hFbX/eDH7QKB4Arr7SbC0mtUdue0mWwJbgeftjmRJ9+\nunXATkp1td2g6dIlnOMNHmzbuE+GakYlIlJc3n4bfvYzWLEi6ZEkTxldyWsPPWTLrJx6Ktx0E7zw\nQm7NA12yBA47rOONqMAyupBbge7cuTauCRPa3nfCBCupzUXPP2+Z6S9+8dDnJk+28tUXXoh/XNC4\npFS6jC7YUkhf+hI8+6wFhz//eWMZ+bnn2hqqSQXpFRXtP8F84ANWir1sma1lnJSamvDm50JjCXRQ\nEh0XZXRFRIrLDTfANddYxdfatUmPJllxZXS1jq6EbulSy1SVltrfL77YyiR/+ctkx5XqzTdtfmpL\n68u2R5DRzaWGVHPnWtlyJpP8J0yANWssO5prbr/dAtrzzjv0uU6d7N8wqSZJZWW2bSnQBbjjDrsB\n8pe/NP1A79YNxo1L7uZPdXV2J5gTToDrr4dvfatxDby4VVeHNz8Xkgt0ldEVESkeGzbAk0/adc2B\nA/D3vyc9omTFldGtrY23Ck2BbhF46CG7eDz/fPt79+5wxRVw//3xN3xpyZIl4ZQtg12sHnZY7mR0\na2tt7momZcsA48fbh+66dZEOq92eeQaeeAJuuaXlgH3ChORKgIJAd8SI7F4/aZKttxu3ffusA3S2\nd1I//3l7fVIdr8PO6AbvQ9xzj9WMSkSkeDz4IHTtCtdea308nnwy6RElq6oqnowuxJvVVaBbBJ5/\nHs4+2wLcwMUXw9atuTEXtL7ess6TJ4dzPOdya4mh9szPhcby5lyaM3LggJX9nnwyXHppy/tNmADL\nl8c3rlRlZfYhmu0acEkFukFAl21WdOTIZJd2Cjuj26OHZdiTyOiqdFlEpDg8+KBdC/frZ31Hnn66\n6RKExaayMp6MLlj8ERcFugXOe+uw3Lyb8YwZdjE5d24iw2pi3Tq7yAwr0IXGJYZywdy5tgzP+PGZ\n7X/kkfZvk0vzdL/1LVu7ddas1suvJ060wC3uORhggW66RlSZOvpo+7+4a1d4Y8pEENBleyfVOZt/\nXCgZXecscE5ijq4yuiIihW/nTli82PpzgG0rK+06pxjt3g1790af0R0yxLZbtkT7fVIp0C1w69bZ\nBWPzQLdnTwt2cyHQXbrUtmEGusOG5U6g+8wzba+fm6pzZxg7NncyunPnwm23WbB76qmt75tkNnrD\nhsZ1fbMxaZLdGIo7I93RjC5Yx+tXX7WTVdxqasLN6IIdL87SZe+V0RURKRb/+pd97gfXxtOnWzVR\nUjeMkxb0+Ig6oxsEusroSmiCu1MnnHDoc2ecYR1ok56nu2qVlVVnO7cynaFDc6N0uaYGFi7MvGw5\nMH58bmR06+rgqqtsjdyvfa3t/YOsdRLly1u3Ni5Nk42jjrJt3OXLHc3oggW6+/fb2rpxq64ON6ML\n9l7EmdHdvdsuepTRFREpfIsW2ZJ4QW+Yrl2TnXqVtODGctQZ3Z49oU8fZXQlRIsW2cV/sOROqjPP\ntBLTpOfprlljywqF0XE5kCsZ3Xnz7EZCewPdXFli6Lbb7H385S8z+/fp3RtKSpLJ6G7bBkcckf3r\n+/e3u41xd14OI6N77LF2AnnttXDG1B5hly5D/KXLdXW2VaArIlL4Xn/dVolI7V0zcWLuVNLFLa5A\nF+w6S4GuhOb11y2bm65sdvp0e3zBgvjHlSoIdMM0dKgtSh1nC/N0nnnGMtXjxrXvdePHw+rVyS4x\ntGsX3HsvfPazmc8vhuTuinY00IXG9z1O1dV2Z7kjZbOdO9vvUNzrAHpfGKXLO3faVqXLIiL5Z/Hi\n9vUGef31Q6f0FXNGt6bGtmGfy9NRoNtBzrlezrlbnXNPOOcqnHP1zrkr2/H6fs65nznntjrn6pxz\nTzvnTmz7lblp0aL0ZctgF3WTJiWTBUq1di2MGRPuMYO1dOOcB5DO3Lntm58bGDvWgtwNG6IYVWYe\nesg+/K69tn2vSyIbvXu3BSsdDXSTqASoqrKTS3v/jzQ3alT8S1Lt3GldKvO9dFkZXRGR/LR+vfWc\nOeusxpuWrdm/H95449BAd+JEa2qZRK+LpNXW2rZv3+i/1+DBCnQ7ahBwMzAJWAT4TF/onHPA34DL\ngTuBLwFHAHOdc+3MySVv1y77pT3mmJb3mTbN5pAmxftoMrpBqXaS83Srq+2uYXvLlqEx8F+zJtQh\ntcs998B73mNBd3uMHAnl5dGMqSXbttk2XwPdMMqFRo+OP9ANgtEoMrpxBrrK6IqI5Kevfc3mfa5a\nBddd1/b+b79tHYabJ4EmTLBr0lWrohlnLquttcqwHj2i/17K6HbcRmCo934M8GWgPXmSy4BTgI97\n72/z3t8NvBs4CNwa+kgjFpRgtlZ2Om2alXwkVSJbVWW/YFFldJOcp/v88zY/993vbv9rR42ybVKB\nbmWlNTb60Ifa/9oRIyyTvndv+ONqSRDodqQZFSSzLFVY69COGhV/6XIYjbTSibt0WRldEZH8s2KF\nrYf7ne/ArbfC7NmNn+ctCfrSHHts08cnTrRtMZYv19ZaNrejlWWZGDJEXZc7xHu/33uf7Vv4QWCz\n9/5PKcfbDjwMXOyc6xrGGOMSlI+2Nj906lTYsyf+BjyB4MI87EB38GBrnpRkoDt3rq2Jm83P1qOH\nNXVKKtB98UXbnnZa+18bdM/euDG88bQl+NDsaEY3mNu9f3/Hx5SpMDO61dWNc23iEGVGt6Ymvo7w\nwYWRMroiIvnj2WftWu/yy+H977e+LP/8Z+uvefNNO9c3X0rniCMs2CvGhlRBoBuHINCN6/xecIFu\nB50IpCvkXQAcBkyMdzgds2qVXbgF61alE8xRSGqebhDIhV263LmzfWglWbqc7fzcwJgxyQW68+ZZ\nGW82QXoQ6MZZvhxW6XISc7vDzOhCvOXLUQW6/fvbSbCtO/NhCUqXldEVEckfL74Ixx1npcvjxsHR\nR8OcOa2/ZunS9FP6nLOsbjFndOMwZIhVkcZVtaVAt6lhQLrQKHisJMaxdNjKlfaL31qg1aeP/WIH\n6+3Gbc0aC8YHDQr/2EkuMVRbm/383MCYMfF3AA7Mm2drs2YTpCcV6Pbu3fH5JUmUvIeV0S2kQDc4\nXlzzdOvqLCsQx/wkEREJxwsvwCmnNP79wgvhr39tPVv45psweXL658aNS+66K0lxB7oQ3zxdBbpN\n9QTSzSzcg8317RnvcDpm1arMlrWZMiW5tXTXrrVsbhTzAoYOTS6j+/LL1tTg1FOzP0ZSGd29e21+\n7jvfmd3r+/SxD8w4O0aHsbQQJBPohpXRHToUunWLP9Dt3j38ADF4P+K647tzp91wi2N+koiIdFxl\nJbz1VtPrrPe8xwKoN95I/5p9+6w0uaUmrSNGJLvaRVLiDHSDXioKdJOxG+ie5vEeWPfmvGo6vnJl\nZuufHnOMlXIkoazMuvRGIYnGQoEXX7Qs3cQOFLuPGWOBetyt7hcvtmC3I0H6iBHxZ3TDCHSPOMKC\nnXzM6HbqZL9LcTakCitIby54P+LM6KpsWUQkf7z0km1TM7onnWRT115+Of1rli+3JfFayuiWlFig\n6zNer6UwJJHRjWuKWJd4vk3e2ISVLzcXPNZqe52ZM2fSr9mCkqWlpZSWloYzunbYv9/WFsskozt5\nsgVUYV1wt0d5uXV+jsKwYfDMM9Ecuy0vvGDrunXqwK2kYFmfdetsveO4BI3JWluWqi35Guh27Wpl\n9HEFuvX11nQprGAx7iWGgjWAwxZ36XKQ0W2P2bNnM3v27CaP1cTZCSwmzrkzgHSfpB44xXu/IGXf\nU4HvY/0uarFGjl/33mewuqWISOZeew0GDmy6BGKvXnD88ZZsuPrqQ18TVC+2dH0zfLgtzRnmeTkf\n1Na2fynJbPXpAz17xnedpUC3qUXAu9I8PgPYBbQ6RX3WrFlMnTo1inG127p1dtcqk4xucGdr6dLs\ny1WzVV4OF18czbGDjK738ZYk1tfbncYvfrFjx0ldSzfuQHfkyI51oB0xIt5y+G3bwnuP4qwE2LHD\n/r+EdYOppCTeNQCjyugG9wvjKl3OJqOb7ibmwoULmRbVnbvk/Qh4tdljK4M/OOdOAJ4ElgIzgRHY\nWvTjgQtiGqOIFIlVq2zt2+bXdzNmwNNPp3/NG2/YOX7gwPTPDx9u2w0biivQ3bEjvoyuc3aNGddN\n+aItXXbODXXOHeWc65zy8B+AIc65D6TsNwi4FHjMex/joiMdE0ymz6Rr7sSJVuoR9zzdffusdCH4\nYAnbsGFWght3kuWtt+x7ppbTZKOkxP5d4szQgY3/6KM7dox8zehCvIFuEMiFFegecURjB+o4VFdH\nUwXSrRscdli8pctaWqhN87z3Dzb7qkx5/rtAJXCG9/5n3vtvAJ8FznfOnZPIiEWkYK1Zkz4LOWOG\nXceku1H62mu2rGZLUgPdYhJn6TJY9Vlc06wKMtB1zl3nnLsJ+FTDQxc5525q+OrT8NjtwDIgNcz6\nA/AycJ9z7mbn3H9hJVudgW/GM/pwrF9vd02CDrit6d7dMr9xz9MN1lnNZIzZCBoLxd2Q6pVXbHvy\nyR07Tpcu9qGbRKDb0ezoiBH2vh84EM6Y2pKvgW7YXYuTCHSjuuvdp0+8ywtpjm7bnHO9m90cDh7v\nA5wD3N+sTPm3wE7gQzENUUSKxOrV6ZM5M2bYdsGCpo97b4Fua0U3JQ1rqyjQjZYC3Y67EfgWcA02\nj+iShr9/CwjyDx5o0oDce18PvAf4PXA9NtdoK3Cm9z6vlpAuK7OMZrdume1/zDHxZ3SDD5KoA924\nG1ItXmx3GcP40Bg1ym5axGXfPmti1tGM7vDhVpIbx3u/f799SIe1RFWc3borG/JhYWZ0q6rsPYlD\nlIFu795WThUHNaPKyH3YvNs9zrmnnXOpl4vHYlOhmqzI3lAFtQibsysiEoq9e+0aMl1Gd/x4ux54\n/vmmj5eX243g1gLd7t3ttRtb7chTWA4etHOgAt084r0f473v3MLX+oZ9Pum97xL8PeW1Nd77q733\ng733fbz3Z3vvE1plNnvr17evm/Exx1gmL05BaWuUpcuQTKB7/PHhHGvUqHgzuqtW2YdeRzO6ca6T\nls/lv1GMHaCiIpzjtSXqjG5cgW42zaiKyD6s2ulzwEXATcAU4HnnXPBJNwy7edzSOvR5tQa9iOS2\ndessQ5suo+scnHnmoc1IX2u4DddWG4Xhw4sroxtUTsUd6FZVxTO1sCADXbFA98gjM99/3Dj7xd6z\nJ7oxNbdhg11cNmtUHZreve34cQa63ud3oBvc7OhoRjfO9vFhB4sDBliGOI6y62DsYZYuQ3yBeqEE\nusrotsx7/6L3/kPe+1977+d4778PnIIFtt9r2C1YY76ldejzag16EcltQR+aljoFn3WWlS6nTn95\n7TVbw7Wt5EqxBbq1tbbt06f1/cIU3KCII6urQLdAtTejO3asBWlxrsFZXm5ly1F2RI57Ld2NGy2b\nFlagO3KkHTOuUtS33rLApaPzXYPX52NGd8AA28bRCKmqym70dD5k1mN24gx0vS+cObpqRtU+3vtV\nwF+AdzvnHI1rzLe0Dn1erUEvIrltzRrrY9LS1Ld3v9tuVs+b1/jYK69YNreta85iDXTjzuhCPDGH\nlhcqQN7bHN32BLrBerurVsW3lM2GDdGVLQfiDnQXL7ZtmBnd+np7r4IPhiitXWt32jp686F7dwuA\n8jnQrawMb95vS8JeuzrOQLeuzv5vRjlHN64SbDWjykoZ0A3ohZUnO1pehz6jGW+5tBa9iOSu1avt\n+qilm8RHHWXXf888A+efb8Hc3Llw221tH7ukBB5/PNTh5rQkAt3Bg6Fr19ncdNNsfvnLxsejWIte\ngW4B2rbNJuq3J9AtKbHgJM41OMvLM1vntyOSCHT79g0vKB01yrbr1sUT6JaVta/kvTVDhuR/oBu1\nyspwA90+fawBXRyBbpDxjmJ5IbCfJa4KE2V0szIO2OO9r3POLQEOAO/A5vMC4JzrCpyANXhsUy6t\nRS8iuaulpYUCzlmA+9BD8O1vw5w5dl182WVtH3v4cLt22b8funYNb8y5KolA1zkYN66Uc88tZdas\nxsejWItepcsFKOjS255At1Mny+QF8x7iEJQuRynODroAS5bAlCnhlWMH/4ZxzdPN10C3S5fwApU4\nA92wM7rOxddMK+ylkZqLa46u98rotqZhLfnmjx0PXAj8HcB7Xws8CVzhnEv9TbwSy/g+HMNQRaRI\nrF3bmAhoyY032jXNb34DDz8M06e3/RqwQNf7+BuZJiWJQBcsebNmTfTfRxndAhQEuu0NWMaNiy+j\nG3yIBEsARSXujO7y5XDcceEd77DDrHw2XwPduJpR9e8f3s2FIPBMt9h82MIOdKGwAt045uju2WMl\n2Ap0W/R759xu4AVsub3JwKeBOuBrKfvdBMwHnnPO/QwYAXwR+Lv3/p/xDllECtnGjfC+97W+z+TJ\ncOmlMHOmfc7fcUdmxw6m1G3YEN71UC4LAt24z4HHHQf332/xQJS9epTRLUDr10OPHu2fXzh2bHyB\n7o4dtmbr4MHRfp+hQ2H79niaOXkPK1bAhAnhHjeutXR37LBW72F9sA8eHF9GN8xgsWdPK+OPK6Mb\nZJDDMmhQPIFu2B2jm4trHd2dO22r0uUW/QkYCMwEfgpchpUnn+S9fzvYqWEZvnOAXcD/YMHwzxv2\nFxEJxcGDdm1RksGiZXfcAVddZXNzP/3pzI6fGugWg9paO9+G1RQzU2edZRWXb7/d9r4doYxuAQoa\nUbX3Dsm4cfCzn1l2o1PEt0CCC/GOdvdty7BhFoBu25bZh2JHbNtmgeLEieEeN64lhsrKbJuPpcth\nl/8OGJCfpctgv1NxLHYfZHSjWh4sKF2O+m5vkDVWRjc97/1dwF0Z7vsCcFq0IxKRYrZ1q12nDkvX\n+q6ZMWPgzjvbd/yBA+1mdxzn0VxQWxt/2TLAu95l086eeiraJrhZhzPOuc7Oueudcy845yqdc3tS\nnjveOXency7k3JZkor1LCwXGjbPJ+nH8cgclrVEHukFpdBzlyytW2DaKjG6+Brrbt9vd1yhFkRWN\nK9ANuxkVxFe6XFFhwWH3dAvKhKBPH/u/szfdyqwhCgJdZXRFRHJfcI0aVfLCOTt2MWV041xDN9Cr\nF8yYAU8/He33ySrQdc71AJ4CfgQchS0In9qbbB1WtvSxjg5Q2m/9+uyClaCrbxxlsnFldOMMdJcv\nt23YnaRHjrR/E+/DPW5zZWX2AR/Wkk9Dhthd1+3bwzleS6LIisYR6NbXW1Y0XwPd7dvtzndUghNv\n1OXLQemyMroiIrkvaDAaZZVeMa2lm1RGF+Dss20JqH37ovse2WZ0vwacDnwDOAL4WeqT3vtq4Fng\n/A6NTrKSbUY3eE2cgW6UF8rQOAc4rkB35Eib4xmmUaOskULUwUtZmd0YCKudfvDeR92QKqpAN+pm\nVLW1dvMiikC3oiL6THpFRbS/v0HgGXWgq4yuiEj+2LjRptdF2eOlmALdHTuSC3Qvu8yuhVKXGApb\ntoHu5cCz3vvveO/rgXS5pjVAFuGWdMTevRbUZRPo9u1rX3EFugMGRL9GWdeu1pwnrtLlsMuWoela\nulEKs+MyWEYXop+nG0Wg279/9BndIJAOu+x64EDLFkcdIFZUtL/hXXsooysiIs1t3GjXF1E2Tyq2\n0uWkAt3Jk+GGG+Bb34JXX43me2Qb6I4CFrSxTy0QUT9OaUnwi5lNoBu8Lo5Ad+vW6MuWA3Gtpbt8\nefiNqECBblvytXQ5CHTDHnvQBTloFhWVuEqXo15iSM2oRETyx8aNmTWi6oggoxv1lLFckNQc3cA3\nv2lT/k4+Ge67L/zjZxvo7sBKllszFoh4dp40l+0auoGRIxubEkVp27Z4A904Mrpr1tgSTWEbMMDW\n0436BsTGjeHNzwUrBe3VK9pAd/9+C1QU6DaKK9AtlNLlnTttbnrYUw5ERCR8mzZFv4rG8OF2bgjW\nmC1kSZYug33v116Dz38e7r47/ONnG+i+DFzonEu7sIRzbjjwXuD5bAcm2Qkj0I2rdLmQAt3aWgu4\nRowI/9jOxdN5eevWxixsWKJeYiiqYDEIdKO8mxsE0vkc6BZC6XJdnd2QiXIJIxERCcfGjfEEulAc\n5ctJli4HunSB7363sYFsmLINdP8bGAD80zk3HegM4Jzr7pw7A/g/oBu2aLzEaP16u/g87LDsXn/k\nkfGVLkfZSCDVsGHRB7rBh2GYGdFUUQe6Bw5Y4BL2v8ngwdE2o4oy0D14MNogq6rKgquw16GNI9D1\nPvrS5TibUakRlYjkE++tF0Mxiqt0GYon0E2ydDnQowfceGP4x80q0PXezwU+B5wIvAB8veGpncDT\nwCTgs977V0IYo7RDth2XAyNHWqYpaNASlULL6OZ7oLt9u504ww508zmjm3r8KFRVWVDaKevVzNML\nAucoA92dO205gCgD3S5drJw46jm6O3dqfq6I5I9bbrFAb+LE6K/Vcs2BA3bzPOqMbnD8Qg90vU++\ndDnVaaeFf8ysL7G893dhge49wCJs7dwlwC+Aad77e0MZobRLRxsKBUFylPN0vY8/0K2ri/aCOfgw\njOrDd9QoWLs2mmNDY9ZVpctNj1dREe5xU0XRRAus03ivXtEGusH7EvXyYL17K6MrIhJ47jnrUPue\n90B5uZV7FpNt2yyTHUWJa6oePez8tnFjtN8naXv3Wq+TXAl0o5hC1KUjL/beLwGuC2ksEoL16+Gs\ns7J/fepaupMmhTOm5urq7JcrzkAXLOCKKnOzYYNlAXv0iOb448ZZ4FJZGf5yNNAY6Cqj2/R4UQaL\nUQW6YJniOALdKOfogpVTxdGMShldEcl1Bw/C9ddbd9pf/tKSGnfcAddc07FKvnwS1U35dIphLd2g\n2VYulC5HJeSiOUmS9x0vXR4+3O6oRDlPN6qgqiVBoBtl+fKGDdGVLYMFugCrVkVz/CgD3a1bo2vq\nVFVlJa5hZ+TimOdaWZm/ge72hn76UWd0+/SJZ3khBboikuvmz4d//Qu+/32b8vKlL9n12qOPJj2y\n+MR5/VgMgW5wIzlXMrpRyCqj65w7NdN9vfcvZPM9pP1qauyirSOly1272tyPKEuXt22zbdwZ3SjX\n0o0r0F29Gk46Kfzjb91qDczCDhgHD7aymOrqaIK6ICsadrlLHPNcq6qiyc5DfBndOALdODK6Kl0W\nkVz3pz/Z9Vkwj7FPHzjnHPjzn2HmzGTHFpc4rx9LSmDx4ui/T5KCjK4C3UPNAzLN0XTO8ntIOwXB\naUcCXYh+iaFgWZWoL5ID/ftbAB91Rvf446M7/uGH288RVUZ3y5Zo7pAG5UVbtkQb6IatSxfL8kUd\n6I4fH82x4wh0u3WLPkCMa45u1CXYIiId4T388Y9wySVNGxi+//1Wurx9e3F8jm3dak0K47g5OXw4\n/O1v0X+fJBVD6XK2ge53SR/o9gOmAqcCfwNez/L4koV8C3SjymY151z0nZc3bID3vje644NldaMs\nXY460I1izneU81z798/vObrl5dEcGxovqqJee7ZPn2g7X4OaUYlI7lu40K7LPvCBpo9feCFcfTXM\nmQOf+EQiQ4tVcK0Sx7rnw4fbtcuBA3bzuxCpdLkF3vv/19rzzrnLgZ8Dre4n4Sorszt9He38e+SR\n8HqEtygqK61pU8+e0X2P5qJcS/fAAfswjLJ0GfI/0I1CPjd0inrsS5ZEc2ywjG4cFRm9ekUbsIOa\nUYlI7nv8cftcP/30po8PGQInnghz5xZHoLttW3z9XYYPtw7PmzfDiBHxfM+4FUPpciTNqLz3DwHP\nArdHcXxJr7zcArqO3nkKMrpRNRCKqnNwa6LM6G7ZYh+GCnQP1a+flbgGDSTClq+B7sGD0c1bhnhK\nl+MKdKNeJ1LNqEQkbo8+assGfuc7dj5oy9//bvNxu3Y99LkZM+Dll8MfYy7aujW+/i7BNV0hN6Sq\nrbUEWZyJp7hF2XV5KXBKhMdPyznXzTl3h3Ou3Dm3yzn3knPunAxed4tzrj7N1644xh2Gjq6hGxg5\n0pb/CSb9hy2pQDeq9dCC40a9gPm4cfaBu2dP+MfeujWadv3OWQCdrxndqMpma2psm6+B7pYt8Szv\n0Lt39IGumlGJSJweegguvdQSEzff3HYjqcpKWLAAzj8//fMzZsBbb0U/zSMXRHVTPp1iCHR37LBs\nbvRvIO0AACAASURBVByl4EmJMtA9nswbVoXpt8DngQeAG4ADwN8y7BTtgWuAK1K+PhnROEMXZqAL\n0c3TTSLQHT48ukA3yBRHvYD52LGWZV+7NvxjR3nyiHIt3XztXBzV+r+Bww+3O7X19dEcf/Pm6P+/\nQ/QZXe/tRF/IjThEJHd4D7ffbkHriy/Cd78L99zT+nn9ySfts/y889I/P2OGbRcsCH24OSfOQHfQ\nIKtIi+raMRfU1hZ22TJkGeg650pa+BrpnDvFOXcvcA7wdLjDbXNcJwMfAr7qvf+q9/4XwNnAOuD7\nGR7mUe/9gylfv49qvGELK9ANjhHVEkNJBLolJfYBuX9/+McOynKjLqeJai3dnTth1678DXTzMSsa\nBLpRBuneN86/CduWLYUR6O7aZReQCnRFJA7PPWdL1nzhC5ZFu/56+7y+7baWX/PEEzB5csvzRMeP\nt3PJSy9FM+ZcEuccXefs2rGQM7q1tYV//ss2o1sOlKX5WoMtPfRpLLj8QghjbI9LsQzuz4MHvPd7\ngV8CpzjnMplF2ck5l3f/7N6HF+gOGmTNogoto+t9NPN0t2yx+YpRd+UbPhy6dw8/0I06UI8q0N2/\n3+ZX5mPX5TgyuhDN+Pftszm6cZQuB4FuVP0CiqHjpIjkjnvugaOPtvm2YJ9xX/oS/Pa36TOHBw5Y\nR+ULLmj5mM7B9OmFH+ju3m2f2XHN0QW7uRDlKiRJC0qXC1m2ge6DLXw9APwE+Bgw2Xu/NoQxtscJ\nwHLvfV2zxxekPN8aB6wGapxzO5xz9zvnYrp31DEVFTZ3M4xA17lolxhKKqML0ZSgRDW/tblOnWDM\nGFi9OtzjVlTYNqrmQkOGRNOMKgji8jGjGyyxlY+BbvBvGVdGt74+mnnpUBxrCIpIbvAennrKlghK\nnRN59dV2E/vuuw99zfPP23JuH/xg68cOGlJFdVMwFwR9Y+LK6IJly1eujO/7xa0YSpezXV7oirAH\nEpJhwKY0j2/CgtjW2gVVYUH6i8Be4DTgs8BJzrl3pAmec0pYa+gGRo6MrnQ5ynmVLYmyqcCWLfF9\n8EbReTkIdKNabD6qZlRxZEXr6qJZQ6+qym5cRBVgRRnoxjUnHRqbRO3cGU1XSGV0RSQuy5dbsHba\naU0f79cPrrrKsr1f/3rTz7pHH7XrupNOav3YM2bYeWXFCpg4Mfyx54IkAt0JE+DPf7YbCIXYsKm2\n1v7/FbIom1EloScWpDa3J+X5tLz3d3rvP+e9f8h7/yfv/ReAjwMTgc+EP9RwhR3oHnlkNBnd+vpk\nMroDB1pTgSgC3bgyumANqcIOdLdvt22UGd1duyxoDFNc5b9Bh+QwVVXZ8TtF9AkcjD2KLpxJBbpR\nKIY1BEUkNzz3nH3mn5qmNeoNN9i10a9+1fjYgQPwpz8dmgFO5+STbVvI5ctBNVGcge7EiXbDOEgI\nFBqVLuef3UD3NI/3SHk+Y9772cBmrLFWTisrs/XVwgq4SkpgU7rceAft2GHBbtyBbtBUIIrS5bgz\nuqtXh9tNt6LCyqYOOyy8Y6YK/k+GndWNq/w3imAx6qqGIFMcZCzDtHmz/T7FMU8q6kA3eH9Uuiwi\nUXvuOTjxxPSfN+PGQWkp3HGH9UGAxnm7n8xg7Y/DD4dJk4oj0I1zju6ECbZdsSK+7xknlS43cM4t\nz/L43nt/VJavzcYm0pcnD2vYZhPmlAEZXZLOnDmTfs1qAEpLSyktLc3i27ZPWZmV54aVIQqCwvr6\ncLNOQXASd6AL9v7ke0Z33Dhb43jjxpY7MLZXRYVlc6Mqy0kNdIPO0WHI54ZOUXaLBrtx0b17NF2X\nt2yxC42om69Bbmd0Z8+ezezZs5s8VhNF+l9ECsLzz1t2tiU33QQPPmgdmL/+dfj2t2293eOPz+z4\nwTzdQrV1q31Wd0+XzorI+PG2XbECTjklvu8bl2LoupzppcphJLMmbnstAs50zvVuNqd2Bjb+RVkc\nczSwMJMdZ82axdSpU7P4Fh0XVsflQEmJlc1s3x5utjLJQDeKjG4U71FrgkBx9epwA92o5udC43sT\ndkOqqioLtoJgKGxBIBpFoFtZGW2gC3byiiLQ3bw5vhs7vXvbNspAt0uX7C6c0t3EXLhwIdOmTQtp\ndCJSKLZsgXXrWg+Wjj4avvlNuOUWmDXLbmrPmZP595gxA+6/36YKRVWhlaQ4lxYK9OplSZLl2ab7\ncpxKlxt470d474/M5ivqH6CZP2DB+9XBA865bsAngJe89xsaHjvSOdck0+ycO+RS3zn3GeAI4IkI\nxxyKsAPdoHlT2IFhoWV0KyqsSUFcF/5jxtg2zHm6QUY3KgMHWlVA2KXLQVY0qkx0Pmd0wU5eUZUu\nxzE/F+IpXe7btzCbjIhI7li82LYntLH2xze+AY88YnN2Fy+29XMzNX06HDwIr72W/Thz2dat8Qe6\nYOXLhVi67L1Kl/OO936Bc+4R4HvOuSHASizIHQWkznK4HzidpoH+Oufc74E3sOZVpwEfxrK5P4t+\n9B1TVpa+wUG2UpfjaeuDuT2inlfZmigyukHwFteHb48elskNs9399u3RBrqdO1upa1SBblSCACiK\nQLeiwu7eR6lv3+gyusENl6jFUbpc6GVbIpK8xYvt8yyT6TuXXmpf7TVlimVyX3rp0M7OhWDr1njn\n5wYmToRXXon/+0YtWKO+0M+BhdaMCmwN3x8BVwA/BjoDF3jv56fs44Hm7XweAE4CbgFmAdOA24Ez\nvPcRreIYjvp6y1SGmdEdMsQu8qPI6HbunMwv1vDhdmEbZvffoBw3rowu2IdumHcXo87ogr0/+Rbo\ndupkwWJUa9FG/X8mytLluDO6YXfsDhRD2ZaIJG/RIptrG1WnfbBpGCedVLjzdJMoXQY45hhYtsxK\nyQtJsSyv16GMrnNuGHAm1gAq3Swn773/Xke+R3t57/cBX2n4ammfd6d57JooxxWlLVtg//5wA90u\nXexCPIpAd8CAZEoFU9fSPSqkFmlxZ3TBAt0XXwzveFHP0QX7vxTFHN2oKwMOPzz8QLe+Pp4TdhSl\ny95bN/a4bux07mzzZ5XRFZF8tmgRnHlm9N9nxgx44IHov08SkipdPuMM2LPHrrvi+DeMS7Esr5d1\noOuc+x7whWbHcDQ2rQr+HGugW4zCXkM3UFIS/pzWOIKTlqSWY4cV6G7dalmnqBoipTNhgi07EFZH\n7DgyuoMHh78uc1VV479pVA4/PPzlhaqqbB5VHIFusOZtWCorLegcNSrc47amV6/o5+iKSHTq6qyT\ncFUVXHABXHRR0iOK1+7d8Pbb8LnPRf+9pk+3JYrKy8NrWJkLvE8u0D3uOEsGPPlkYQa6hX6zN6vL\nZOfcp7CM6fPA5VhQez9WNvwL4CDWGOo/whmmtCbKQDfsjG51dWOTn7gFQVGYwXsSH7wTJ1pXxTD+\nbfbssSBCpcvpRZHRjWvR+yhKl9eutW1cc3Qh2kBXGV2RaG3ebP1DfvpTmDcPLr4YfvKTpEcVrzff\ntJubYfY7acn06bYNs+orF9TV2fVKEnN0O3WCs86Cp56K/3tHqVhKl7PNB10NrAPO894/0vDYau/9\n7xpKgM8HLgEK/O3LDevXQ8+e4Qcrw4cXVqDbqxf06xfuzxRHNrS5iRNtG0a7+4oK2yrQTa9///wN\ndKMoXV6zxrajR4d73NYooyuSn+rr4corbarGSy/BkiXw+c9bZnNhRos2FoYlS2y6Vns6KGerpMSu\nEf75z+i/V5y2bbNtEhldgLPPtoZUUfS9SEqxlC5nG+geAzzhvT+Y8ti/S5i9908DfwW+3IGxSYZW\nr4axY8Of9xpFRremJrlAF8JfYiiJQHfMGJu7GEZDqiDQjXqO7tCh9m+/e3d4x1RGt3VRdF1es8Yy\noHEuD9a7tzK6Ivnopz+1gOs3v7Egzzn4wQ9g0iT44hetHLUYLFtm0z3imuJ0wQXwt78V1vsb13mz\nJeedZ/9/f/xje18fegjOPx9efz2Z8YRBpcttS7382wk0v/R5G5jSgeNLhlatskA3bCUlloU7cCC8\nY1ZXW1Y1KWFnqYPmWnHq2tX+vfMpoxv2usz791spU74Gul27Rv97EFXp8ujR8TaTU0ZXJHlvvw2l\npXbT8sMfbvtG64YN8PWvw2c+A/+RMomtSxf44Q9h7lz4xz8iHXLOWLo0+uXkUl1wgb3/wdq9hSDp\nQHfUKLjxRptrftpp9ruwaJGV5c+f3/brc9GOHdCtmzV8LGTZBrobgOEpf18NTG+2z9FYACwRW7Uq\ns7XZ2qukxO5chdnQJsnSZQi/wVYSGV2w0qQwAt3t220bV6BbXh7O8YLgM+qbDFEFuoMHRx8s9u1r\nc7kPHmx730ytWRPv/FzQHF2RpFVWWrD64ovwkY9YCee73tV6IDVzpv3ufuc7hz53/vk2X/Wuu6Ib\ncy5ZtizeQPe00+xz7a9/je97Ri0IdJO43gp84xtWjXDwIMyZY+fDUaPg5z9PbkwdUVtbHDd6sw10\nXwBmpPz9L8BU59xPnXPnOee+DbwXa1YlETp40H7Zogp0IdwMaC6ULuf7HF2wzsthZXQ7dYo+u5i6\ntFMYgk7I+ZjRjWstwOAEFuY83aQC3SjW0fVeGV2RTFx9tf2uPPcc/M//wIIF1tH3nHPgrbcO3f/3\nv4dHHrF9053vnYPrrrNALGhwV6j27LHPzTgD3W7dLKv7i1/Y9y8E27bZtVaXDi2K2jE9e9rNnRdf\ntPe3Z094//vhiSdsPnq+KZYbvdkGug8A651zwSITPwDeAP4L+BtwE1CO5uhGrrzcyjjzIdD1PvnS\n5WDecRgfSt4nm9Fdvdr+7TsiGH+Ui9iDfZj26ZOfge6uXbBvX3jHjKtTd3ACC6t82fvG0uU4RZXR\n3bnTfqZiONGLZGvRInj0UbjzThg50h4bNMjKjocMsWD3zTcb91+2DK691sqbS0tbPm5pqd1kuvfe\naMeftOXL7XrjmGPi/b7f/KZdH/7wh42P7d0b/o3buCS1tFBbLrjAxvbqq0mPpP2K5UZvxpe3zrl/\nV3F775/23p/rvV/X8PcdwMnAR4BvAFcCx3rv14Q8Xmlm9WrbRjFHd9Agm0sYVqC7e7cFZklndPfv\nbyzZ7Yhdu+zEkVSge+BAx++Gxxmoh9kILK5ANzh+mBcHcZ2ww87obtli2YFCKV0ulqUVRDriRz+y\npQsvv7zp4wMHWqOpgQOtjPk737FGPe98p33W/+//tj49o1cv+OQnCyvrmM6yZbaNM6MLcNRR1uH6\n1lvhhhvgssvsmm7wYPj0p8NtDBmHrVuTWVqoLaecYtcJc+YkPZL2U+nyoTY55+5yzk1N96T3fp/3\n/iHv/Xe89w80BL8SsVWr7GQSRZalUycYNiy8QDcIFpIOdCGcn6my0rZJBbrQ8c7L27fHN/4RI/Iv\n0A3+r+ZzoBtWRjdYWqhQAt1i6Tgpkq0tW2D2bLj++vQlo8OGWTnzpZdaoPvlL9v80Oefz6x/wrXX\n2jnoD38If+y5YulSy3xHfa5K57bb4Kab4Ne/hnXr4KtftX+n3/wm/+ZHb95sjdByTZcutvTQs88m\nPZL2U+nyoXoAnwFecc4tdM5d55xL4FdXUq1aZXdbo+qaFuYSQzU1tk26dBnCCbiCjsVxd10GC9h7\n9uz4PN18zuh26RL9cg35HOiGXboc/F+LYppEa6IOdIvhjrZINv74R+sDctVVLe/Tr58149m+3X6n\n/vKXzIO6o46y0uef/jSc8eaiuBtRpereHW65xa69FiywoPdLX7J/z+9/P5reB1HZtMlurOSiY44J\nZ7nHuKl0+VBDsDm4rwInAHcCG5xzv3POnR3F4KRtUXVcDoTZpTgXMrpDhlimOsxAN4mMbqdO4TSk\nqqiIfg3dQJiBbmWlXUxF3bk47EB33z4L0vMxo7t0abxrQQaiWkdXGV1pTX09LFkCb7zR8V4I+erP\nf4Yzz8zsHHfYYdndcL/uOnjpJVi4sP2vzQdJBrqB5ufJr3/dPv9+8YtkxpONTZsaExW5ZsIEG1+Y\njR/joNLlZrz3O7z393rvpwOTgVlADVAK/MM5t8Y5d7Nz7siIxippLF8O48dHd/wwM7q5EOh26WI/\nU1lZx4+VZKAL4QW6cWZ0w2oEVlUVTylY2IHuli22HTIknOO1Jgjgwjr5Ll0af0MVaMzoeh/ucYN/\n0yRKCiW3zZkDkyfDscfCccdZoPL440mPKl7V1fD009ZVNkrve59Vpf3v/0b7fZJw4ICdo5P43GzN\nyJGWSc+X5Yd277b/j7ma0Q1rKlncVLrcCu/9Mu/9jcAI4APAX7F1dW8F1jjnnnDO/f/27jtOqurs\nA/jvWcoCC0tbWIp0adKRZkfFgsYaRVGTmGhMYkxeiTEm0dcUTYwxBk3UmJgEo0bEqBATNRo7ShMR\nUOlIEXZBel0Q2PP+8cx9d3Z3+txy7p3f9/PZz4U7d2fOzM7Muc89zznPJSLSyL2mUl1HjujS/gMG\nePcYUUtdBrRTdSvQbdgwuCtibtTS9TvQPXxYywTky69At3lzHT13K9B16gh38eFyYIMGOsri1ohu\nUCMTJSV6ceTgQXfv15nnHfT3EdmjuloX7znvPA0GXn4ZeO01vah44YXA448H3UL/vPSSfl9fcIG3\nj9OwIfCNbwBPPllz8Tgq1qzRLJ6gR3QTGTdO51KHYVGqykrd2hro9u6t27AFukxdzoAx5ogxZoYx\n5nxo0HsLgBUAzgIwDYBLiYqUyJo1evLn5dXCTp00TdSNVRF37tSgoXnz/O8rH24Gum3aeJ8+m0yf\nPvo8cu2oDh/Wk30/A12gJtjLh1+BrlNj2AmK8uW87446yp37S6e01J1At6pKV3gPakQXcH8+2Y4d\n+rdt0MDd+yX7rFwJ3HILcOaZyTMDdu8GLr5Yy7LccYcGemeeCZx2mo58ffWrwNVXA2+84WfLgzNj\nBnDssf5clPv61/VzeOed3j+Wn5Ys0a2tge7Bg8CsWUG3JD3bA93WrXUKWL4DD35j6nKWjDGfGWPu\nAXAZgHcBCICAkjoLg1O7zssRXSc4cb5o8rFzp6aCBhUYOrp0Adavz/9+tm8PZiEqh5Mus2pVbr/v\nBG9+zdF1grswBbqAPo6bI7rNm/s3ilha6k7q8ooVGiAEGei6PU/Xz/cQBWPFCg1W+/TRxXf++1/g\nvffqH7doETBmjKbqPv88cNtttWuLFxVpvdexY7X+66ZNvj2FQBw8CLz4ovdpy4727XXe6AMPAMuX\n+/OYfli6VL+DbQzQBg7UKTT//W/QLUnPySq0dY4uoN8xYRrRPXJE+1SmLmdIREpF5BsiMg/AQgAn\nANgH4FE37p8SW7JET5i9/BJ1c5XiXbuCnZ/r6NpVA4585/z5mfabiBPo5noV0e85xuXlulK0U/s5\nH34GKa1auRfofvqpBvx+Xexp0cKdEd0gRyYY6FIu3nlHg9e6J/JnnAFMmKAjt7/6FXD++cCwYfqZ\nnDdP05YTadBA02tFgCuu0BPFqHr9dc2g8CvQBbTma/fuwPjxushmFDjTPYK+uJ+IiJbFCUOGQmWl\nLnRmw/ljMm6smeInJ0OKI7ppiMipIvI4gEoADwEYAWAugK8D6GCMuSb/JlIyzuIwXn6JOoGuG/N0\nd+60Yz5cly6air11a373E3Sg27atfvGHJdAVAXr2dOckJqyB7oYN/qUtA+6lLi9dqhfUgjjRYKAb\nLiLSWETuFpENIrJfROaIyDg/27BypQZMiaYcVFXpifMf/6iB7s6duhDSwoVAv36p77e8HHjqKa2Z\n+bOfedN2G8yYodUcvMwWq6tpU50P3aCB/h1OPlkXA2vVSi9O33CDO1Oo/LR0qX0LUcUbORJYvFin\nMdnMKS1k4wUDhxtrpvipkMrrJSgBnlpsVeWrYz/doSnKWwD8AcBfjDFL3WsepfLxxzqHxkstW+qV\nNDdStZzU5aA5c44+/RRo1y73+9m2Ldi5NyL5fbk6gb6fwXqvXu6M6PpZFsntEV0/T3zcSl1esiS4\n97pXga4t30cR9BiAi6CVGVZBzxVeFJGxxhjPZwQePAhcdln9Od2tWmn90K9/PX1Am8opp+gc3ttu\nA044ATjrrPzaa5vqaq2Fe9VV/gcWXbvqqPoTTwBvv60rXnfporXHH3pIL5LOmJFbGSO/VVfr9+aE\nCUG3JLkhQ/TigY0rQ8ezubSQo2dPvbC2a5cdAzrpOIvDMtCNIyITAFwD4DQADQBUA3gZwF8APG+M\nKdBKc8FwVlz+0pe8fRwRoEMHdwJdW1KX4wPd4cNzv5+gR3SB/AJdZ0TXz3nGPXvq3K987N+vP34G\num6tPL5hg84Z9EtpKbB2bf73s3SpLsoTBGfxOi9GdP0cXS8EIjIKwAQANxljJsf2PQ7gIwC/BnCi\n12245x7ggw9q7zv3XE07duuk7oc/1BVrr7hC03yHDHHnfm0wd66WQfMzbTle69bAd76jP/HGj9ef\n++8HfvCDYNqWjZUr9Ttr2LCgW5Kc875dtMjuQLeiws55zvHi17MJQ6C7fbtug1xnxi/ZpC4/BeAM\nAOsB3A6gmzHmHGPMswxy/ffxx5qC5ceXaIcONfU/82FL6nK7dkDjxvmvvLx9ux2Bbq4LIGzbpn+P\nRj4WAevVSwOvfOa3OQF62EZ0Dx/WTtCPVUwdbszRPXRIL6ZEbUSXqcueuATAYQCPODuMMQehF8SP\nE5HOXj74xo3AXXfV3te/PzBtmrsjF0VFGjj37KkXgB59tHb5q88/1zJqYSjdUteMGdpHHndc0C2p\nbdw4HY130s1t51xsGTo02Hak0qaNXuxbtCjolqTmpC7bzGmfWxfFveZM62CgW9tTAMYZY3oZY+40\nxrB0UIDefVfrz40a5f1juTWia0uqYFGRfrnnE+hWV+sXRdBfEn366AlVLuVvghiR7tVLTwLzWdzM\n77nFrVu7U16oslLfN37P0c03dXn1ag3Sg7riz0A3VIYCWGGMqVsMal7c7Z758Y8128NRVAT8/e81\n7yE3tW6tC12NHaulh5o315PdkhJNrW3fXvvOm292vwa0V4wBpk/XBbpsLLv1v/+rqbb33x90S9Jb\nuFAvagZ9MTydIUPCEejanrrsBLpuVCjxgzOia8M5udcyTl02xlzhZUMoO++8o2m3zZp5/1jl5cD8\n+fnfjy2py0D+tXR37tSgJehOzFl5eeXK7C96bN3qf/t79tTt6tU6HysXztzisI3o+l1DF3BnMSpn\nxeWgAt0GDTRwcLOOrjEMdD3SEbo4ZV2V0PU8PDtdXbIEePzx2vuuvdbbrKdWrYBnnwU++khTmT/7\nTPe1aqXZMnPnApMna9AzY4Y3AbebPvxQ+5LJk4NuSWIdO+rc4b/+VYPeItcKZLrvgw/sTlt2DBkC\nTJkSdCuS27dPL2539jQXJH8lJfqZD8uI7vbtmvHlZ0ZfULJejIrs8O67WtzeD1FLXQY00F2zJvff\n93tUMZmjj9btihXZB7p+Lujk6N5d531/8glw6qm53UcQge7BgzqS0KRJ7vfjBLphS11eskQzF/JZ\nuC1fJSXujuju3avp8wx0XdcUQKLxywNxt3viJz+pXTKueXNdNMoPAwfqT10XXqiLVX3hC8D11wN/\n+5s/7cnV3/6m36tnnBF0S5L70peARx7RCwunnBJ0axIzRgPdb30r6JakN2SIjkJu3er/+UAmnMUr\ne/UKth2Z6NgxXIFu0BmJfrH4ehgls2EDsG4dcKLny3ooJ9Ctrs79Pg4d0pQyW0Z0u3bNb0TXlkC3\nRQv9cs1lQaogUpeLizXQy6fE0NatOsfaWaTIa857Nt9R3VWrNLDy82JPaammiueTOumUyAiytIPb\nga7zt2Sg67oqAInWxG0Sd7vr3n8feOaZ2vsmTdL04aCNHQv84Q/AY48BU6cG3ZrkDh/WNO8rrtDv\nV1udcALQo0f90XubVFTolKIwjOg6ay8sXx5sO5IJU6DbqVO4UpcLJdCN3IiuiDQGcAeAKwG0AbAY\nwG3GmFcz+N1OAO6DLrpVBOANAJOMMXmM/bnPKfB9wgn+PF55uXaC27fnfsXPWcrclkC3SxedJ3rk\nSG5zkWwJdIHcV17eti2/Vadz1aePBk+5cq48+xV4xQe6HTrkfj9Ll+pJhZ8Bo7MAz549uZfkWLJE\n6y0Gye1A15lzbcv3UYRUInF6srOUTMrxjkmTJqFlnStBEydOxMSJE1M+6I9/XPv/rVoB3/tempb6\n6KqrgH/9S9t03nn+XaTLxn/+oxe0v/KVoFuSWlGRBuMPPgg8/LCuVWKbd97RrR9rqOQrPivMr3PK\nbKxerVP0ysuDbkl6HTsC69cH3YrM2DB1Z+rUqZha5+rfLidYcJGFXxF5y6mGn4iUAHgTQAsAd0JX\njvwegDdFZKgxxoXlaNwxbRpw/PH+ffCdk/tNm3IPdJ0RFJtSl48c0eeUy9wPm5Zm79NHRzSyFVR5\npKFD64++ZMPvFCu3RnSXLfO/DEmLFrrdvTu318wYPQG66ip325UtrwLdoDv6CFoIYKyINK+zINUY\nACZ2e1KTJ0/G8Cyvvr3yiv7E++EP7bqIIQL8+tdA377AvfdqmrVNjAF+/nNg9OhwjEKedx7wi1/o\nHGgbg7NXX9UsGNsXUAKApk01wy3X6g1eW71a1/YIMqMoU506AXPmBN2KzNgwopvoIuaCBQtw7LHH\nuvo4kUpdjqvh90NjzA+NMX8GcDqAddAafql8G0AvAOcaY+41xtwP4Ezo1embPGx2VrZtA15+GUhz\ngdtVTqCbzzxdJ0iw5eQjvpZuLrZt06uM+czZdIszohs/Py0dY4KZowtooLt2be6BYxgD3epqDXT9\nLtETP6Kbi4oKnXLQt697bcpF8+YMdEPiGegF9OucHbEsq6sBzHG7WkNVlc59jdexY/0arDbo3h34\n7ne1zq8bVQzcNH068N57WronDAHFiBHaB+Rbk90Lxuhq3OPGBd2SzPXunVtWmB8++SQcactAfFcD\ndQAAIABJREFUTepyNudiQbEh0PVLpAJd5FfD74sA3jPGLIj73eUAXoMGz1Z49lk9ab70Uv8e0xk5\nzqdztjF1Gcgv0LUhbRnQQHfv3uz+Prt3azp6UCO6QO4lDfwO0J1gKJ8SQxs3aqAWVKCb64JUzsmP\ns7p3UJi6HA7GmHkA/gHgLhG5W0S+Dp0C1A3AD9x+vO9/v/58/5//3J9qBLn48Y91/uvPfubv41ZU\nADfeqAHN2LEabG/ZorctWgR84xvA2WfrbWHQoIG218ZAd/VqXUMlTIFurtOf/LB6dXgC3Y4d9cJw\nvgtA+qGQAt2opS5nUsOv3hVlEREAg6EBcV3zAJwhIiXGmJSnWjt21HQeXti5E7jzTmD8eH/nK5SU\n6IhKPoGubanLrVrp84pCoNu7t25XrMi8qHqQc4z79tX5ogsX5rZq5tatNc/ZD82a6TywfEZ0nTnJ\n/fq506ZMxacu52LFCj2p7NHDvTbloqTEnRJPjp079TutEEorBOBL0HUyrgLQGrpOxrnGmHezvaPq\nauDjj7V8T6NGOmJyzDE6T/MXvwAeeqj28SecAHztay48A4+0bg3ceitwyy3A//yPP98Hn32mAez2\n7XqBfPNm4LbbNL27b18NJAYN0oWowmT8eOCJJzSItylF+OWX9TszLBcNAA10p0zRz5tNJZuOHNHs\nL6csoe2c92FFhT3nuskw0A2vXGv4tYGuFJnsdxH73ZSzGPy4gldaqosw+C3fEkPOSaozwhQ0kfxq\n6doU6PbsqZ3TihWZB45BBroNG+qJ1cKUs/WS8zt1WST/WrrLlmlw3727a83KSL6pyytW6Psr6ICw\npERXm3eLDQtxRJUx5nMAt8R+cjZ9OnDTTZmXgSsu1sWJbDpRT+SGG4AHHtBg95//9PaxqquBiy7S\nz/+8eTUBw9at+vouWAB885u6AJXtJ+Z1nXWWfjf/5z/BXNzYvl2/l+IX+auu1vOzc86pucgYBn36\naPm8jRv9LX+XzoYNWrEjLCO6TqBbWel/9lY2jhzRLMtC6QMt7xKylmsNP2d/IPX/svHAA0C3bv4/\nbocO+Y/otmhh1wqJXbrkvkLe9u32BLpOAJXNYhJ+16Kta+hQrTOYLWOCqfeXb6C7dKmeTOSywnc+\nSkr0ZDCfEd2g05YB91OXt20rnKvZYXPkCPD1r2ud+GxqnT/6aOJatrYpLtbR6OefB956y9vHmjIF\nmDULePrp2qNiZWX6Gv/hDzpvOGxBLqD97+jRwEsv+fu4R45oenx5uZ7TXHFFTd8wfbp+19ddBdx2\n8VlhNnHOacIS6MYv3Goz5/1aKH2gRWGHK3Kt4efsz7P+3yQAdXuMibEfd5x9tmt3lZXy8vzn6NrW\nmXbtCixenNvvbttWsyy/DbJdTCLo8kijRwN//at+4WYzT3L/fr3yHLZAd8ECYPBg99qTKRE9Gcsn\n0D33XHfblAu3A93Nm/Of/uFXaYRCUl0NXH21pqRmqkED4Le/BS6/3LNmue7yy4H779eFtBYsyL30\nVyq7dwM/+hFw5ZXASSe5f/82OOcc4De/0VE/v7JO/vQn4Kc/1dTvsjLgjjuAAQOACROAJ58ETjsN\nGDPGn7a4pXt3HYRYsQI4/fSgW1Njzhw9bwxL6rKzQKkzkGArm6qG+CFqI7qVqKnXFy9dDb/t0NHc\nVL+bQRnoyQCer/Pj4/LIHnJjRNe2hV+ikroM6BVPp7B6JrZt07ICTQPKUxg3Tk9q33wzu98LaiQ6\nn0B33z49mT3xRHfblKnS0txSlw8d0vdUFEd0N23KP9CdOHEinn/++Vo/kydPdqeBBerBBxMHue3b\n64XF+IyIoiKdBzl3ro5KhklREfDnP+uI1U9/6s1jPPywfmf96lfe3L8NzjlHA/pZSQtHuuvwYS0T\nddllwC9/qXWRFy7UNOopU4AzzgAee8yftripUSMNJm0b0Z05U+fd+50JlSsRPTdhoGuXqI3o5lTD\nzxhjRORDACMS3DwawCcJFriq59VXvR+1CSq4cmOOro2B7ubNwOef60qY2bAx0P3b3zS1N5PyEEG3\nv3t3bfOrrwIXXpj57zmLvfkd6LZunXugO3euniAFNapSWprbiO66ddpuPxf+SsaLEd3jjnPv/sgd\njz5a+//FxcAjj2gdZxHg4EFd6GXPHv3+KCkJpJmuGDRIU2B/9CNd7O2662rffuCAlvw5dEjrb2fz\nfX3gADB5MvDlLwNHHeVuu20ybJhesHrxxdwWNszWtGm6ONL06TX7unXT7KS//tX7x/dSnz7B1dI9\nfFgv/sTPrz98WC9g3HprMG3KVZgC3UKZoxu1QPcZAN+H1vD7LZC4hp+IdAHQLFY+KP537xKR4U6J\nIRHpC+A0pK/BC0DfNO3aufRMLNOhgwYZhw/nNs921y47A11jdAGGbFaVPXhQT7ptCnR79tQ2ffZZ\nZiNVQcxzrWvcOA10s1EZy6vwe5XNVq30BCcXM2fqd0NQi1PkmrrszI8MesVloKaObqYXctJxI3WZ\nvNWwITBjRu3pOsXFdrwf3XLLLRq4f+MbwCuv6HdiZaXO3Z0zR/saQNMhf/1rXcgqk/f/44/re/zm\nm71tf9CKinT15RdeAO6+2/vHmzJFU5OdEnlR0rs38O9/+/+4VVV60XH3bi279aUv6f5Fi7RsYlCZ\nULkKU6BbKCO6kUpdzqKG3+MAltb59YcAfALgRRH5vojcCOAVaMrybz1vvOXKy/UkM9fySTt32jdH\nN9daukHPb03EmcOSafpy0CO6gJ7ULV+e3YJgFRWaxuT3BaV8UpdnztTOOqjVYHNNXV63Tttsw4hQ\nSYmmuh9MtFxglqqq9PVgoGu3Bx8Mbk0Kv4joXN0pU3S9iBtu0Ofdpo2mHC9YoN+R116r6dm3ZLCO\n9ZEjGhRffLGWD4q6c8/VElTr1nn7ODt26FSbSy/19nGC0qePnj8cOuTv4950k6ZMDxyoGQjOSuRv\nv60XtkaO9Lc9+WrXzv5Ad8cOzWK0td642yIV6MZ8CcB90Bp+9wNogPo1/AyA6vhfiqUmnwLgLQC3\nAvgZgA8AjDXGbPOh3VZzVpPLNX3Z1tRlIPtA18arYc4oR5gC3TPO0JGKadMy/52KCn0v+j1nJ9dA\n98ABYPbsYK9K55O63KlT9mn9XnBSVN1IX3a+wxjo2uu7362fyhtVIroA14oVGmRs2QI89xxw442a\nmtunD/D732tAfM89wH33pb6/554DVq3KLCiOgjPO0NH/F17w9nH+/W+9iHD++d4+TlD69NHnl81K\n5/lau1ZX/v71rzXAvegiLXX15JPAXXfphS4vFmrzUhhGdDdv1oDcjeyoMIhcoGuM+dwYc4sxprMx\nppkxZowx5tU6x5xqjKmXgGuMqTDGXGaMaW2MaWmMudAYk8USP9GV77LpNqYul5RoSmkURnRbtNAv\nrjAFui1bAhdcUDO3OBMVFf6nLQM1gW6m7XS89JKuFH3BBd60KxO5pi6vXRtMKbNEGOgWjvHjgXvv\nDboVwRBJfvL53e/q6NfNN+u8/0SOHNFVgE8/PXwjYblq2VLXP/jXv7x9nBkztFpAEP2PH5xFB/2c\np/vaa5o15MzBnzIFGD5cVwpv2lTn54dNGALdjRuBzp2DboV/Ihfokjfat9dtroGujanLQG61dG0M\ndAFNX8400LVhji6gqUoff6wrV2YiyED30CFNe83GU0/pfK4gUwjzSV22LdDdm3ZJwPQY6NrrhBN0\nRNKmeus2uesuYMQIXfV3x476tz/xBPDhh1qnt5BcfLGu97DNo9y7w4d1DvV553lz/zbo1EmDSz9X\nXn79deDYY2sGQVq21L/jY4/p6x3GNW+cQDfbi+J+YqBLlEBxsY5+5pK6XF2tI0q2jegCWks3lxFd\nEfueTzYlhmwY0QWAM8/UgKPuaqvJVFQAHRMVAfOYszqhk7aeib17dZQh6Pqe+aQu2xboujWi65SB\nILvce69OZ6DEGjUCpk7VDKlrr619Mr19u65Qe+mlOvJYSC69VM8znnnGm/tfuFC/z8eO9eb+bVBU\npAtS+RXoGqOBbt26vUVFuiBVWOeXl5XpRfFca9f7gYEuURK51tLds0e/1GwLDIHcaulu26aBj221\n3Xr2BFavTn/cvn06MmnDiX7Dhjqq+8QTOp81ncrKYEZ0ndcqm5SkGTP0dZ4wwZs2ZSqX1OXDh7Uz\njGqgW1bGUUMbNWoUdAvs1727lrJ57jldvKq6WkvkTZig36H33BN0C/1XXq6LG06d6s39z5ypF2BG\nJCpAGSF9+vgX6C5dqueTp53mz+P5JZdzBb8x0CVKItdA11nEx9bU5VwWo7JhNLSunj31CyxdwGhb\n6uY11+hrOmNG6uMOHdLySUEEuk7q/mefZf47U6Zobcegy6E4I7rZpFJt2KDz/aIa6Nry3ifKxUUX\nAX/+sy7kc8wxGqC89Rbwj3/Y85n12xVX6Eq9XgRqM2fqKHnYFkbKlp+1dN95RwcLTjjBn8fzi+2B\n7v79ek7OQJcogfLy/AJdW0d0t2/XD3+mtm2za8Vlh1NiKF29V9sC3b59dVXiv/wl9XGbN2uwFkSg\n68wVyrS81tq1mpb11a961qSMlZbqqE8284udUh3du3vSpKwx0CWq7ZprNLgdM0ZTaj/4ADj11KBb\nFZzLLtNpLXfe6e79GqOB7kknuXu/NurdWy/8Z3M+lKuPP9bpVlErcWN7oLtxo24Z6BIl0KFDbnN0\nd+3Sra2BLpDdqK4t81vryrSWrm2BLqDzzV59NXVpg4oK3QYR6DZrpsFWpiO6jz0GNG8OXHKJt+3K\nRIsWus0mfdkJdLt2db89uWCgS1TfSSfp+gaPPqp1SAtZkybAj34E/P3vmhbrlmXLNGg5+WT37tNW\nzsrLq1Z5/1hLlwL9+3v/OH5joGsfBrqUsQ4ddI5ktmxPXQaiEeh27qw1TzMJdIuK7HoOl1yiAdmU\nKcmPCTLQBTR9OdNA95lntKSQE6AFqbRUt9kEuuvXa4dty9X2hg01bdCNQHfTJga6RFF07bU6SnjB\nBbW/q6uqgCVLMl+sMd7bb2uK7XHHuddOWzmBrh/zdKMa6DZurH2urYGucx7FQJcogfJyDVo//zy7\n37M50HU+7FEIdIuKdD5oJoFuu3Z2LaZVUqJzrP76V50bmkhFhS5WE9Rr365dZqnLq1ZpiY+LL/a+\nTZlwAt1sSgxVVgazunUqJSX5B7rV1XatJk1E7mnSBPjPf/S7rkcPnVfbubNesBswADj6aODqq7Ob\nxjFzJjBsmGboRF3btrrQptfzdPfs0XUgjjnG28cJis21dDdu1HOCQng/OxjoUsZyWZAH0NTlJk3s\nLBtRXKwBfDa1dG0NdIHMVl62NXXz6qv1S/jttxPfvm6dnrQUBfStlemI7vTp+l4/6yzv25SJXFKX\nbQ10862ju2kTcPBgTZo/EUVLz57Ae+8BP/kJ0K+fzmWeMkXnMz/4IDBtGvCDH2R+fzNnFkbaMqBl\n1/woMbRsmW6jOKIL2B/oFtJoLgCwwAJlzAmONm8Gjjoq89/budPO0VxHNrV0jdHFq2xcjArQTv6t\nt1IfY2ugO3q0/i3+8Y/Ei6osWRLsFeD27XUBjXRmzNAg14a0ZSC31OVNm2rS2Gzhxoiuk+3AQJco\nuo46KnEwe/LJmjH0ne9oevO4canvZ906vQheCAtROfwoMeTMoe7Xz9vHCQoDXbtwRJcyFh/oZmPn\nTjsXonJkU2Jozx6tMWrziO4nn6QuJWNroCsCXHqp1odMlL4cdKCbSeryvn3A3LnA2Wf706ZMMHW5\nhhPoBl3yiYiC8e1va+B6yy3pS67NnKnbE0/0vl228CvQ7dIluumzZWWZV2jw2+rVhTd1h4EuZcxJ\nXS7kQHfbNt3aHOju3586xdbWQBfQQHfz5poTDEdVla7IHPSIbrrU5ffe0yD9+OP9aVMmiot1MadM\nR3SN0UC3Qwdv25UtNwLdNWv0vW/LIltE5C8R4Gc/AxYsAF54IfWxb7yhc3udlXQLQb9+Ohrp5Yjk\n8uXRHc0F7B3R3bcPWLwYGDky6Jb4i4EuZaxxY12oIJc5ujanLjuBbrqru4D9gW6vXrpNNU/X5kB3\n1Kia9OV4y5fr3yfIOT3t2+sc0VQ1BmfP1jmxAwb41650RHRUN9NAd+dOncca1RFdpi0TFbaxY3WU\n9he/SH6MMcArrwBnnulbs6wwaJBuP/zQu8dYuzba38M2BLrGaPWH+Eop8+frhfhCWEE8HgNdykp5\neTRHdPfuran3m4rtga7TeSSrg1dVpQGPrYGuiJYaevbZ2unLS5boNshAt1073aZKSZo1Cxgzxq4V\nrQENdDNNXd60Sbe2BbrNmzPQJaL8iQA33wzMmaNZOIksW6YrAxdaoHv00ZoFtHixd4+xdm2002fb\ntdO1XJJVkPCaMcCtt2qG3EUXAYcO6X4bL8T7gYEuZaV9+2gGukBm6cvbt+vW1kC3pETrzCYrD+D8\n7WwNdIGa9OV33qnZt2SJLqAQZGaAk7qfLNA1RjsSG6+WZjOi61wBti3QdSt1mfNziejcc4Hu3YHf\n/z7x7a+8ollshbLisqNhQ50i5NWI7u7dwI4d+tpHVVmZng/s2BHM47/9NnDXXcB11+ko7p136v7Z\nszVrzrYL8V5joEtZyWVENwypy0Bmge7WrXq10+Y5fr17hzvQHT1a/yZPP12zL+iFqICaEd1kqfsr\nV+qIv03zcx0tWmQf6EZtju6BA7riJEd0iahBA12Yatq0xN/pL7+si1bZ3Nd7ZfBg70Z0163TbZRH\ndJ053UGlL7/2mg7GPPwwcPvtGui+9JK9F+K9xkCXshLF1OWOHbXTy6SW7pYtOrIn4n27cpUq0HXS\nUm0LYuKJAFddBTz+uAZnVVVaMmnEiGDblS7QnT1b2z56tH9tylQ2qcuVlZombNuKmPnW0XXmrTPQ\nJSIA+NrXtO//059q79+yBfjvf4Hzzw+mXUEbNEhL6VVXu3/fDHS99847OgddBPjxjzW4PeccPZ+6\n4IJg2hQkBrqUlWwDXWPsD3QbNNC02ExGdDdvrklhtZUT6CZaXGvtWh2Rtv05XH+9BriPPqoLU23f\nriclQSou1g5sw4bEt8+apaPONr7Xs0ld3rTJvrRlIP8R3YULdTtkiDvtIaJwa9MGuPJK4A9/qJnH\nCABPPqlBwhVXBNe2IA0erIsuOuXY3LR2LdCokZ19jFuCDHQ//1znnjslsRo2BJ56ShdeW706+AGD\nIDDQpayUl+uHN9NJ9lVVWnfWxpP/eJmWGPrsM/uDxD59dPQu0QWJtWt1bkyR5Z/8o47Subp3361z\nTc48UxfJCFqPHjrPM5FZs+xMWwayT1228SQk30B3wQIdzbX9u4iI/POd7wAVFcATT9Tse/RR4Lzz\nCqusULzBg3X7/vvu3/e6dVpZwfZzkHy0bq0XSoIIdD/4QM+7TzqpZt9RR+nIbufO/rfHBhF+q5EX\nyst1pDDTD/DOnbq1eY4uEK1At3dv3SZKXw7TYjx33FFTvP7GG4NujerePXGgu2uXpnrZOv8l29Rl\nG1PbnUA3kzJgiSxYAAwf7m6biCjcBg8GLr8cuOkm/e574gnN/rj22qBbFpzycj2PeOst9+973bpo\nL0QFaJZgmzapKzR45Z13gKZNgWHD/H9sWzHQpaw4QV6m6ctOoGv7KEqUAt1evfRqYqJA1xnRDYNe\nvYA33tAUqvHjg26NSjaiO3euBmC2juhGJXW5ulpr/GarupqBLhEl9sADusLyyJG6Uu1XvgKcfXbQ\nrQrWqadq/+u2qJcWcgRVS/fjj4GBA/X9TIqBLmXFWa0300DXqU0bhkB3w4b0o0VhCHSbNNHns2JF\n7f3GhGtE11FcHHQLavTooRdEDh+uvX/2bL2C26dPMO1KJwqpy87iWLmkL69Zo8+fgS4R1dW2LfDq\nq1pz9PzzgYcesnvBST+ceqrWEnZW4XdLIYzoAsEFuoXy+maDgS5lJdtAN0ypywcPpk41OXBAT5Zt\nLs3jGDAA+Oij2vt27ND2hy3QtUmPHjo/ve6CVLNmadqyrSdHpaW6YnG6VTSrqvQza2OgW1Ki21wC\n3QULdMt0LiJKZOBAran71FOFWVKorrFjdfvmm+7d5/79OlhQCCO67doFF+gWwuubDQa6lJVmzXRk\nJYqpy0Dq9GWnrIztI7oAMHRozSqzjrVrdcurfblzLhLEpy9XV+sqh7amLQMa6ALpy/PYXH4qn0B3\nzhxdACUMn10ioqB16AD07w+88IJ79+mUcCyEc5AgRnSrq/UctmtXfx/XdpELdEWkpYj8SUQ+E5G9\nIvK6iGR0HV9EpohIdYKfJV63O0zKy5PXEq1r1y6dmO+cpNrK+WJIVUs3bIHuxo21R6id4Iwjurlz\nrpTGB7pLluhIuc2BbosWuk2XvuwEujaP6OZSS3fmzNqrUBIRUWpf/aqW93P6hXw5F9sLYcQxiEB3\n82YtL1QIr282IhXoiogAeBHA5QB+B+BmAO0AvCkivTK8mwMArgRwVdzPze63NryyqaW7fXvNUus2\nKyvTua1RGdF1UjTjR3XXrNHR+LZtg2lTFBQXA5061Q50Z83SizkjRwbXrnScEd10Ky8787FsDnSz\nHdHdu1dTlxnoEhFl7tprtQ7rww+7c3/r1mlfWQhlbsrK/F91ed063TLQra1h0A1w2aUAjgPwRWPM\ndAAQkX8AWAHgZ9CgNZ3Dxpip3jUx/Nq3zy7QbdPG2/a4QURrjWUS6LZr50+b8tGrlwa1H3wAnHGG\n7lu9Wkdzbb/oYLu6Ky/Png0MGWJ31oIT6DqLwyVTWQk0amTnZzbXQHfOHJ1XzUCXiChzrVsDX/sa\ncO+9msZ8zDHahzRtCgwalP3KvuvW6XlWw6hFHgmUlemF5c8/928FZCcjkanLtUXt7fZFAJucIBcA\njDFbReRpAFeKSCNjzKF0dxIbGS4xxuSQJBd95eXAvHmZHRuWQBdIX2Los890rnEYlm0vKtLgK35E\nd/Zs4Nhjg2tTVAwcWFN2wRjgtdd0tU6bOXPknTnzyVRW6ue7yMJcn1wD3ZkzNYuhf3/320REFGW/\n/KWmLl9+ee39rVsDb7+t/WGmwlTeMF9lZbrdts2/DKl163Saku1r4vjNwtOZvAwDsCDB/nkAmgHI\npPhHMwB7AOwWkW0i8oCIWDxW479sU5ejFOiGIW3ZMXQoMH++/nvHDmDxYuDkk4NtUxScdZaWbvrk\nE+D99/U9c+GFQbcqtdatdbtjR+rjbK2hC+QX6J54IjMZiIiy1aIF8PTTeqF89mxdk2LWLE0/njAh\nu+/jQloR2Jki5uc8Xef1ZV9XW9QC3Y4AElX9cvZ1SvP7FQB+DeBq6DzffwK4HsBLIhK11ypnzmJU\n6UqVAOEKdLt2rZnjkEjYAt1x44CVK7VjeucdHX085ZSgWxV+p5+uqVf/+Q/w3HPaodmeFltSom1O\nF+jaWkMX0PYXF2d3YnXkiF7sOe4479pFRBRlIsCYMfrTv79+nz79tF7sffDBzO+nEEd0/Qx0169n\n2nIi1qYux9KHM0oSNcYcjP2zKYCDCQ45AEBit6e6n1vr7HpaRFYCuBPAJQCezqQ9UVdeDhw+rGmQ\n6YLY7dvDU7uyZ0+gokLr5TZpUv/2TZvCFeiefbbOzZw2TevXde7MFZfdUFoKnHACMH26Xhg5/3z7\n5xyJ6KhuJoHuqFH+tCkXJSXZBbrLl+s8KZufExFR2PTvD1xwAfDkk8APfpD++IMHtX8plBHd+NRl\nv6xbp+cmVJvNo5QnA6jK4Ge/iDgpyVUAihPcVxMAJnZ7tibHfndcDr8bSU6wl0n68vbt4Vnlt1cv\nHfWMX2goXtjqkzVpAlx8MfD448Dzz+toLlNa3HHOOcCrr+oCX1/5StCtyUymga6NNXQd2Qa68+bp\ne55z04mI3DVxIrBokWaNpfPpp3p+VSiBbsuWusK0nyO6mzZpVQiqzeZxiGXQFOJMVMZtEyXeOfsq\nsm2EMeaAiGwDkDYBd9KkSWjZsmWtfRMnTsTEiROzfVirlZfrdvPm1Au8GBOu1OVesQJUq1fXf17G\n6NWyMAW6AHDllcCjj+rf7JvfDLo10XH99cDRRwOjR4enVEK6QPfIEU3PtzV1GdBAN5s6unPn6mfZ\nWXXaTVOnTsXUqbUX6N+VbllrIqKIGD9eA7qpU4E77kh9bKGVvhHxt5ZudbWOHoehKojfrA10jTGb\nATyW5a8tBHBigv1jAOyHlhnKiog0B1AGIG1FrMmTJ2P48OHZPkToxAe6qVRVabpKWALdjh11FHT1\n6vq3bdumzydsge64cVpDdMCAcKwWHRbNm+toeZikC3S3bNHO0vZAN9sR3dGjvWlLoouYCxYswLEc\nPiaiAlBcDJx3HvDvf6cPdFev1hHOQgl0Ac1m9CvQ3bFDL1Y7KdNUw+bU5Vw8A6BcRP7/FFREyqDz\na5+PLy0kIj1FpGfc/4tjQW1dt8e2L3nU5tApLdUvuHSBrjM3ISyBblGRztNNFOg69cnC+CU9bBiD\nXEof6FbG8mJsDnSbN898RPfAAV1pfORIb9tERFSoTjtN05fTTYtZvVoHCho18qddNvBzRHdLbCiO\nI7r1WTuim6NnANwIYIqIDACwFbpqcgMAP61z7OsAqgE4wW4HAB+IyFRo2jQAnA1gPIAXjTHPe9v0\n8BDJrMTQ9u26DUugC2j6cqpAN2wjukSO1q1Tz6VyAl2b5+iWluriUplYuVIXzRs82Ns2EREVqlNO\n0aldM2fqwozJrFpVMz2sUJSV+bcYFQPd5CI1omuMqYYGptMAfAdaKugzAGONMSvrHh77cewE8C/o\nolO/BHA3gC4AfgjgAm9bHj4dOujE91SiFugWF/NLhMIr3Yiu83l2pibYqLQU2L07s2OXL9dtv37e\ntYeIqJD16AF06QK89Vbq41av1nUtCglHdO0QtRFdGGN2Abgu9pPquB51/r8LQEjWTw2N/k4RAAAg\nAElEQVRex441I0DJhDHQ7dlTV10+ckTnkzic+mRctZjCKpPU5bIyu9PcS0uBTNd7WrZMn09YVn0n\nIgobEWDsWODNN5MfY4wGuldd5Ver7OB3oFtUFK7zbb9EakSX/JNpoCsCtGrlT5vc0KsX8PnnwMaN\ntfezEDeFXevWmvZ7+HDi2ysr7Z6fC+gKn5mO6C5bxtFcIiKvnXIK8MEHyb+bt2zRtRUKLXXZz8Wo\ntmzRxytiVFcPXxLKSaaBbuvW4frgHXOMbj/+uPZ+BroUdq1b63bnzsS3215DF8gudXnZMqBvX2/b\nQ0RU6I47Tkdt589PfPuqVbottEC3rEwD/AMHvH+srVuZtpxMiEIQsknHjlpzM9noEBCuGrqObt10\n1Gjhwtr7168P54rLRA4n0E2Wvrxpk/0jupkGusZwRNctIvIVEalO8HNERNonOP58EXlfRKpEZJ2I\n/FREGiS6byIKv3799Lt5zpzEtzvrnvTsmfj2qHJK/fixINWWLQx0k4ncHF3yR6dOejK5eTPQuXPi\nY8IY6IoAQ4fWDnT37dMggIEuhVm6QLeyEjjpJP/ak4vSUp1acOCA1rxOZuNG/dwy0HWNAfC/ANbW\n2V8rP0BExgOYDq1qcAOAQQBuA9AOwLc9byUR+a6oSOuVpwp0O3TQ8nCFJD7QTXae7BYGuskx0KWc\nOCM/lZXRCnQBDXRffLHm/x98oEH90KHBtYkoX6lSl40JR+pyy5a63b07daDrrLjM1GVX/ccYsyDN\nMfcCWAjgrFgVBIjIHgA/EpH7jTErvG4kEflvzBjg4Ye1L6m7aOeyZUCfPsG0K0hO4JmuFKcbtmwp\nvNTwTDF1mXISH+gm40yOD5uhQ3VOiVOv8733gKZNgQEDgm0XUT5Sjeju2qWjpGFIXQbSpy+vXKmr\npvfokfo4yo6INBeRhOcNItIfQD8Af3KC3JiHoOcal/jQRCIKwJgxes63Zk392xYvBgYN8r9NQXNK\n9fkV6HJENzEGupST9u01XSVVoLt5s/0jRIkMHapXJT/8UP8/bx4wbBjQqFGw7SLKR/PmGvwlCnSd\nGrpRCXTXrNHF4xoyZ8ktAuBNALsB7BeRf4pI3aqYw6Apzu/H7zTGVALYELudiCJo9Gjdvvtu7f0H\nDwIrVgCDB/vfpqA1awa0aOF9oGsMA91UGOhSTho00GA3VaC7aVPNFa0wOeYYDWrfj52uvfceMHJk\nsG0iypdT6itRoOt8jsMS6Karpbt2LdC9u9etKRj7AUwBcD2ACwHcDeB0AO+KSPzEFefdk6hXqATQ\nyctGElFw2rbVrLeZM2vvX7oUOHKkMEd0AR3scS4ke2XPHl27goFuYgx0KWedOiUPdKuqdNQljCO6\njRsDp50GTJ2q84xXr2agS9GQrIC98zm2/fMaP0c3lTVrmLaciKjiTH6c3zHG/MMYc40x5gljzPPG\nmJ8AOAtAGYBb4+6+aWx7MMFDH4i7nYgi6JRTgLffrr1v8WLdDhzof3tsUF7u/Yjuli26ZaCbGANd\nylmqWrrOB9v2E+dkrrsOmD0buPNO/T8DXYqCZFeXN2zQ0dIWLfxvUzYyTV3miG5SJwOoyuBnv4gk\nXT7GGPMugLkAxsXtropti+v/BprE3U5EEXTyyboQYHwf8+GHetHR9r7FK36M6DoXrxnoJsYZTJSz\njh3r15t1OB/sMKYuA8B55+kX1OTJwFVXAb17B90iovwl63Q//RTo0sX/9mSruFgzLlIFunv36hVu\njugmtAzA1Rkem2JiCgDgUwDxwbBzfEcAG+sc2xEaGKc0adIktHSG7WMmTpyIiRMnpvtVIgqYU55u\n5kzg0kv134W6EJWjvFznKHsprCO6U6dOxdSpU2vt25VuXlIOGOhSzjp3Bl54IfFtYR/RbdQI+OUv\ntbTQb39bf7l8ojDq2LEmlSxeWAJdQEd1U/WFa9fqloFufcaYzQAec+nuegLYEvf/hdBFq0YAmO/s\nFJGOAI4C8HC6O5w8eTKGDx/uUvOIyE+dOgFHHw28+qoGuocOAfPnAzfcEHTLguPHiK4T6Dp1e8Mi\n0UXMBQsW4Nhjj3X1cZi6TDnr2lVTlw8mmJG1aZOuyhzG8kKOr34V+N3vuHIrRUeyTnf9ev08h0Fp\naeoRXSfQZeqyO0Sk3umTiJwD4FgALzn7jDFLoCPG14nUujR4PYBqAM953FQiCthllwFPPQXs3w+8\n8oquc3LxxUG3Kjjl5ZpafOSId4+xZYuuX8HKIIkx0KWcdeum208/rX/bpk26KnODBv62iYiS69hR\nV10+cKD2/jCN6LZsmTrQXbNG05ttX0E6RGaJyDQRuVlErhORPwKYAWAdgLvqHHszgMEA/isi14rI\n/QB+BOARY8wyf5tNRH675hpdBXjaNOCJJ3QRqkIsLeTo0AGorq4ZdfUCSwulxkCXcuYEuuvX179t\n8+bwzs8liipnKkH8KpBVVXrFOSyBbiYjut26aUYJueIpAEdDA9bfATgTwB8BjDLG1Dp9M8a8AOBi\nAK1jx14I4E4ABZy8SFQ4evQAzjwTuP12YMYM4MorC3vql9Pnepm+zEA3NSZlUs6cE+N16+rftmlT\neOfnEkWVM8pZWVlzoWrDBt2GKdBNN0eXacvuMcbcDuD2LI5/HsDz3rWIiGx2zz0a6O7aBXzlK0G3\nJljOgI+XJYYY6KbGQJdyVlysJ87JAt0+SYtTEFEQEl1ddqYehCnQTTRdwrF+PTBkiH/tISKiGoMG\nAdOnB90KOziBrtcjuoWcHp4Ok7soL926JQ50mbpMZJ+2bXVxtfj6107QeNRRwbQpW+nm6IZpvjER\nEUVXcTHQqpW3I7pbt3JENxUGupSXRIGuMUxdJrJRUZFegKo7oltWBjRtGly7spFqju7Bg3pCwUCX\niIhs0KlTzRQhLzB1OTUGupSXrl3rB7o7d+rS8lz1lMg+HTrUH9ENU2CYao7uxo26DdPzISKi6Ore\nPXHmoxsOHAD27mWgmwoDXcpLt256olxdXbNv5Urd9u4dTJuIKLmOHWsHuqtWAT17BteebLVtqyWS\nEtUldNKww1ITmIiIoq1795r67m5zyhaV1at2Tg4GupSXbt2AQ4dqnzgz0CWyV4cOQEWF/tsYYNGi\ncC1kUVamF9Z27Kh/m1PqjCO6RERkAyfQNcb9+3YCXY7oJsdAl/LirKy8bFnNvpUrdR5gaWkwbSKi\n5Pr108/r4cN6gWrbtnAFuk6HvmVL/ds+/RRo0wZo1szfNhERESXSvbuuK5Ho4my+GOimx0CX8tKr\nly5is2hRzb4VKziaS2SrESN0Dv2yZTWf2zCV40kX6HI0l4iIbOHUdfcifZmBbnoMdCkvDRpozbT4\nQHflStbQJbLVsGGACDB/PrB4MdCihU5BCAsGukREFBY9eujWi0B361bNYGIWU3KRCnRFpIOI/EpE\nXheR3SJSLSInZ3kfnUTkaRHZISK7RGSGiPTwqs1RMGRITaBrDEd0iWxWWgr07VsT6A4erGWHwqJ1\na73AlizQ5UJURERki7ZtgZIS70Z0OZqbWohObzLSF8DNADoBWAwgq6nfIlIC4E0AJwG4E8DtAIYB\neFNEWrva0ggZMgRYsgT4/HP90O3ezRFdIpuNGAG8955eoApT2jKgQXnbtnolu6716zmiS0RE9hDx\nbuVlBrrpRS3QnQ+grTGmH4DJOfz+twH0AnCuMeZeY8z9AM6EBs43udfMaBkyRFdeXraMKy4ThcGI\nEcC8ecDHHwNjxwbdmuy1a1d/RHfXLq3h7cyHIiIisgED3eBEKtA1xuwzxuzM4y6+COA9Y8yCuPtc\nDuA1ABPybV9UDRqk2w8+AP77X03RYKBLZK/x44GhQ4Fp04BLLw26NdlLFOiuWaPbHpxoQkREFunR\no2YgyE1btrCGbjqRCnTzISICYDB0VLiueQB6xVKbqY6WLYHRo4EHHgAeeQS48kqgSZOgW0VEyfTp\noxemJoT08l1ZGQNdIiIKh+HDgeXLgT173L1fjuimx0C3RhsAxQAqE9zm7OvkX3PC5Z57dHGbigrg\nW98KujVEFGXJRnSbNWOnT0REdhk1ShdrnZ9gKM0Y4H/+BzjtNOC++7K7Xwa66Vkb6IoqzuTHpYds\nGtseTHDbgTrHUB0nnQR8+cvAWWdpSiQRkVeSBbo9eujCH0RERLbo1w9o3lzXxqjriSeA3/1OF3Sd\nNAlYuDCz+zx0CNixg4FuOtYGugBOBlCVwc9+EXFjjd+q2DZR4NykzjGUwKOPAi+8EHQriCjqnEDX\nxK2r/8knTFsmIiL7NGhQswhkvB07gBtuAK66CnjzTa1pf++9md3n9u26ZaCbWsOgG5DCMgBXZ3hs\nonTjbG2HjuZ2THCbsy/l40yaNAktW7astW/ixImYOHGiC82zn4h+mImIvNSunV7N3rNH6wIDOqI7\nbpx/bZg6dSqmTp1aa9+uXbv8awAREYXG6NHA3/9ee9/f/gZUVQG/+Q3QsKGO6H7/+8DddwOd0kyW\ndLKaGOimZm2ga4zZDOAxHx/PiMiHAEYkuHk0gE+MMXtT3cfkyZMxfPhwT9pHRETK6di3bNFA1xgt\n3eDniG6ii5gLFizAscce618jiIgoFEaN0gB2xQpdENIY4A9/AL74RaC8XI/50peAG28EXn9dR3lT\nYaCbGZtTlz0lIl1EpG+d3c8AGCkiw+OO6wvgNABP+9k+IiJKzOnYN2+u2VZVAT17BtcmIiKiZMaP\nBzp2BO68U///4osa9F5/fc0xbdpoEJxoLm9dDHQzY+2Ibq5E5DYABsAAAALgyyJyEgAYY34Rd+jj\n0HnA8cH+QwC+DuBFEfkNgMMAJkFTln/rfeuJiCgdJ6BdsQI4/nidnwtwji4REdmpaVPgttt0Tu4F\nF9SstHziibWPGzUq80C3UaOa6TuUWOQCXQA/hwa6iG2/Gvfv+EDXAKiO/0VjzF4ROQXAZAC3QoPg\nNwB8zxizzctGExFRZkpKNKj9+GP9/6JFOr+pjxvLEhIREXngmmt04dZLLgFatdI5unUrBYweDTz9\nNHDwIFCcoq7Mli1aU56VBlKLXKBrjMkoHdsYc2qS/RUALnO1UURE5KoBA2oC3fffBwYNApo0Sf07\nREREQSkuBubMAd5+G2jZEjjqqPrHjBqlpYYWLwZGjkx+X6yhm5mCnaNLREThNWAA8NFH+u/587V0\nAxERkc2KioCxY4FhwxLfPmQI0LgxMHdu6vthoJsZBrpERBQ6AwcCn36qC1F99BHAxY6JiCjsiov1\nQu6iRamPY6CbGQa6REQUOgMG6Papp4AjRziiS0RE0dC/P7BsWepjNm0COnTwpz1hxkCXiIhCp18/\nTQH74x81zWvgwKBbRERElL/+/YGlS1MfU1mp5YooNQa6REQUOk2bAoMH68nABRekXp2SiIgoLPr3\nB7Ztq6mVW9f+/cCuXUCnTv62K4wit+oyEREVhlmzAGOAZs2CbgkREZE7+vXT7dKliefhVlbqliO6\n6XFEl4iIQqlpUwa5REQULb17Aw0aJJ+ny0A3cwx0iYiIiIiILNC4MdCrV/J5uhUVumXqcnoMdImI\niIiIiCzRr1/yQLeyEmjSBGjZ0t82hREDXSIiIiIiIkukWnnZWXFZxN82hREDXSIiIiIiIkv07w+s\nXw/s21f/tooKzs/NFANdIiIiIiIiS/Tvr9vly+vfVlnJ+bmZYqBLRERERERkib59dZsofdlJXab0\nGOgSERERERFZomVLHbVloJsfBrpEREREREQW6d+/fi3dAweA7dsZ6GaKgS4REREREZFFEpUY+uQT\n3fbs6X97woiBLhERERERkUX69wdWrgQOH67Z54zw9usXTJvChoEuERERERGRRY45Bjh0CFixombf\nsmVA69ZAu3bBtStMGOgSERERERFZZNgw3c6fX7Nv2TIdzRUJpk1hw0CXiIiIiIjIIq1aAX36AO+9\nV7Nv6VKmLWeDgS4REREREZFlRoyoGdE1pmZElzLDQJeIiIiIiMgyI0cCCxfqXN2KCmDvXga62WgY\ndAOIiIiIiIiotpEjtXbuRx9p/VyAgW42GOgSERERERFZZtgwoEED4I03gLVrgbZtWUM3Gwx0iYiI\niIiILNOsGXDFFcCvfgXs3w/cdBPQkNFbxiI1R1dEOojIr0TkdRHZLSLVInJyFr//k9jv1P3Z72W7\niYiI/JJtXykix4vIOyKyT0QqReR+ESlJcFxjEblbRDaIyH4RmSMi47x9NkRE0faLXwB79gCHDwPf\n/nbQrQmXqF0T6AvgZgArASwGcFwO92EAfBPAvrh9R/JvGhERkRUy7itFZCiAVwEsATAJwFGx3z0a\nwLl1Dn8MwEUAJgNYBeBqAC+KyFhjzCx3nwIRUWHo0gX44x+BffuA9u2Dbk24RGpEF8B8AG2NMf2g\nHW2unjXGPBn3M82l9kXW1KlTg25C4Pga8DUo9OcP8DUIiWz6yl8C2A7gFGPMn4wxtwO4AcDZ8aO1\nIjIKwAQAPzTG/NAY82cApwNYB+DXXjyJKOHnhq9BoT9/gK8BkPw1+PKXgW99y+fGRECkAl1jzD5j\nzE4X7qpIRFq4cD8Fg19OfA0AvgaF/vwBvgZhkGlfGesHxwF43BgTn+X0GDTraULcvksAHAbwSNzj\nHATwFwDHiUhnN9oeVfzc8DUo9OcP8DUA+Bq4LVKBrksEwCcAdonIHhF5XESYKEBERIVmEHSK0/vx\nO40xhwAsBDAsbvdQACuMMXvr3Me8uNuJiIh8E7U5uvnaAeD3AGYDOAjgJGiK1kgRGZGgAyciIoqq\njtB1KyoT3FYJ4MQ6xyY7TgB0cr11REREKVgb6IqIAGicybGx9Ki8GWN+V2fXdBF5D8DfAVwPzjMi\nIiKLeNxXNo1tE/3egbjbnWOTHYc6xxIREXnO2kAXwMkA3sjgOCMi/Y0xK7xohDFmqojcC52nlCzQ\nbQIAS5cu9aIJobBr1y4sWLAg6GYEiq8BX4NCf/5AYb8GcX1AEx8f1su+siq2LU5wW5O4251jkx2H\nOscmPIZ9aGF+bhyF/hoU+vMH+BoAhf0aeNGHijHGrftylYiUAzgrw8OnG2P21Pn9LwJ4GsCpxpi3\n82zLXAANjDEjktx+BXTUl4iI6EpjzJN+PJCXfaWIHA/gHQATjDHP1LntbQBNjTEjY/9/BUAnY8zA\nOsedBi1PdJ4x5oUkz4F9KBEROVzrQ60d0TXGbIau7GiD7gBSXV55GcCVANaiJk2LiIgKSxNof/Gy\nXw/ocV/5EXQl5REA/j/QFZFG0MWl4kvvLQQwVkSa11nPYgx0nu/CFI/DPpSIiFzvQ60NdL0mIl0A\nNDPGLI/bV2aM2VrnuOsBtAPwUrL7MsZsA+DL1XsiIrLarKAb4BZjzG4ReRXAVSJyR1yJoS8DKIGO\nBDueAfB9ANcB+C0AiEhjAFcDmGOM2ZjicdiHEhER4HIfam3qcq5E5Dbo1eMBAC4H8FcAawDAGPOL\nuOPeBHCyMaYobt8+6BXqD6FXlU8CcBmADwCcaIzhlWYiIgq9LPrKYQDeBbAUwJ8AHAXgJgBvGmPO\nqXOf0wBcCOA+AKugQe4IAKcZY9719hkRERHVFsVAtxraeddljDEN4457A8BJdfb9EcDxALpAh8/X\nQa9S/zLuSjYREVGoZdpXxo49HsDdAIYD2AO9IPzjuv1ibAT3DgBXAWgNYDGA24wxr7r/DIiIiFKL\nXKBLREREREREha0o/SFERERERERE4cFANw8i0lhE7haRDSKyX0TmiMi4oNvlBxE5RUSqE/wcEZFR\nQbfPbSJSIiI/E5GXRGRb7Ll+Ocmx/UTkPyKyJ3bsYyJS5neb3ZbpayAiU5K8N5YE0W63iMgIEXlA\nRD4Skb0isk5EpolI7wTHRu49kOnzj+rfHwBE5BgReVpEVovIPhHZIiJvicgXEhwbufeA29iHsg9N\ncmwkPzvsQ9mHsg/1vw8t2FWXXfIYgIsATEbNwhsvishYY0xkVt5M4z4A8+vsWxVEQzxWBuB/ofO2\nFwIYm+ggEekMYCaAHQB+CKAFgJsBDBSRUcaYw7601hsZvQYxBwBcA0Di9u3yrGX+uAU6h/8f0LmH\nHQB8B8ACERltjFkCRPo9kNHzj4ni3x8AugFoDuBRABUAmgH4IoDnReQ6Y8yfgUi/B9zGPpR9aC0R\n/+ywD2Ufyj7U7z7UGMOfHH4AjAJQDWBS3L5iACsBvBN0+3x4/qfEnv/FQbfFp+fbCED72L+PjT33\nLyc47iEAewF0jtt3euz4a4N+Hj69BlMA7A66vR48/zEAGtbZdzS0Q3os6u+BLJ5/JP/+KV4Xga7M\nvyTq7wGXXzf2oexD2YeyD2Ufyj7U0z6Uqcu5uwTAYQCPODuMMQcB/AXAcbGrEQVBRJqLSIOg2+El\nY8whY8xnGRx6MYB/m7iakcaY1wCsADDBq/b5IYvXAAAgqrmXbfKTMWaOqXMV0RizCsBHAPrH7Y7k\neyCL5w8gen//ZIz2wJ8CaBW3O5LvAZexD41hH1pLZD877EPZh7IPrc/rPpSBbu6GAlhhjNlbZ/+8\nuNsLwRQAuwEcEJHXReTYoBsUFBHpBKA96qehAfq+GOZviwLVDFqGZHdsbsUDIlISdKM8Ug5gK1Cw\n74H/f/5xIv33F5FmItJWRHqKyCQA4wG8GrutEN8DuWAfqtiHxvCzU0ukv0PrYB/KPtSzPpRzdHPX\nEUBlgv2V0GH4Tv42x3efQ2sMvwj9gB4D4PsA3haR440xi4JsXEA6xrbJ3hdtRKSRMeaQj20KQgWA\nXwNYAL2YdjaA6wEMjs29qw6ycW4SkasAdAZwW2xXQb0HEjx/oDD+/vcC+Ebs39UAnoXOtQIK7D2Q\nB/ah7EPr4mdHFcJ3KAD2oexDAXjchzLQzV1TAAcT7D8Qd3tkGWNmA5gdt+vfIvIsdIL9XQDOCaRh\nwXL+5uneF5H4gk7GGHNrnV1Pi8hKAHdC0xWf9r9V7hORfgAeAPAudFEdoIDeA0mef6H8/SdDFxTp\nBE2jagCdXwoU0HsgT+xD2YfWxc8OCuY7lH0o+1Bf+lCmLueuCjV/lHhN4m4vKMaY1QD+CeBUEZF0\nx0eQ8zfn+6K+yQAMgEiUDhGR9gBegK4IeGlsjglQIO+BFM8/mUj9/Y0xK4wxrxtjnjDGnA9dRfJf\nsZsL4j3gAvahdbAP5WcnhUh9h7IPZR/qVx/KQDd3lagZXo/n7KvwsS02+RRAYwCRmUuQBSfNItn7\nYntU0m2yZYw5AGAbgDZBtyVfIlIK4GUApQDONsZsirs58u+BNM8/oSj9/ZN4FsAI0XqIkX8PuIR9\naGLsQ/nZqSdK36HsQ9mHJuBZH8pAN3cLAfRJsCLaGOhVl4X+N8kKvQAcSLDASOQZYyoAbAEwIsHN\no1C47wnEPidl0NcntESkGHrV8WgA5xpjlsffHvX3QLrnn+L3IvH3T8FJtWoZ9feAi9iHJsY+lJ+d\neqLyHco+lH1oEp71oQx0c/cMdI7zdc4OEWkMLXg/J35J7CgSkbIE+4YAOA96papQPQvgC/GlMUTk\ndAB9EI15FSmJSHGS5fBvj21f8rM9bhKRIujfcAyAS4wx85IcGsn3QCbPP8p/fwAQkXYJ9jUE8BVo\nKtWS2O5Ivgdcxj60/j72oQX+2Ynydyj7UPahQfShkj4tnJIRkWkALgRwH4BV0A56BIDTjDHvBtg0\nz4nIa9A35SwAnwEYAODr0Mnjx2d6lSpMROTb0DpfnQF8E8Bz0CLXAPA7Y8weETkKulLeLgD3A2gB\nXUlzPYBREUi5SfkaQNNqPgAwFcCy2P6zoUvHv2iM+YKvDXaRiNwH4LsAnocuolCLMebvseMi+R7I\n5PmLSDdE9O8PACLyHDTd7G0AGwF0AHAlgL4AvmeMuT92XCTfA25jH8o+FOxD2YfGsA9lH+pJH2qM\n4U+OP9B5NHfH/lj7AcwBMC7odvn03G+Arhi5BdoxbwDwKICeQbfNw+e8BsCRJD9d447rD73qtgc6\np+JvANoF3X4/XgMALWPPd3ns+e+HriL6AwANgm5/ns/9jRTP/UidYyP3Hsjk+Uf57x97fhOgo20V\nse+9rbH/n5vg2Mi9Bzx4PdmHsg9lH8o+lH0o+1DP+lCO6BIREREREVGkcI4uERERERERRQoDXSIi\nIiIiIooUBrpEREREREQUKQx0iYiIiIiIKFIY6BIREREREVGkMNAlIiIiIiKiSGGgS0RERERERJHC\nQJeIiIiIiIgihYEuERERERERRQoDXSJKSkS6iUi1iPw16LYQERGFCftQomA1DLoBROQPEanO4nBj\njGng/Dv2Q0REVJDYhxKFDwNdosLx0wT7JgEojd0mcfudTnkjgP4AdnnZMCIiIsv9NME+9qFEFhNj\neJGJqFCJyBoAXeOuPBMREVEG2IcS2Y1zdIkoqWTzi0TkTRE5IiKNReSXIrJORPaLyHwROT12TKmI\nPCgiG0WkSkRmicjIJI/TTkQmi8hKETkgIltE5BkRGeDH8yQiInIb+1CiYDF1mYhy4aSCTAMwEMA/\nATQFcBWAf4nICQAeAdAIwNMA2gG4HMBLItLDGLPHuSMR6QngLQCdALwCYDqA9gC+COAsETnNGPOe\nL8+KiIjIe+xDiXzAQJeIciUA2gAYbIypAgAReQXacb8G4GUAVxpjqmO3LQLwKwDXALgv7n4eB1AO\n4GxjzH///85F7gTwPrSzH+r5syEiIvIP+1AijzF1mYhyZQD82OmgY54BcAhASwDfdzromKnQjn2I\ns0NEhgI4DsDf4jtoADDGrIJ20INE5BhvngIREVEg2IcSeYwjukSUj0Xx/zHGGBH5DEBTY8zGOsdW\nxrad4vaNiW07iMhPEtx/v7jtknwbS0REZBH2oUQeYqBLRDkzxuxNsPswgN0Jjj0iIoDOOXK0iW3P\nif0kU5JrG4mIiGzEPpTIWwx0iShITmf+HWPMQ4G2hIiIKFzYhxKlwDm6RBSkuWKtjT0AAAEcSURB\nVLHtcYG2goiIKHzYhxKlwECXiAITK3kwF8BEEZlQ93ZRJ/vfMiIiIruxDyVKjanLRBS0iQBeB/CU\niNwIYAGAKgBdoVepywA0C655RERE1mIfSpQEA10iMhncnuiYVL+X7LZ692WMWSsiwwB8D8CFAK4G\ncAS6wuRbAP6Rpn1ERERBYR9KZCkxJt3nk4iIiIiIiCg8OEeXiIiIiIiIIoWBLhEREREREUUKA10i\nIiIiIiKKFAa6REREREREFCkMdImIiIiIiChSGOgSERERERFRpDDQJSIiIiIiokhhoEtERERERESR\nwkCXiIiIiIiIIoWBLhEREREREUUKA10iIiIiIiKKFAa6REREREREFCkMdImIiIiIiChS/g+aqLBM\nXw3e3gAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1174fca90>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"n_iterations = 2000\n",
"batch_size = 50\n",
"with tf.Session() as sess:\n",
" init.run()\n",
" for iteration in range(n_iterations):\n",
" X_batch, y_batch = next_batch(batch_size, n_steps)\n",
" sess.run(training_op, feed_dict={X: X_batch, y: y_batch})\n",
" if iteration % 100 == 0:\n",
" mse = loss.eval(feed_dict={X: X_batch, y: y_batch})\n",
" print(iteration, \"\\tMSE:\", mse)\n",
"\n",
" sequence1 = [0. for i in range(n_steps)]\n",
" for iteration in range(len(t) - n_steps):\n",
" X_batch = np.array(sequence1[-n_steps:]).reshape(1, n_steps, 1)\n",
" y_pred = sess.run(outputs, feed_dict={X: X_batch})\n",
" sequence1.append(y_pred[0, -1, 0])\n",
"\n",
" sequence2 = [time_series(i * resolution + t_min + (t_max-t_min/3)) for i in range(n_steps)]\n",
" for iteration in range(len(t) - n_steps):\n",
" X_batch = np.array(sequence2[-n_steps:]).reshape(1, n_steps, 1)\n",
" y_pred = sess.run(outputs, feed_dict={X: X_batch})\n",
" sequence2.append(y_pred[0, -1, 0])\n",
"\n",
"plt.figure(figsize=(11,4))\n",
"plt.subplot(121)\n",
"plt.plot(t, sequence1, \"b-\")\n",
"plt.plot(t[:n_steps], sequence1[:n_steps], \"b-\", linewidth=3)\n",
"plt.xlabel(\"Time\")\n",
"plt.ylabel(\"Value\")\n",
"\n",
"plt.subplot(122)\n",
"plt.plot(t, sequence2, \"b-\")\n",
"plt.plot(t[:n_steps], sequence2[:n_steps], \"b-\", linewidth=3)\n",
"plt.xlabel(\"Time\")\n",
"#save_fig(\"creative_sequence_plot\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Deep RNN"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## MultiRNNCell"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"tf.reset_default_graph()\n",
"\n",
"n_inputs = 2\n",
"n_neurons = 100\n",
"n_layers = 3\n",
"n_steps = 5\n",
"keep_prob = 0.5\n",
"\n",
"X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])\n",
"basic_cell = tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons)\n",
"multi_layer_cell = tf.nn.rnn_cell.MultiRNNCell([basic_cell] * n_layers)\n",
"outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32)\n",
"\n",
"init = tf.initialize_all_variables()"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"X_batch = rnd.rand(2, n_steps, n_inputs)"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"with tf.Session() as sess:\n",
" init.run()\n",
" outputs_val, states_val = sess.run([outputs, states], feed_dict={X: X_batch})"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(2, 5, 100)"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"outputs_val.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dropout"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"tf.reset_default_graph()\n",
"from tensorflow.contrib.layers import fully_connected\n",
"\n",
"n_inputs = 1\n",
"n_neurons = 100\n",
"n_layers = 3\n",
"n_steps = 20\n",
"n_outputs = 1\n",
"\n",
"keep_prob = 0.5\n",
"learning_rate = 0.001\n",
"\n",
"is_training = True\n",
"\n",
"def deep_rnn_with_dropout(X, y, is_training):\n",
" cell = tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons)\n",
" if is_training:\n",
" cell = tf.nn.rnn_cell.DropoutWrapper(cell, input_keep_prob=keep_prob)\n",
" multi_layer_cell = tf.nn.rnn_cell.MultiRNNCell([cell] * n_layers)\n",
" rnn_outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32)\n",
"\n",
" stacked_rnn_outputs = tf.reshape(rnn_outputs, [-1, n_neurons])\n",
" stacked_outputs = fully_connected(stacked_rnn_outputs, n_outputs, activation_fn=None)\n",
" outputs = tf.reshape(stacked_outputs, [-1, n_steps, n_outputs])\n",
"\n",
" loss = tf.reduce_sum(tf.square(outputs - y))\n",
" optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)\n",
" training_op = optimizer.minimize(loss)\n",
"\n",
" return outputs, loss, training_op\n",
"\n",
"X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])\n",
"y = tf.placeholder(tf.float32, [None, n_steps, n_outputs])\n",
"outputs, loss, training_op = deep_rnn_with_dropout(X, y, is_training)\n",
"init = tf.initialize_all_variables()\n",
"saver = tf.train.Saver()"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 \tMSE: 12755.6\n",
"100 \tMSE: 4582.47\n",
"200 \tMSE: 3705.44\n",
"300 \tMSE: 4036.22\n",
"400 \tMSE: 3668.54\n",
"500 \tMSE: 3162.41\n",
"600 \tMSE: 3784.85\n",
"700 \tMSE: 2811.0\n",
"800 \tMSE: 2883.08\n",
"900 \tMSE: 2275.03\n",
"1000 \tMSE: 3245.93\n",
"1100 \tMSE: 3142.94\n",
"1200 \tMSE: 2506.57\n",
"1300 \tMSE: 2843.77\n",
"1400 \tMSE: 2600.08\n",
"1500 \tMSE: 2477.46\n",
"1600 \tMSE: 2470.48\n",
"1700 \tMSE: 3312.73\n",
"1800 \tMSE: 2122.69\n",
"1900 \tMSE: 2112.98\n"
]
}
],
"source": [
"n_iterations = 2000\n",
"batch_size = 50\n",
"\n",
"with tf.Session() as sess:\n",
" if is_training:\n",
" init.run()\n",
" for iteration in range(n_iterations):\n",
" X_batch, y_batch = next_batch(batch_size, n_steps)\n",
" sess.run(training_op, feed_dict={X: X_batch, y: y_batch})\n",
" if iteration % 100 == 0:\n",
" mse = loss.eval(feed_dict={X: X_batch, y: y_batch})\n",
" print(iteration, \"\\tMSE:\", mse)\n",
" save_path = saver.save(sess, \"/tmp/my_model.ckpt\")\n",
" else:\n",
" saver.restore(sess, \"/tmp/my_model.ckpt\")\n",
" X_new = time_series(np.array(t_instance[:-1].reshape(-1, n_steps, n_inputs)))\n",
" y_pred = sess.run(outputs, feed_dict={X: X_new})\n",
" \n",
" plt.title(\"Testing the model\", fontsize=14)\n",
" plt.plot(t_instance[:-1], time_series(t_instance[:-1]), \"bo\", markersize=10, label=\"instance\")\n",
" plt.plot(t_instance[1:], time_series(t_instance[1:]), \"w*\", markersize=10, label=\"target\")\n",
" plt.plot(t_instance[1:], y_pred[0,:,0], \"r.\", markersize=10, label=\"prediction\")\n",
" plt.legend(loc=\"upper left\")\n",
" plt.xlabel(\"Time\")\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# LSTM"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"tf.reset_default_graph()\n",
"\n",
"from tensorflow.contrib.layers import fully_connected\n",
"\n",
"n_steps = 28\n",
"n_inputs = 28\n",
"n_neurons = 150\n",
"n_outputs = 10\n",
"\n",
"learning_rate = 0.001\n",
"\n",
"X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])\n",
"y = tf.placeholder(tf.int32, [None])\n",
"\n",
"lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=n_neurons, state_is_tuple=True)\n",
"multi_cell = tf.nn.rnn_cell.MultiRNNCell([lstm_cell]*3, state_is_tuple=True)\n",
"outputs, states = tf.nn.dynamic_rnn(multi_cell, X, dtype=tf.float32)\n",
"top_layer_h_state = states[-1][1]\n",
"logits = fully_connected(top_layer_h_state, n_outputs, activation_fn=None, scope=\"softmax\")\n",
"xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, y)\n",
"loss = tf.reduce_mean(xentropy, name=\"loss\")\n",
"optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)\n",
"training_op = optimizer.minimize(loss)\n",
"correct = tf.nn.in_top_k(logits, y, 1)\n",
"accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))\n",
" \n",
"init = tf.initialize_all_variables()"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(LSTMStateTuple(c=<tf.Tensor 'RNN/while/Exit_2:0' shape=(?, 150) dtype=float32>, h=<tf.Tensor 'RNN/while/Exit_3:0' shape=(?, 150) dtype=float32>),\n",
" LSTMStateTuple(c=<tf.Tensor 'RNN/while/Exit_4:0' shape=(?, 150) dtype=float32>, h=<tf.Tensor 'RNN/while/Exit_5:0' shape=(?, 150) dtype=float32>),\n",
" LSTMStateTuple(c=<tf.Tensor 'RNN/while/Exit_6:0' shape=(?, 150) dtype=float32>, h=<tf.Tensor 'RNN/while/Exit_7:0' shape=(?, 150) dtype=float32>))"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"states"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<tf.Tensor 'RNN/while/Exit_7:0' shape=(?, 150) dtype=float32>"
]
},
"execution_count": 57,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"top_layer_h_state"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 0 Train accuracy = 0.853333 Test accuracy = 0.8385\n",
"Epoch 1 Train accuracy = 0.953333 Test accuracy = 0.8952\n",
"Epoch 2 Train accuracy = 0.933333 Test accuracy = 0.9356\n",
"Epoch 3 Train accuracy = 0.92 Test accuracy = 0.9412\n",
"Epoch 4 Train accuracy = 0.986667 Test accuracy = 0.9539\n",
"Epoch 5 Train accuracy = 0.966667 Test accuracy = 0.9565\n",
"Epoch 6 Train accuracy = 0.98 Test accuracy = 0.9652\n",
"Epoch 7 Train accuracy = 0.98 Test accuracy = 0.9647\n",
"Epoch 8 Train accuracy = 0.98 Test accuracy = 0.9732\n",
"Epoch 9 Train accuracy = 0.973333 Test accuracy = 0.9729\n"
]
}
],
"source": [
"n_epochs = 10\n",
"batch_size = 150\n",
"\n",
"with tf.Session() as sess:\n",
" init.run()\n",
" for epoch in range(n_epochs):\n",
" for iteration in range(len(mnist.test.labels)//batch_size):\n",
" X_batch, y_batch = mnist.train.next_batch(batch_size)\n",
" X_batch = X_batch.reshape((batch_size, n_steps, n_inputs))\n",
" sess.run(training_op, feed_dict={X: X_batch, y: y_batch})\n",
" acc_train = accuracy.eval(feed_dict={X: X_batch, y: y_batch})\n",
" acc_test = accuracy.eval(feed_dict={X: X_test, y: y_test})\n",
" print(\"Epoch\", epoch, \"Train accuracy =\", acc_train, \"Test accuracy =\", acc_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Distributing layers across devices"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import tensorflow as tf\n",
"\n",
"class DeviceCellWrapper(tf.nn.rnn_cell.RNNCell):\n",
" def __init__(self, device, cell):\n",
" self._cell = cell\n",
" self._device = device\n",
"\n",
" @property\n",
" def state_size(self):\n",
" return self._cell.state_size\n",
"\n",
" @property\n",
" def output_size(self):\n",
" return self._cell.output_size\n",
"\n",
" def __call__(self, inputs, state, scope=None):\n",
" with tf.device(self._device):\n",
" return self._cell(inputs, state, scope)"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"tf.reset_default_graph()\n",
"\n",
"n_inputs = 5\n",
"n_neurons = 100\n",
"devices = [\"/cpu:0\"]*5\n",
"n_steps = 20\n",
"X = tf.placeholder(tf.float32, shape=[None, n_steps, n_inputs])\n",
"lstm_cells = [DeviceCellWrapper(device, tf.nn.rnn_cell.BasicRNNCell(num_units=n_neurons))\n",
" for device in devices]\n",
"multi_layer_cell = tf.nn.rnn_cell.MultiRNNCell(lstm_cells)\n",
"outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32)\n",
"init = tf.initialize_all_variables()"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[[ -3.62410322e-02 5.36520081e-03 -8.48066621e-03 ..., 9.47943889e-03\n",
" -1.64868849e-04 4.30348143e-03]\n",
" [ -5.65063618e-02 1.96487941e-02 3.04428358e-02 ..., -1.61463320e-02\n",
" -7.38892034e-02 -4.37535830e-02]\n",
" [ -4.71536815e-02 -9.79799852e-02 -2.46124659e-02 ..., 8.38893279e-02\n",
" -1.28212735e-01 -1.43267050e-01]\n",
" ..., \n",
" [ -2.71415681e-01 2.47666255e-01 -2.45113403e-01 ..., 6.97874092e-03\n",
" -3.33116591e-01 -1.10748738e-01]\n",
" [ -1.94742754e-01 1.71515942e-01 -2.69154727e-01 ..., -1.24836780e-01\n",
" -3.50653201e-01 -2.37404406e-01]\n",
" [ -1.91879243e-01 1.60464764e-01 -2.04435155e-01 ..., -5.08808121e-02\n",
" -2.38990977e-01 -9.71127152e-02]]\n",
"\n",
" [[ -7.06452206e-02 -2.17116368e-03 -2.48030275e-02 ..., 1.39924334e-02\n",
" 1.99646037e-02 8.69250204e-03]\n",
" [ -1.12675831e-01 2.30047554e-02 3.91782485e-02 ..., -3.73628139e-02\n",
" -5.96980676e-02 -8.46209824e-02]\n",
" [ 1.14398962e-02 -1.75988123e-01 -6.47182092e-02 ..., 3.11662778e-02\n",
" -1.37174323e-01 -1.94520310e-01]\n",
" ..., \n",
" [ -1.66847318e-01 2.07757875e-01 -1.82842255e-01 ..., -8.40383321e-02\n",
" -3.85075450e-01 4.04060781e-02]\n",
" [ -7.28125423e-02 -4.01358642e-02 -6.29809052e-02 ..., -4.42736149e-02\n",
" -3.83944422e-01 -1.83253393e-01]\n",
" [ -1.65948197e-01 2.55000144e-01 -2.61569232e-01 ..., -2.75357850e-02\n",
" -2.64933348e-01 5.10389097e-02]]]\n"
]
}
],
"source": [
"with tf.Session() as sess:\n",
" init.run()\n",
" print(sess.run(outputs, feed_dict={X: rnd.rand(2, n_steps, n_inputs)}))"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"# Exercise solutions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Coming soon**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.1"
},
"nav_menu": {},
"toc": {
"navigate_menu": true,
"number_sections": true,
"sideBar": true,
"threshold": 6,
"toc_cell": false,
"toc_section_display": "block",
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 0
}