|
|
@@ -0,0 +1,921 @@ |
|
|
{ |
|
|
"cells": [ |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": 1, |
|
|
"metadata": { |
|
|
"collapsed": false |
|
|
}, |
|
|
"outputs": [ |
|
|
{ |
|
|
"name": "stderr", |
|
|
"output_type": "stream", |
|
|
"text": [ |
|
|
"C:\\Python34\\lib\\site-packages\\skcuda\\cublas.py:273: UserWarning: creating CUBLAS context to get version number\n", |
|
|
" warnings.warn('creating CUBLAS context to get version number')\n" |
|
|
] |
|
|
} |
|
|
], |
|
|
"source": [ |
|
|
"import argparse\n", |
|
|
"import math\n", |
|
|
"import sys\n", |
|
|
"import time\n", |
|
|
"\n", |
|
|
"import numpy as np\n", |
|
|
"import six\n", |
|
|
"\n", |
|
|
"import chainer\n", |
|
|
"from chainer import cuda\n", |
|
|
"import chainer.functions as F\n", |
|
|
"from chainer import optimizers" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": null, |
|
|
"metadata": { |
|
|
"collapsed": true |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"\n", |
|
|
"######### CONFIGURATION ###########\n", |
|
|
"\n", |
|
|
"# training data source\n", |
|
|
"train_file = 'chainer.txt'\n", |
|
|
"train_chars = True # False for word-level training like the original example\n", |
|
|
"tokenize_caps = False # if set to True in train_chars mode, will replace AB with |a|b to get a smaller vocabulary\n", |
|
|
"train_fraction = 0.90 # amount of source file data to use for training \n", |
|
|
"valid_fraction = 0.03 # amount of source file data to use for validation (too much -> slow training)\n", |
|
|
"test_fraction = 0.07 # amount of source file data to use for training \n", |
|
|
"\n", |
|
|
"# training parameters\n", |
|
|
"n_epoch = 100 # number of epochs\n", |
|
|
"n_units = 200 # number of units per layer\n", |
|
|
"batchsize = 128 # minibatch size\n", |
|
|
"bprop_len = 120 # length of truncated BPTT\n", |
|
|
"grad_clip = 5 # gradient norm threshold to clip\n", |
|
|
"use_GPU_no = 0 # GPU index to use, set to -1 for CPU\n", |
|
|
"\n", |
|
|
"# reporting parameters\n", |
|
|
"generate_every = 180 # every X seconds during training, generate some text to assess progress\n", |
|
|
"validate_every = int(n_epoch/8) # default: do a validation every n-th epoch during training (default=8 times total)\n", |
|
|
"perp_every = 30 # display the current perplexity every x seconds\n", |
|
|
"\n", |
|
|
"####### END CONFIGURATION #########\n" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": 3, |
|
|
"metadata": { |
|
|
"collapsed": false |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"# CANNOT USE THIS IN NOTEBOOK\n", |
|
|
"\n", |
|
|
"#parser = argparse.ArgumentParser()\n", |
|
|
"#parser.add_argument('--gpu', '-g', default=-1, type=int,\n", |
|
|
"# help='GPU ID (negative value indicates CPU)')\n", |
|
|
"#args = parser.parse_args()\n", |
|
|
"#mod = cuda if args.gpu >= 0 else np\n", |
|
|
"# so let's fake --gpu 0 arg\n", |
|
|
"\n", |
|
|
"class FakeArg:\n", |
|
|
" def __init__(self):\n", |
|
|
" pass\n", |
|
|
"args = FakeArg()\n", |
|
|
"mod = cuda\n", |
|
|
"args.gpu = use_GPU_no" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": 4, |
|
|
"metadata": { |
|
|
"collapsed": false |
|
|
}, |
|
|
"outputs": [ |
|
|
{ |
|
|
"name": "stdout", |
|
|
"output_type": "stream", |
|
|
"text": [ |
|
|
"#vocab = 88\n", |
|
|
"train_data: 74246 items\n", |
|
|
"valid_data: 1650 items\n", |
|
|
"test_data: 6600 items\n" |
|
|
] |
|
|
} |
|
|
], |
|
|
"source": [ |
|
|
"## text generation helper functions\n", |
|
|
"\n", |
|
|
"def replace_caps(input, identifier=\"|\", identifier_replace=\"}{\"):\n", |
|
|
" input = input.replace(identifier, identifier_replace)\n", |
|
|
" uppers=[chr(n) for n in range(ord(\"A\"),ord(\"Z\"))]\n", |
|
|
" lowers=[identifier+chr(n) for n in range(ord(\"a\"),ord(\"z\"))]\n", |
|
|
" for u, repl in zip(uppers,lowers):\n", |
|
|
" input = input.replace(u,repl)\n", |
|
|
" return input\n", |
|
|
" \n", |
|
|
"\n", |
|
|
"def rebuild_caps(input, identifier=\"|\", identifier_replace=\"}{\"):\n", |
|
|
" uppers=[chr(n) for n in range(ord(\"A\"),ord(\"Z\"))]\n", |
|
|
" lowers=[identifier+chr(n) for n in range(ord(\"a\"),ord(\"z\"))]\n", |
|
|
" for u, repl in zip(uppers,lowers):\n", |
|
|
" input = input.replace(repl,u)\n", |
|
|
" input = input.replace(identifier_replace, identifier)\n", |
|
|
" return input\n", |
|
|
"\n", |
|
|
"\n", |
|
|
"def load_data(filename):\n", |
|
|
" global vocab, n_vocab\n", |
|
|
" words = open(filename).read().replace('\\n', ' <eos> ').strip().split()\n", |
|
|
" dataset = np.ndarray((len(words),), dtype=np.int32)\n", |
|
|
" for i, word in enumerate(words):\n", |
|
|
" if word not in vocab:\n", |
|
|
" vocab[word] = len(vocab)\n", |
|
|
" dataset[i] = vocab[word]\n", |
|
|
" return dataset\n", |
|
|
"\n", |
|
|
"def load_data_onechar(filename, nocaps=True):\n", |
|
|
" global vocab, n_vocab\n", |
|
|
" with open(filename,\"rb\") as f:\n", |
|
|
" raw = f.read().decode('utf-8',errors='replace')\n", |
|
|
" if nocaps: \n", |
|
|
" raw = replace_caps(raw)\n", |
|
|
" chars = [char for char in raw.replace('\\n', '<br>').replace(\"\\r\",\"\").strip() ]\n", |
|
|
" dataset = np.ndarray((len(chars),), dtype=np.int32)\n", |
|
|
" vocab[\"\"] = 0\n", |
|
|
" for i, char in enumerate(chars):\n", |
|
|
" if char not in vocab:\n", |
|
|
" vocab[char] = len(vocab)\n", |
|
|
" dataset[i] = vocab[char]\n", |
|
|
" return dataset\n", |
|
|
"\n", |
|
|
"# Prepare dataset (preliminary download dataset by ./download.py)\n", |
|
|
"vocab = {}\n", |
|
|
"\n", |
|
|
"#all_train_data = load_data('emilydickinson.txt')\n", |
|
|
"if train_chars:\n", |
|
|
" all_train_data = load_data_onechar(train_file, nocaps=tokenize_caps)\n", |
|
|
"else:\n", |
|
|
" all_train_data = load_data(train_file)\n", |
|
|
" \n", |
|
|
"\n", |
|
|
"#valid_data = load_data('ptb.valid.txt')\n", |
|
|
"#test_data = load_data('ptb.test.txt')\n", |
|
|
"\n", |
|
|
"total_len = len(all_train_data)\n", |
|
|
"\n", |
|
|
"#potentially truncate the data for faster prototype training\n", |
|
|
"total_len = total_len #/5\n", |
|
|
"\n", |
|
|
"# chop parts off for validation and test\n", |
|
|
"train = total_len * train_fraction\n", |
|
|
"valid = total_len * valid_fraction\n", |
|
|
"test = total_len * test_fraction\n", |
|
|
"\n", |
|
|
"train_data = all_train_data[:int(train)]\n", |
|
|
"valid_data = all_train_data[int(train):int(train+valid)]\n", |
|
|
"test_data = all_train_data[int(train+valid):int(train+valid+test)]\n", |
|
|
"\n", |
|
|
"print('#vocab =', len(vocab))\n", |
|
|
"print(\"train_data:\",len(train_data),\"items\")\n", |
|
|
"print(\"valid_data:\",len(valid_data),\"items\")\n", |
|
|
"print(\"test_data:\",len(test_data),\"items\")" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": 5, |
|
|
"metadata": { |
|
|
"collapsed": false |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"# Neural net architecture\n", |
|
|
"\n", |
|
|
"def forward_one_step(x_data, y_data, state, train=True):\n", |
|
|
" if args.gpu >= 0:\n", |
|
|
" x_data = cuda.to_gpu(x_data)\n", |
|
|
" y_data = cuda.to_gpu(y_data)\n", |
|
|
" \n", |
|
|
" x = chainer.Variable(x_data, volatile=not train)\n", |
|
|
" t = chainer.Variable(y_data, volatile=not train)\n", |
|
|
" \n", |
|
|
" h0 = model.embed(x)\n", |
|
|
" \n", |
|
|
" h1_in = model.l1_x(F.dropout(h0, train=train)) + model.l1_h(state['h1'])\n", |
|
|
" c1, h1 = F.lstm(state['c1'], h1_in)\n", |
|
|
" h2_in = model.l2_x(F.dropout(h1, train=train)) + model.l2_h(state['h2'])\n", |
|
|
" c2, h2 = F.lstm(state['c2'], h2_in)\n", |
|
|
" y = model.l3(F.dropout(h2, train=train))\n", |
|
|
" \n", |
|
|
" state = {'c1': c1, 'h1': h1, 'c2': c2, 'h2': h2}\n", |
|
|
" return state, F.softmax_cross_entropy(y, t)\n", |
|
|
"\n", |
|
|
"\n", |
|
|
"def make_initial_state(batchsize=batchsize, train=True):\n", |
|
|
" return {name: chainer.Variable(mod.zeros((batchsize, n_units), dtype=np.float32), volatile=not train)\n", |
|
|
" for name in ('c1', 'h1', 'c2', 'h2')}\n", |
|
|
"\n", |
|
|
"# Evaluation routine\n", |
|
|
"def evaluate(dataset):\n", |
|
|
" sum_log_perp = mod.zeros(())\n", |
|
|
" state = make_initial_state(batchsize=1, train=False)\n", |
|
|
" for i in six.moves.range(0,dataset.size - 1,1):\n", |
|
|
" x_batch = dataset[i:i + 1]\n", |
|
|
" y_batch = dataset[i + 1:i + 2]\n", |
|
|
" state, loss = forward_one_step(x_batch, y_batch, state, train=False)\n", |
|
|
" sum_log_perp += loss.data.reshape(())\n", |
|
|
"\n", |
|
|
" return math.exp(cuda.to_cpu(sum_log_perp) / (dataset.size - 1))\n", |
|
|
"\n", |
|
|
"\n", |
|
|
"# Prepare RNNLM model\n", |
|
|
"model = chainer.FunctionSet(embed=F.EmbedID(len(vocab), n_units),\n", |
|
|
" l1_x=F.Linear(n_units, 4 * n_units), \n", |
|
|
" l1_h=F.Linear(n_units, 4 * n_units),\n", |
|
|
" l2_x=F.Linear(n_units, 4 * n_units), \n", |
|
|
" l2_h=F.Linear(n_units, 4 * n_units),\n", |
|
|
" l3=F.Linear(n_units, len(vocab)))\n", |
|
|
"\n", |
|
|
"for param in model.parameters:\n", |
|
|
" param[:] = np.random.uniform(-0.1, 0.1, param.shape)\n", |
|
|
"if args.gpu >= 0:\n", |
|
|
" cuda.init(args.gpu)\n", |
|
|
" model.to_gpu()\n", |
|
|
"\n" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": 6, |
|
|
"metadata": { |
|
|
"collapsed": true |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"# helper functions\n", |
|
|
"def to_word(idx):\n", |
|
|
" global vocab\n", |
|
|
" return list(vocab.keys())[list(vocab.values()).index(idx)]\n", |
|
|
"\n", |
|
|
"def to_index(word):\n", |
|
|
" global vocab\n", |
|
|
" return vocab.get(word.lower(),vocab.get('<unk>',0))\n", |
|
|
"\n", |
|
|
"\n", |
|
|
"def produce_one_step(x_data,state, train=False):\n", |
|
|
" if args.gpu >= 0:\n", |
|
|
" x_data = cuda.to_gpu(x_data)\n", |
|
|
" x = chainer.Variable(x_data, volatile=not train)\n", |
|
|
" h0 = model.embed(x)\n", |
|
|
" h1_in = model.l1_x(F.dropout(h0, train=train)) + model.l1_h(state['h1'])\n", |
|
|
" c1, h1 = F.lstm(state['c1'], h1_in)\n", |
|
|
" h2_in = model.l2_x(F.dropout(h1, train=train)) + model.l2_h(state['h2'])\n", |
|
|
" c2, h2 = F.lstm(state['c2'], h2_in)\n", |
|
|
" y = model.l3(F.dropout(h2, train=train))\n", |
|
|
" state = {'c1': c1, 'h1': h1, 'c2': c2, 'h2': h2}\n", |
|
|
" return state, y" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": 7, |
|
|
"metadata": { |
|
|
"collapsed": true |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"#### TEXT PRODUCTION HELPERS\n", |
|
|
"# helper functions\n", |
|
|
"def to_word(idx):\n", |
|
|
" global vocab\n", |
|
|
" return list(vocab.keys())[list(vocab.values()).index(idx)]\n", |
|
|
"\n", |
|
|
"def to_index(word):\n", |
|
|
" global vocab\n", |
|
|
" return vocab.get(word.lower(),vocab.get('<unk>',0))\n", |
|
|
"\n", |
|
|
"\n", |
|
|
"def produce_one_step(x_data,state, train=False):\n", |
|
|
" if args.gpu >= 0:\n", |
|
|
" x_data = cuda.to_gpu(x_data)\n", |
|
|
" x = chainer.Variable(x_data, volatile=not train)\n", |
|
|
" h0 = model.embed(x)\n", |
|
|
" h1_in = model.l1_x(F.dropout(h0, train=train)) + model.l1_h(state['h1'])\n", |
|
|
" c1, h1 = F.lstm(state['c1'], h1_in)\n", |
|
|
" h2_in = model.l2_x(F.dropout(h1, train=train)) + model.l2_h(state['h2'])\n", |
|
|
" c2, h2 = F.lstm(state['c2'], h2_in)\n", |
|
|
" y = model.l3(F.dropout(h2, train=train))\n", |
|
|
" state = {'c1': c1, 'h1': h1, 'c2': c2, 'h2': h2}\n", |
|
|
" return state, y\n", |
|
|
"\n", |
|
|
"import sys\n", |
|
|
"\n", |
|
|
"def generate(primer_text,amount,dictionary,randomness=0.5,start_state=None,stop_count=3, separator=\" \"):\n", |
|
|
" state = start_state or make_initial_state(1,False)\n", |
|
|
" \n", |
|
|
" primer_text.replace(\"\\n\",\"<eos>\")\n", |
|
|
" print(primer_text + \" => \")\n", |
|
|
" if separator: # don't split if it's a character based model!\n", |
|
|
" primer_text = primer_text.split()\n", |
|
|
" primer_x = [to_index(word) for word in primer_text]\n", |
|
|
" \n", |
|
|
" # priming until before the last item, that goes into generation loop since we want the result\n", |
|
|
" for item in primer_x[:-1]:\n", |
|
|
" state, y = produce_one_step(np.array([item],dtype=\"int32\"),state)\n", |
|
|
" yarr = [float(x) for x in cuda.to_cpu(y.data.ravel())]\n", |
|
|
" #print(to_word(item),\"->\",to_word(np.argmax(yarr)),end=\" # \")\n", |
|
|
" sys.stdout.flush()\n", |
|
|
" \n", |
|
|
" #print(\"\\nLooping:\\n\")\n", |
|
|
" \n", |
|
|
" current = primer_x[-1]\n", |
|
|
" end_count=0\n", |
|
|
" for i in range(amount):\n", |
|
|
" # feed x to model\n", |
|
|
" state, y = produce_one_step(np.array([current],dtype=\"int32\"),state)\n", |
|
|
" # append y to x - wait, we DON'T NEED TO APPEND; THIS IS A REAL RNN\n", |
|
|
" # print y\n", |
|
|
" yarr = cuda.to_cpu(y.data.ravel())\n", |
|
|
" result_word = \"<unk>\"\n", |
|
|
" while result_word == \"<unk>\":\n", |
|
|
" yarr *= (1+np.random.uniform(high=randomness,size=len(yarr)))\n", |
|
|
" yidx = np.argmax([float(i) for i in yarr])\n", |
|
|
" result_word = to_word(yidx)\n", |
|
|
" print(result_word.replace(\"\\r\",\"<r>\"),end=separator)\n", |
|
|
" sys.stdout.flush()\n", |
|
|
" current = to_index(result_word)\n", |
|
|
"\n", |
|
|
" if i >= 5: # look for production stoppers after 5 words\n", |
|
|
" if \".\" in result_word or \"!\" in result_word or \"?\" in result_word:\n", |
|
|
" end_count += 1\n", |
|
|
" if \"<eos>\" in result_word:\n", |
|
|
" end_count += 3\n", |
|
|
" if end_count >= stop_count:\n", |
|
|
" break\n", |
|
|
" \n", |
|
|
" #y_cpu = cuda.to_cpu(y)\n", |
|
|
" #print(\"y.data-\",y.data[0][-1],end=\"#\")\n", |
|
|
" #current=int(y_cpu.data[0][-1])\n", |
|
|
" print(\"\\n\",\"-\" * 16)\n", |
|
|
" \n", |
|
|
" return state\n" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": null, |
|
|
"metadata": { |
|
|
"collapsed": false |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"# plotting \n", |
|
|
"%matplotlib inline\n", |
|
|
"import matplotlib\n", |
|
|
"import matplotlib.pyplot as plt\n", |
|
|
"\n", |
|
|
"def plot_progress(perp_dic, title=\"perplexity\", start_at=0):\n", |
|
|
" trn = list(perp_dic.items())\n", |
|
|
" trn.sort()\n", |
|
|
" plt.plot([x[0] for x in trn[start_at:]],[x[1] for x in trn[start_at:]] )\n", |
|
|
" plt.title(title)\n", |
|
|
" plt.yscale('log')\n", |
|
|
" plt.show()\n" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": 9, |
|
|
"metadata": { |
|
|
"collapsed": true |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"# Setup optimizer\n", |
|
|
"#optimizer = optimizers.SGD(lr=1.0)\n", |
|
|
"#optimizer = optimizers.SGD(lr=1.)\n", |
|
|
"optimizer = optimizers.Adam()\n", |
|
|
"optimizer.setup(model.collect_parameters())" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": 10, |
|
|
"metadata": { |
|
|
"collapsed": true |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"# Learning loop prep\n", |
|
|
"\n", |
|
|
"# training data range init\n", |
|
|
"whole_len = train_data.shape[0]\n", |
|
|
"jump = whole_len // batchsize\n", |
|
|
"epoch = 0\n", |
|
|
"start_iter = 0 # use 'start_iter = i' if you want to continue a previous training!\n", |
|
|
"# time stamps for throughput calc\n", |
|
|
"start_at = time.time()\n", |
|
|
"cur_at = start_at \n", |
|
|
"# loss and state initialization\n", |
|
|
"cur_log_perp = mod.zeros(())\n", |
|
|
"accum_loss = chainer.Variable(mod.zeros((), dtype=np.float32)) \n", |
|
|
"state = make_initial_state()\n", |
|
|
"# logging initialization\n", |
|
|
"training_perps = {}\n", |
|
|
"valid_perps = {}" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": null, |
|
|
"metadata": { |
|
|
"collapsed": true |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"# uncomment the next line to continue previously interrupted training!\n", |
|
|
"#start_iter = i" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": null, |
|
|
"metadata": { |
|
|
"collapsed": false, |
|
|
"scrolled": false |
|
|
}, |
|
|
"outputs": [ |
|
|
{ |
|
|
"name": "stdout", |
|
|
"output_type": "stream", |
|
|
"text": [ |
|
|
"batch size is 580\n", |
|
|
"going to train 100 epochs = 58000 iterations\n", |
|
|
"iter 193 training perplexity: 89.73 ( 6.62 iters/sec) ETA: Mon Aug 3 19:32:28 2015\n", |
|
|
"iter 2427 training perplexity: 39.66 ( 27.56 iters/sec) ETA: Mon Aug 3 17:41:30 2015\n", |
|
|
"iter 3536 training perplexity: 25.92 ( 30.21 iters/sec) ETA: Mon Aug 3 17:38:26 2015\n", |
|
|
"iter 4679 training perplexity: 22.56 ( 32.04 iters/sec) ETA: Mon Aug 3 17:36:37 2015\n" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"data": { |
|
|
"image/png": "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\ncP17BJkAAAAASUVORK5CYII=\n", |
|
|
"text/plain": [ |
|
|
"<matplotlib.figure.Figure at 0x18299ef0>" |
|
|
] |
|
|
}, |
|
|
"metadata": {}, |
|
|
"output_type": "display_data" |
|
|
}, |
|
|
{ |
|
|
"name": "stdout", |
|
|
"output_type": "stream", |
|
|
"text": [ |
|
|
"--- Generating text: \n", |
|
|
"i...\n", |
|
|
" \n", |
|
|
" ----------------------------------------\n", |
|
|
"Validating.. epoch 12 validation perplexity: 17.88\n", |
|
|
"iter 7946 training perplexity: 18.24 ( 31.67 iters/sec) ETA: Mon Aug 3 17:36:57 2015\n", |
|
|
"iter 9077 training perplexity: 14.79 ( 32.43 iters/sec) ETA: Mon Aug 3 17:36:15 2015\n", |
|
|
"iter 11363 training perplexity: 12.99 ( 33.53 iters/sec) ETA: Mon Aug 3 17:35:16 2015\n" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"data": { |
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXsAAAEKCAYAAADzQPVvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xm4XFWZ7/HvLzMkIQNDSEJGAoRBJpsgglJwI0OAAK2N\ntIqI4tzAFWkJ7e027dAN2MqkOCBigAZCI4QwNBI1BxEQkEEGiQFCgAA5kIQQmYl57x9rV1JUzpST\nqrNr+H2ep56zp9r7XXXOefeqtdbeWxGBmZk1tl55B2BmZtXnZG9m1gSc7M3MmoCTvZlZE3CyNzNr\nAk72ZmZNwMm+xkm6WdJxld62lkn6haRvVWA/f5U0fuMjWru//5R0SqX2143jL5b0fyqwn4p+LpUm\n6W5JO+UdR6Nxsq8CSa9m/1B/lbRG0usl8/+4IfuKiGkRcVmlt61xkb02bicRgyNiMWz8CUTSlsBx\nwI83Nq6NUPHPpVokHSjpfkmvSHpS0mfL1n9b0hJJKyXNL0vu/wV8s5rxNSMn+yqIiEHZP9Rg4Gng\n8OJ8RFxZ3E5Sn/yizMcGlFlVDWTDfQq4KSLeyjuQWiepL3Ad8KOIGAJ8FPi+pF2z9ccAJwD7AcOB\nu4DSSsoNwAGSRvRo4A3Oyb4HSSpktZmvSXoBuFjSUEk3SnpR0gpJN0gaXfKeFkmfyaY/Jen3kr6b\nbbtI0iHd3HaCpN9JWiVpnqQfSmrzW0FJ3GdIeknSU5I+VrK+v6T/kvS0pKWSfiRpQAdl3r+j/bVx\n/MMlPSjpZUl3SHpPtvyjWbkGZ/OHSnpB0ubZ/BpJ20r6HPAx4GvZt6u5kk6TdE3Zcc6XdG47YRwC\n3Fay7WOSDiuZ75OVZfdsfrqkR7OY50uaXLLtGEnXZr/zZZIuyJZvK+m32bKXJF0uaUhZHFOy/a6Q\n9HNJ/dv5zCZJui2rOb8k6aqSdWskTZQ0Suu+cf5V6RvompLtPi3pz9mxbpE0tr3fUZnhwGCyBB4R\nfwQeA3bM1o8Hfh8RiyNiDfDfwNqafUS8CdwHHNzF41kXONn3vBHAMGAs8HnS7+DibH4s8Abwg5Lt\ny7+6TwEWAJsDZ2fv7c62VwB/IP1jzgQ+QcdNBCOy/YwCjgd+Kmn7bN2ZwCRgt+znaODfOiiz2tnf\nduUHlbRHFvdns1h/AsyV1DciZgN3AudnCf5nwGciYnnpZxIRPyUllLOyb1fTgcuBQ4rJVOkbx0eB\nWe2U/z3AX0rmrwBKm+QOBl6MiAezz+UK4GRgC+Bm4IbshNAbuBF4ChiXfVZXleznO8BIUmIcQ/rd\nrP04SCetg4Btge2B/9dOvN8CbomIodkxzi/fICKeL/nGORi4Frgy+zyOBM4Ajs7KcHtxXbb+Bklf\na+vAEdGabftpSb0lvT8r6++zTa4CtpW0ndK3gOOB/y3bzWOkvyerlIjwq4ov0j/1gdl0AXgL6NfB\n9rsDK0rm5wOfzqY/BTxesm5TYA2w1YZsS0q67wADStZfBlzWTkyFbPtNSpbNJiUaAa8CE0vW7QMs\naq/MHe0vm74E+GY2/aPidMm2C4APZtNDSE1lD5GaDUq3W1OMK9vnt8rW3wycmE0fDjzSwe/lbWD7\nkvltgVXFz5B0MinG/6/AVSXbClgC7J99Ni8Cvbrwt3MUcH/Z39LnSuYPBZ5o572zSCfG0W2sW/u5\nlCw7HbgX6J/N/2/xbymb7wW8Bozp4t/9EcDS7Pf8DukkXFzXDzgvi+Md4ElgfNn7vw1cnMf/bKO+\nXLPveS9FxNvFGUmbSvqJ0kiLV0hNBUMktddmvbQ4ERGvZ5ODNnDbUaQTypsl2z7bSdwvR8QbJfNP\nk2qgW5BOJPdlTRYvkxLFFiXbvqvMneyv3Djgq8V9Z/vfprhtRLwCXAPsAnyvkzKUm0X6RkP2s6PO\n7ZdJTRNkx32SVPucLmlTUnK7Ils9EnimZNsgfb6js9ifjtR88S6SRki6KmvieiWLZ/OyzUp/T8+Q\nfpdt+RrpJHOPpEckndBewSQdSvoWclSs65MYB5xX8pkXvy2NbmsfZfubTKq9HxcRfYGdgdMlTcs2\n+TdgL9Jn0Z/UGftbSZuU7GYz0mduFeJk3/PKm0q+Svo6PiVSZ9b+pH/SanZQvgAML/vn6qw9dliW\n1IrGAc8Dy0hNTztFxLDsNTQiNivZtq3mofb2V+4Z4Dsl+x4WqQN8NkDWRn4CKdFe0EH8bcVwPbCr\npF2Aw0i18/Y8BOxQtuxKUlPOkcCfI2JRtvz5rDxkMYrUJLOElKzHZs055f4D+BuwS/a3cBzr/4+O\nLZtu6zMjIloj4nMRMZrUdHahpInl20naAfgF8A8R8VzJqmdI3yJKP/eBEfGHto5XZhfgLxExL4tl\nIXAT6ZsIpOaZKyM1I62JiFmkZr4dS/axI/CnLhzLusjJPn+DSMnyFUnDgW9U+4AR8TTwR2CmpL6S\n9iE1Y3Q2rO/fs+0/QEqO/5PVWi8CzlUanoik0ZIO6kIo6+0vW156srsI+IKkKUoGSjpM0iClTuDL\nSW3LnwZGS/piO8dqBd6V7LJvNteQThR3R8SSDmK9mXQiLnUVqa3+C7z7RHE1cJjS8MO+pBP6m6T+\nhXtJJ9szs291A7I2bUh/C68Bq5Q66f+57HgCvpx9vsOBr/Pu9v51G0r/IGmbbHYl6Xe7pmybzUgn\nvK9HxJ1lu/gx8C/KhkRKGiLpH9o6VhvuByZJOiD7nW1L+vsqJu97gWMkbSWpl9K1IX2AJ7JjDQD2\nBOZ18XjWBU72Pa88oZ4LbEKqId9JagJpL+m2Nc66u9t+nNR+vJzUmTeb1C7dnqWkr9XPk5oXPp/V\n2CC19z4B/CFrfphH+rbSUYwd7W9t7BFxH6lz9gfACuBx4JPZdv9JahL5SdZM9Ang21lyKT/uxcBO\nWbPEtSXLZ5Fqop1dn3ApMC1LRGSxLSX9zvYhfX7F5QuzWC4AXiKdyI6IiNUR8TdSk88kUu35WeCY\n7K3/Tkpyr5CGH/6yrAxBOqncSmrnfpzUtt2WvyP9Pv5KSugnx7qx9cV97kn6PZ1TMiJnVVaGOcBZ\nwFXZ7/RhSkbHKF3AN6OtA2ffcD5D6hR+BWghnVSLAwTOIiX+B0l/A6cAH46IVdn6I4D52edrFaJU\nMetgg3TF4ImkWsVFEXFeVquYTfqquhg4JiJWVjlWqyJJs0lNEf/exroCqfN2TIWOVdH9bWQsY0lt\n7yMi4tVOtv0OacTNeT0SXJOS9AdS5/Cf846lkXRYs8/aMk8kdabsBhye1ZpmAPMiYnvgN9m81RFJ\nf6c0rrtX1kE3HZiTd1w9SVIv4FRS+3GHiR4gIr7uRF99EfE+J/rK6+xqxsmktsw3ASTdBnyYlBiK\n7ZezSF/TnPDry9akcdWbk5oSvhARHXWIVfr5lbk+D1PSQFI7/lOkC6bMGlqHzTjZEKrrSW2SbwK/\nJnXsHRcRw7JtRBrGN6z64ZqZWXd0WLOPiAWSziJ1CL1G6lD5W9k2IclPLTczq2Gd3pQqIn4O/BzW\ndlAtAVolbR0RSyWNJF0RuB6fBMzMuiciKnqtTadDLyVtlf0cC/w9aUzyXNL9LMh+ttuxV3q57ltv\nBaNGBQ8+mP+lw5V4feMb38g9BpfN5XP5Gu9VDV0ZZ3+NpEdJCf5LkS5PPxP4kKSFwIHZfKf69YN/\n+ic455xux2tmZt3QlWacD7axbAUwtTsH/PznYdtt4YUXYGRbd0IxM7OK6/EraIcPh49/HH7wg863\nrXWFQiHvEKqmkcsGLl+9a/TyVUOnV9Bu1M6laGv/jz8O738/LF4MAwdW7fBmZnVJEtHTHbTVsN12\nsO++cOmleRzdzKz55FKzB/jd7+DEE2HBAujl27GZma3VMDV7gA98AIYMgZtuyisCM7PmkVuyl+DU\nU+F7G/psITMz22C5NqB85CPw5JNw3315RmFm1vhyTfZ9+8LJJ/siKzOzasutg7Zo5UqYOBEeegi2\n2abDTc3MmkJDddAWDR0Kn/wkXNDRo6LNzGyj5F6zB1i0CKZMSRdZDRpUtXDMzOpCQ9bsITXjFApw\nySV5R2Jm1phqomYPcOedcNxxsHAh9O5dtZDMzGpew9bsId0rZ6utYO7cvCMxM2s8NZPswRdZmZlV\nS00l+6OPhiVL4O67847EzKyx1FSy79MHTjnFF1mZmVVazXTQFq1aBRMmwP33w7hxVQrMzKyGNXQH\nbdFmm8EJJ8D55+cdiZlZ4+i0Zi/pK8BngAAeBk4ABgKzgXHAYuCYiFjZxns3uGYP8PTTsMce6SKr\nzTbb4LebmdW1Hq/ZSxoNnAS8NyLeA/QGjgVmAPMiYnvgN9l8xYwbBwcdBBdfXMm9mpk1r6404/QB\nNpXUB9gUeB6YDszK1s8Cjqp0YKeeCuedB6tXV3rPZmbNp8NkHxHPAd8DniEl+ZURMQ8YERGt2Wat\nwIhKBzZlCowZA9ddV+k9m5k1n86acYaRavHjgVHAIEmfKN0ma5SvypCe4kVWVRwwZGbWFPp0sn4q\n8FRELAeQdC2wD7BU0tYRsVTSSODF9nYwc+bMtdOFQoFCodDl4KZPh9NOg7vuSrdTMDNrRC0tLbS0\ntFT1GB2OxpE0Bfg5sBfwJvAL4B7SKJzlEXGWpBnA0IhYr5O2u6NxSl1wAdx2G1xzzUbtxsysblRj\nNE5Xhl7OBD4KrAbuB04EBgNXA2OpwtDLUq++CuPHwz33pFshm5k1ulyS/UbtvALJHmDGDHjzTTj3\n3AoEZWZW45o22S9ZArvump5oNXRoBQIzM6thTXG7hLZssw1MmwYXXZR3JGZm9akuavaQbox25JGp\ndt+3b0V2aWZWk5q2Zg+w554waZJH5ZiZdUfdJHvwRVZmZt1VV8n+sMPS/e5vvz3vSMzM6ktdJfte\nveArX4Hvfz/vSMzM6kvddNAWvf56ugXynXfCdttVdNdmZjWhqTtoizbdFD7/+XT7YzMz65q6q9kD\nvPAC7LQTPPkkDB9e8d2bmeXKNfvMyJFpzP1PfpJ3JGZm9aEua/YAf/pTuqr2qaegX7+qHMLMLBeu\n2ZfYbbfUlDN7dt6RmJnVvrpN9uCLrMzMuqquk/3BB8Pbb8P8+XlHYmZW2+o62fsiKzOzrqnbDtqi\nN95IT7K67TaYPLmqhzIz6xHuoG3DJpvAF7/op1iZmXWk7mv2AK2tqVa/cCFsuWXVD2dmVlW51Owl\n7SDpgZLXK5JOljRc0jxJCyXdKim3BwaOGAEf/jD8+Md5RWBmVts2qGYvqRfwHDAFOAlYFhFnSzod\nGBYRM8q275GaPcCjj8LUqekiqwEDeuSQZmZVUQtt9lOBJyLiWWA6MCtbPgs4qpKBbaidd4bdd4cr\nr8wzCjOz2rShyf5YoJhOR0REazbdCoyoWFTddOqpaRimL7IyM3u3Pl3dUFI/4Ajg9PJ1ERGS2kyx\nM2fOXDtdKBQoFAobHGRXTZ2afs6bBwcdVLXDmJlVVEtLCy0tLVU9Rpfb7CUdCXwxIg7J5hcAhYhY\nKmkkMD8iJpe9p8fa7IsuuSTdL+eWW3r0sGZmFZN3m/0/sq4JB2AucHw2fTwwp1JBbYyPfSzdEfOR\nR/KOxMysdnSpZi9pIPA0MCEi/potGw5cDYwFFgPHRMTKsvf1eM0e4NvfhsWL4Wc/6/FDm5lttGrU\n7Bvioqpyy5al59MuWJDG4JuZ1ZO8m3HqxhZbwEc/ChdemHckZma1oSFr9pBq9fvvn5pzNtkklxDM\nzLrFNfsNMHkyTJkCl1+edyRmZvlr2Jo9pIeafPnLaWROr4Y9rZlZo3HNfgMVCtC/v8fcm5k1dLKX\n1t1CwcysmTV0Mw6kZ9ROmAA33wy77ZZrKGZmXeJmnG7o1w9OOgnOOSfvSMzM8tPwNXuAFStg0qTU\nUTtqVN7RmJl1zDX7bho+PN0z54c/zDsSM7N8NEXNHuCJJ2CffdJFVgMH5h2NmVn7XLPfCJMmwX77\nwaWX5h2JmVnPa5qaPcDtt8NnPpNupeCLrMysVrlmv5H22w+GDIEbb8w7EjOzntVUyd4XWZlZs2qq\nZA/wkY/AokVw3315R2Jm1nOaLtn37Qsnn+yLrMysuTRVB23RypUwcSI89BBss03e0ZiZvZs7aCtk\n6FD45CfhggvyjsTMrGd09YHjQ4GfATsDAZwAPA7MBsZRYw8c74qnnoK99koXWQ0alHc0Zmbr5Fmz\nPw+4OSJ2BHYFFgAzgHkRsT3wm2y+bkyYAAccAJdcknckZmbV12nNXtIQ4IGImFi2fAGwf0S0Stoa\naImIyWXb1GzNHuCuu+ATn4CFC6F377yjMTNL8qrZTwBeknSJpPslXSRpIDAiIlqzbVqBEZUMrCfs\nsw9stRVcf33ekZiZVVefLm6zJ/BPEXGvpHMpa7KJiJDUZhV+5syZa6cLhQKFQqHbwVZD8SKrv//7\nvCMxs2bV0tJCS0tLVY/RlWacrYG7ImJCNr8fcAYwETggIpZKGgnMr7dmHIDVq2G77eCqq2DvvfOO\nxswsp2aciFgKPCtp+2zRVOBR4Abg+GzZ8cCcSgbWU/r0gVNO8UVWZtbYujr0cjfS0Mt+wJOkoZe9\ngauBsdTh0MtSq1al0Tn33w/jxuUdjZk1u2rU7JvyCtq2nHYaRMD3vpd3JGbW7Jzsq+iZZ2CPPdLF\nVpttlnc0ZtbMfLuEKho7Fg46CC6+OO9IzMwqzzX7EvfcA8cck55X26crg1LNzKrANfsqmzIFxoyB\na6/NOxIzs8pysi9z6qmpk7aOvpCYmXXKyb7M9OmwfHm6b46ZWaNwsi/Tuzf83//r59SaWWNxB20b\nXn0Vxo9PHbYTJ3a6uZlZRbmDtocMGgQnngjnnZd3JGZmleGafTuWLIFdd4VFi9JjDM3Meopr9j1o\nm23gsMPgoovyjsTMbOO5Zt+B+++HI49Mtfu+ffOOxsyahWv2PWzPPWHSJPif/8k7EjOzjeNk3wlf\nZGVmjcDJvhOHHZaGYt5+e96RmJl1n5N9J3r1gq98xRdZmVl9cwdtF7z+errI6o470vNqzcyqyR20\nOdl0U/jc5+Dcc/OOxMyse1yz76IXXoCddoInn4Thw/OOxswaWW41e0mLJT0k6QFJ92TLhkuaJ2mh\npFslNfR1piNHwlFHwU9+knckZmYbrks1e0lPAe+NiBUly84GlkXE2ZJOB4ZFxIyy9zVMzR7goYfg\n0EPTc2r79cs7GjNrVHm32ZcfeDowK5ueBRxVkYhq2K67pqac2bPzjsTMbMN0NdkH8GtJf5T02WzZ\niIhozaZbgREVj64G+SIrM6tHXX2s9r4R8YKkLYF5khaUroyIkNRm+ps5c+ba6UKhQKFQ6GaoteHg\ng+GrX4X58+HAA/OOxswaQUtLCy0tLVU9xgaPxpH0DeBV4LNAISKWShoJzI+IyWXbNlSbfdHPfgZz\n5sCNN+YdiZk1olza7CVtKmlwNj0QOAh4GJgLHJ9tdjwwp5KB1bKPfxzuvRcWLOh8WzOzWtBpzV7S\nBOC6bLYP8N8R8Z+ShgNXA2OBxcAxEbGy7L0NWbMHmDkzjb33UEwzq7Rq1Ox9UVU3vfgi7LADLFwI\nW26ZdzRm1kjyHnppJbbaCj7yEfjxj/OOxMysc67Zb4RHH4WpU9NFVgMG5B2NmTUK1+xrzM47w+67\nw5VX5h2JmVnHnOw30qmnpnvdN/AXGDNrAE72G2nqVJBg3ry8IzEza5+T/UaS1tXuzcxqlTtoK+Ct\nt9KTrObNg112yTsaM6t37qCtUf37w5e/DOeck3ckZmZtc82+QpYtS8+nXbAARjTF/T/NrFpcs69h\nW2wBxx4LF16YdyRmZutzzb6C/vIX+OAHYfFi2GSTvKMxs3rlmn2N22EHmDIFLr8870jMzN7NNfsK\nmz8fvvSldCuFXj6Vmlk3uGZfBwqFdJ+cW27JOxIzs3Wc7CtMSo8t9EVWZlZL3IxTBW+/DRMmwM03\nw2675R2NmdUbN+PUiX794KSTXLs3s9rhmn2VrFgBkybBI4/AqFF5R2Nm9cQ1+zoyfHh6MPkPf5h3\nJGZmXazZS+oN/BFYEhFHZA8bnw2Mo52HjWfva9qaPcATT8A++6SLrAYOzDsaM6sXedbsTwH+DBQz\n9wxgXkRsD/wmm7cykybBfvvBpZfmHYmZNbtOk72kbYBpwM+A4plmOjArm54FHFWV6BrAqaemu2Gu\nWZN3JGbWzLpSsz8H+GegNF2NiIjWbLoV8H0e27HffjBkCNx4Y96RmFkz69PRSkmHAy9GxAOSCm1t\nExEhqd2G+ZkzZ66dLhQKFApt7qZhFS+y+u534Ygj0ryZWamWlhZaWlqqeowOO2gl/QdwHLAaGABs\nBlwL7AUUImKppJHA/IiY3Mb7m7qDtuidd1JH7bHHwmmn5R2NmdW6anTQdnmcvaT9gdOy0ThnA8sj\n4ixJM4ChEbFeJ62T/TrPPAN77w2/+AUcfHDe0ZhZLauFcfbFzH0m8CFJC4EDs3nrwNixMHs2fPKT\naUimmVlP8hW0PezCC9Prrrtg8OC8ozGzWpRrM063du5kv54I+NznYPlyuOYa3/PezNZXC804tpEk\n+MEPYOlS+M538o7GzJpFh0MvrTr694df/hL22ivdAnn69LwjMrNG52acHN19Nxx+OPzud7DjjnlH\nY2a1ws04DWbvveHss+Goo2DlereRMzOrHNfsa8BJJ8GTT8INN0Dv3nlHY2Z5c82+QX3/+/DGG/Cv\n/5p3JGbWqJzsa0DfvnD11XDFFemnmVmluRmnhjzwABx0EPz6135QuVkzczNOg9tjDzj/fDj66HTR\nlZlZpbhmX4O+9jW47z741a+gj6+EMGs6vl1Ck/jb32DaNNhpp/SUKzNrLm7GaRK9e8NVV6WhmH5+\nrZlVgmv2NezRR6FQgJtvTrdWMLPm4Jp9k9l5Z/jpT+HDH4bW1s63NzNrj5N9jTv6aDjhhJTw3347\n72jMrF65GacOrFmTkv6oUfCjH+UdjZlVm5txmlSvXnDZZXDbbalZx8xsQ7lmX0cWLoT99oPrroN9\n9807GjOrlh6v2UsaIOluSQ9KekTSzGz5cEnzJC2UdKukoZUMytq2/fbwi1/AMcfAkiV5R2Nm9aTT\nmr2kTSPidUl9gN8DpwAfBpZFxNmSTgeGRcSMNt7rmn0VnHkmXHtteujJgAF5R2NmlZZLm31EvJ5N\n9gP6AgFMB2Zly2cBR1UyKOvY6afDhAnwhS+kB5ibmXWm02QvqZekB4FW4NaIuAcYERHFkd+twIgq\nxmhlJPj5z+HBB9ON08zMOtPpbbYiYg2wu6QhwHWSdilbH5LarV/OnDlz7XShUKBQKHQ7WFtn4ECY\nMwfe9z54z3vgwAPzjsjMuqulpYWWlpaqHmODRuNI+lfgdeCzQCEilkoaCcyPiMltbO82+yr77W/h\nYx+Du+5KTTtmVv/yGI2zRXGkjaRNgA8BjwFzgeOzzY4H5lQyKOu6Aw+EM85IF1299lre0ZhZreqw\nZi/pPaQO2N6kE8PsiPi2pOHA1cBYYDFwTESsbOP9rtn3gIh0S4U334Qrr0xt+mZWv3w/e2vXm2/C\nBz+Y7qFz+ul5R2NmG6Mayd7PQWoQAwaksfd77w277gqHHpp3RGZWS1yzbzB33JHa7++4A7bbLu9o\nzKw7fCM069S++8K3vgVHHgmrVuUdjZnVCtfsG9QXvgBLl6amnV4+pZvVFdfsrcvOPx+WLYNvfjPv\nSMysFjjZN6h+/eCaa9JtFa67Lu9ozCxvbsZpcPfeC9OmwdixcNhh6bXXXm7aMatlHmdv3bJ6Ndx5\nJ9x0E9x4Y2reOfTQlPgPOgiGDMk7QjMr5WRvFbF4cUr8N90Ev/89vPe9KfEffjjssIOvwDXLm5O9\nVdxrr6WbqRWTf79+65p79t/fD0cxy4OTvVVVBDz8cGrquekmeOQROOCAlPinTYPRo/OO0Kw5ONlb\nj1q+HG65JSX/X/0Kxo1b19yz117Qu3feEZo1Jid7y83q1eme+cXmntZWOOSQlPwPPhiG+pHzZhXj\nZG814+mn1yX+22+HPfdc19a/447u5DXbGE72VpNef/3dnby9e69r7ikU3MlrtqGc7K3mRaSO3WIn\n70MPpefkbrcdTJy47jVhAmy2Wd7RmtUmJ3urO8uXp7b+RYve/XrqKdh005T0S08Cxdc220AfP23B\nmpSTvTWMCHjxxfVPAsUTQWtrSvhtnQgmToRhw/IugVn15JLsJY0BLgW2AgL4aUScnz2HdjYwjnae\nQ+tkb9311lupE7j8JLBoETz5ZLq3T1sngQkT0hDRfv3yLoFZ9+WV7LcGto6IByUNAu4DjgJOAJZF\nxNmSTgeGRcSMsvc62VvFRcCKFeufBIqv556Drbde/yRQnN5yS48WstpWE804kuYAP8he+0dEa3ZC\naImIyWXbOtlbj3vnHXj22bZPBIsWpW8N7Z0Ixo+HTTbJuwTW7HJP9pLGA7cBuwDPRMSwbLmAFcX5\nku2d7K3mvPJK2yeBRYvgmWdg883bPhFMnJi+Mfj20FZtuSb7rAnnNuBbETFH0sulyV3SiogYXvYe\nJ3urK3/7Gzz/fNudxosWpRPFhAltjyKaMAEGDcq7BNYIqpHsuzS4TVJf4JfAZRExJ1vcKmnriFgq\naSTwYlvvnTlz5trpQqFAoVDYqIDNqql3bxgzJr3233/99a+99u5vBU89lS4oK04PHtz+cNLRo30/\nIWtbS0sLLS0tVT1GVzpoBcwClkfEV0qWn50tO0vSDGCoO2itmUWkh7y313G8bFk6ibQ3isj3F7Ki\nvEbj7Af8DniINPQS4AzgHuBqYCweemnWqTffTA+Oaa+/oG/f9k8EY8em9dYccu+g3eCdO9mbdUlE\nutq4vYvMnn8eRo1q+0QwcWLqVPZw0sbhZG/WpN55J40Uaq/jePXqlPS3337dradHjMg7ausuJ3sz\na9PLL6fE//DD6QZ0t94KO+0E06fDkUfC5Mmu+dcTJ3sz65K33oLbboO5c9Orf/+U+KdPh3339U3m\nap2TvZltsAh48MF1iX/x4vRM4enTU5PP4MF5R2jlnOzNbKM9+2x63sD118Mdd6Sa/vTpcMQRaWio\n5c/J3syB09boAAAGP0lEQVQqatWq1L4/dy7cfHMa4lls5999d7fz58XJ3syqZvVquPPOlPivvz5d\nF1Bs5y8UUru/9QwnezPrERGwYMG6dv5HH4UPfSgl/mnT0rh+qx4nezPLxYsvpiGdc+emewHtsce6\nWv+kSXlH13ic7M0sd2+8Ab/5TUr8N9yQHhFZTPx77eXbOlSCk72Z1ZQ1a+CPf1zX3PPYYzBwIGyx\nxbtfW265/rLia9gwPyOgnJO9mdW0NWvSPf+XLWv79dJL6y9btSol/M5OCqWvwYMbe6SQk72ZNZzV\nq9MzhTs7KZS+3n678xNC+YljwIC8S9p1TvZmZqRhocuXd35SKD159O3btZNC8bX55vndVsLJ3sys\nGyLg1Ve7dlIoTq9YkZqLutLvUHwNHVqZ/gcnezOzHrJmDaxc2fW+h2XL4Je/hAMP3PhjO9mbmTWB\naiR7D3gyM2sCTvZmZk2g02Qv6eeSWiU9XLJsuKR5khZKulXS0OqGaWZmG6MrNftLgEPKls0A5kXE\n9sBvsvmm09LSkncIVdPIZQOXr941evmqodNkHxG3Ay+XLZ4OzMqmZwFHVTiuutDIf3CNXDZw+epd\no5evGrrbZj8iIlqz6VbAz7E3M6thG91Bm42t9PhKM7Ma1qVx9pLGAzdExHuy+QVAISKWShoJzI+I\nyW28zycBM7NuqPQ4++7e+WEucDxwVvZzTlsbVTpYMzPrnk5r9pKuBPYHtiC1z/8bcD1wNTAWWAwc\nExErqxqpmZl1W1Vvl2BmZrWhKlfQSjpE0gJJj0s6vRrHqAZJYyTNl/SopEcknZwtb/ciMklnZOVc\nIOmgkuXvlfRwtu68PMrTFkm9JT0g6YZsvpHKNlTSNZIek/RnSXs3WPm+kv1dPizpCkn967l8G3rB\n5oaWJ/t8ZmfL/yBpXM+Vrt3yfTf7+/yTpGslDSlZV93yRURFX0Bv4AlgPNAXeBDYsdLHqcYL2BrY\nPZseBPwF2BE4G/hatvx04MxseqesfH2z8j7Bum9L9wBTsumbgUPyLl8Wy6nAfwNzs/lGKtss4NPZ\ndB9gSKOUDxgNLAL6Z/OzSf1ldVs+4APAHsDDJcsqVh7gS8CF2fRHgatqoHwfAnpl02f2ZPmqUcB9\ngFtK5mcAM/L4Y6pAWeYAU4EFpGsLIJ0QFmTTZwCnl2x/C/A+YCTwWMnyY4Ef10B5tgF+DRxAGl1F\nA5VtCLCojeWNUr7RwDPAMNKJ7IYscdR1+bLEVpoMK1aebJu9s+k+wEt5l69s3dHA5T1Vvmo044wG\nni2ZX5ItqyvZcNM9gLtp/yKyUaTyFRXLWr78OWrjMzgH+GdgTcmyRinbBOAlSZdIul/SRZIG0iDl\ni4jngO+REv7zwMqImEeDlK9EJcuzNhdFxGrgFUnDqxR3d3yaVFOHHihfNZJ93ff4ShoE/BI4JSL+\nWrou0mm07soo6XDgxYh4AGhzSGy9li3TB9iT9LV2T+A1yu7ZVM/lkzSMdJuS8aQEMEjSJ0q3qefy\ntaXRylNK0teBtyPiip46ZjWS/XPAmJL5Mbz7zFTTJPUlJfrLIqJ4/UCrpK2z9SOBF7Pl5WXdhlTW\n57Lp0uXPVTPuLng/MF3SU8CVwIGSLqMxygYptiURcW82fw0p+S9tkPJNBZ6KiOVZLe5aUpNpo5Sv\nqBJ/j0tK3jM221cfYEhErKhe6F0j6VPANODjJYurXr5qJPs/AttJGi+pH6njYG4VjlNxkgRcDPw5\nIs4tWVW8iAzefRHZXOBYSf0kTQC2A+6JiKXAqmw0iIDjaOfCs54SEf8SEWMiYgKp3e+3EXEcDVA2\ngCyuZyVtny2aCjxKatuu+/IBTwPvk7RJFtdU4M80TvmKKvH3eH0b+/oI6Q69uZJ0CKkp9ciIeLNk\nVfXLV6VOiUNJI1meAM7o6U6RjYh7P1J79oPAA9nrEGA4qWNzIXArMLTkPf+SlXMBcHDJ8vcCD2fr\nzs+7bGXl3J91o3EapmzAbsC9wJ9INd8hDVa+mcBjWWyzSCM36rZ8pG+YzwNvk9qeT6hkeYD+pIs/\nHwf+AIzPuXyfzmJ5uiS/XNhT5fNFVWZmTcCPJTQzawJO9mZmTcDJ3sysCTjZm5k1ASd7M7Mm4GRv\nZtYEnOzNzJqAk72ZWRP4/3m49ItqjzMMAAAAAElFTkSuQmCC\n", |
|
|
"text/plain": [ |
|
|
"<matplotlib.figure.Figure at 0x182e0198>" |
|
|
] |
|
|
}, |
|
|
"metadata": {}, |
|
|
"output_type": "display_data" |
|
|
}, |
|
|
{ |
|
|
"name": "stdout", |
|
|
"output_type": "stream", |
|
|
"text": [ |
|
|
"--- Generating text: \n", |
|
|
"i...\n", |
|
|
"ettarray \n", |
|
|
" ----------------------------------------\n", |
|
|
"iter 12360 training perplexity: 11.63 ( 33.59 iters/sec) ETA: Mon Aug 3 17:35:13 2015\n", |
|
|
"iter 13494 training perplexity: 11.05 ( 34.00 iters/sec) ETA: Mon Aug 3 17:34:52 2015\n", |
|
|
"Validating.. epoch 25 validation perplexity: 11.08\n", |
|
|
"iter 15720 training perplexity: 10.17 ( 33.33 iters/sec) ETA: Mon Aug 3 17:35:27 2015\n", |
|
|
"iter 16864 training perplexity: 9.40 ( 33.68 iters/sec) ETA: Mon Aug 3 17:35:08 2015\n", |
|
|
"iter 19098 training perplexity: 8.85 ( 34.12 iters/sec) ETA: Mon Aug 3 17:34:46 2015\n", |
|
|
"iter 20234 training perplexity: 8.34 ( 34.37 iters/sec) ETA: Mon Aug 3 17:34:34 2015\n", |
|
|
"iter 21360 training perplexity: 8.02 ( 34.52 iters/sec) ETA: Mon Aug 3 17:34:26 2015\n", |
|
|
"Validating.. epoch 37 validation perplexity: 7.85\n", |
|
|
"iter 22512 training perplexity: 7.65 ( 33.96 iters/sec) ETA: Mon Aug 3 17:34:54 2015\n" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"data": { |
|
|
"image/png": "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\neBk4DPgbYFVEzJR0ITA6ImaUjd/jmj3A2rXp2bSrV8N22/X4Y2ZmDaUeavYnAM9FxEvAGcCsbPgs\n4Ky+BjNyJEybBg8/3NcpmZlZqd4m+z8Drsu6x0dEW9bdBoyvREAu5ZiZVd6gno4oaQhwOnBh+XsR\nEZI6rNe0trZu6W5paaGlpaXL+UyfDldeCTNmdDmamVnDKBQKFAqFqs6jxzV7SWcCfxURJ2X9C4CW\niFguaQIwJyL2KvtMr2r2ACtWpFLO6tUwcGCvPmpm1hDyrtl/lPYSDsAtwHlZ93nAzZUIaOedYcIE\nePzxSkzNzMygh8le0jDSwdmflwy+BHi/pIXA8Vl/Rbhub2ZWWT1K9hHxRkSMi4h1JcPWRMQJETEt\nIk6MiFcrFZRvimZmVll1c2+cUi++CIcemu6To4pWrczM6l/eNfuamTwZhg6FZ57JOxIzs8ZQl8ke\nXMoxM6ukuk32PkhrZlY5TvZmZk2gbpP9tGmwYUN6CLmZmfVN3SZ7yXV7M7NKqdtkDy7lmJlVSl0n\ne7fszcwqoy4vqiratAnGjoWFC9M9c8zMmkHTXFRVNHAgHH20W/dmZn1V18keXMoxM6uEuk/2Pkhr\nZtZ3dV2zB3jrLRgzBl5+OT2j1sys0TVdzR5gyBA47DC49968IzEz67/qPtlDqtu7lGNmtu16+qSq\nUZJukvS0pKckHS5pjKTZkhZKul3SqGoF6bq9mVnf9KhmL2kWcEdEXC1pEDAM+CqwKiJmSroQGB0R\nM8o+1+eaPcAbb8D48bByJeywQ58nZ2ZW13Kp2UsaCRwbEVcDRMTGiFgLnAHMykabBZxVycBKDRsG\n++0HDzxQrTmYmTW2npRxdgdWSvqxpEck/Sh7APn4iGjLxmkDxlctSlzKMTPri0E9HOdg4PMR8aCk\ny4CtyjUREZI6rNe0trZu6W5paaGlpWWbAp0+HS6/fJs+amZW1wqFAoVCoarz6LZmL2kX4L6I2D3r\nPwa4CNgDeF9ELJc0AZgTEXuVfbYiNXuAV15Jz6ZdswYGD67IJM3M6lIuNfuIWA68JGlaNugE4Eng\nVuC8bNh5wM2VDKzc6NGwxx7wyCPVnIuZWWPqSRkH4G+A/5Q0BFgEfBwYCNwo6ZPAYuDsqkRYYvr0\ndJ+cww+v9pzMzBpL3d8uodSNN8JPfwq33FKxSZqZ1Z1qlHH6VbJftgz23RdWrYIB/eLaXzOz3mvK\n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\n", |
|
|
"text/plain": [ |
|
|
"<matplotlib.figure.Figure at 0x184837f0>" |
|
|
] |
|
|
}, |
|
|
"metadata": {}, |
|
|
"output_type": "display_data" |
|
|
}, |
|
|
{ |
|
|
"name": "stdout", |
|
|
"output_type": "stream", |
|
|
"text": [ |
|
|
"--- Generating text: \n", |
|
|
"i...\n", |
|
|
"nentet or \n", |
|
|
" ----------------------------------------\n", |
|
|
"iter 25800 training perplexity: 7.02 ( 34.32 iters/sec) ETA: Mon Aug 3 17:34:36 2015\n", |
|
|
"iter 26927 training perplexity: 6.48 ( 34.49 iters/sec) ETA: Mon Aug 3 17:34:28 2015\n", |
|
|
"iter 28070 training perplexity: 6.25 ( 34.66 iters/sec) ETA: Mon Aug 3 17:34:20 2015\n", |
|
|
"Validating.. epoch 50 validation perplexity: 5.84\n", |
|
|
"iter 29056 training perplexity: 6.06 ( 34.03 iters/sec) ETA: Mon Aug 3 17:34:51 2015\n" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"data": { |
|
|
"image/png": "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\nAAAAAElFTkSuQmCC\n", |
|
|
"text/plain": [ |
|
|
"<matplotlib.figure.Figure at 0x17034358>" |
|
|
] |
|
|
}, |
|
|
"metadata": {}, |
|
|
"output_type": "display_data" |
|
|
}, |
|
|
{ |
|
|
"name": "stdout", |
|
|
"output_type": "stream", |
|
|
"text": [ |
|
|
"--- Generating text: \n", |
|
|
"i...\n", |
|
|
"nter sonction tor is the tore the setine the the array. on array.<br><br> \n", |
|
|
" ----------------------------------------\n", |
|
|
"iter 31320 training perplexity: 5.76 ( 34.28 iters/sec) ETA: Mon Aug 3 17:34:38 2015\n", |
|
|
"iter 32411 training perplexity: 5.52 ( 34.38 iters/sec) ETA: Mon Aug 3 17:34:33 2015\n", |
|
|
"iter 33505 training perplexity: 5.38 ( 34.48 iters/sec) ETA: Mon Aug 3 17:34:28 2015\n", |
|
|
"iter 34597 training perplexity: 5.25 ( 34.57 iters/sec) ETA: Mon Aug 3 17:34:24 2015\n", |
|
|
"iter 35755 training perplexity: 5.12 ( 34.72 iters/sec) ETA: Mon Aug 3 17:34:17 2015\n", |
|
|
"Validating.. epoch 62 validation perplexity: 4.81\n" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"data": { |
|
|
"image/png": "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\n", |
|
|
"text/plain": [ |
|
|
"<matplotlib.figure.Figure at 0x170210f0>" |
|
|
] |
|
|
}, |
|
|
"metadata": {}, |
|
|
"output_type": "display_data" |
|
|
}, |
|
|
{ |
|
|
"name": "stdout", |
|
|
"output_type": "stream", |
|
|
"text": [ |
|
|
"--- Generating text: \n", |
|
|
"i...\n", |
|
|
"nters):<br> \n", |
|
|
" ----------------------------------------\n", |
|
|
"iter 37907 training perplexity: 4.93 ( 34.33 iters/sec) ETA: Mon Aug 3 17:34:36 2015\n", |
|
|
"iter 40150 training perplexity: 4.68 ( 34.52 iters/sec) ETA: Mon Aug 3 17:34:27 2015\n", |
|
|
"iter 42360 training perplexity: 4.48 ( 34.65 iters/sec) ETA: Mon Aug 3 17:34:20 2015\n", |
|
|
"iter 43465 training perplexity: 4.33 ( 34.73 iters/sec) ETA: Mon Aug 3 17:34:16 2015\n", |
|
|
"Validating.. epoch 75 validation perplexity: 4.18\n", |
|
|
"iter 44592 training perplexity: 4.24 ( 34.42 iters/sec) ETA: Mon Aug 3 17:34:31 2015\n", |
|
|
"iter 46815 training perplexity: 4.12 ( 34.56 iters/sec) ETA: Mon Aug 3 17:34:24 2015\n", |
|
|
"iter 47880 training perplexity: 4.02 ( 34.61 iters/sec) ETA: Mon Aug 3 17:34:22 2015\n" |
|
|
] |
|
|
} |
|
|
], |
|
|
"source": [ |
|
|
"# Learning loop \n", |
|
|
"print('batch size is {}'.format(jump))\n", |
|
|
"total_iterations = jump * n_epoch\n", |
|
|
"print('going to train {} epochs = {} iterations'.format(n_epoch,total_iterations))\n", |
|
|
"last_iter = 0 # to count throughput, for restarting iteration loop after interrupting training\n", |
|
|
"sys.stdout.flush()\n", |
|
|
"for i in six.moves.range(start_iter,jump * n_epoch):\n", |
|
|
" x_batch = np.array([train_data[(jump * j + i) % whole_len]\n", |
|
|
" for j in six.moves.range(batchsize)])\n", |
|
|
" y_batch = np.array([train_data[(jump * j + i + 1) % whole_len]\n", |
|
|
" for j in six.moves.range(batchsize)])\n", |
|
|
" state, loss_i = forward_one_step(x_batch, y_batch, state)\n", |
|
|
" accum_loss += loss_i\n", |
|
|
" cur_log_perp += loss_i.data.reshape(())\n", |
|
|
" \n", |
|
|
" \n", |
|
|
" if (i + 1) % bprop_len == 0: # Run truncated BPTT\n", |
|
|
" optimizer.zero_grads()\n", |
|
|
" accum_loss.backward()\n", |
|
|
" accum_loss.unchain_backward() # truncate\n", |
|
|
" accum_loss = chainer.Variable(mod.zeros((), dtype=np.float32))\n", |
|
|
"\n", |
|
|
" optimizer.clip_grads(grad_clip)\n", |
|
|
" optimizer.update()\n", |
|
|
"\n", |
|
|
" if int(time.time() - cur_at + 1) % perp_every == 0:\n", |
|
|
" now = time.time()\n", |
|
|
" throuput = i / (now - start_at)\n", |
|
|
" perp = math.exp(cuda.to_cpu(cur_log_perp) / (i-last_iter))\n", |
|
|
" training_perps[i] = perp\n", |
|
|
" print('iter {:6d} training perplexity: {:7.2f} ({:7.2f} iters/sec)'.format(\n", |
|
|
" i + 1, perp, throuput),end=\" \")\n", |
|
|
" #print('ETA final: {:.1f} minutes'.format((total_iterations-i)/throuput/60.0))\n", |
|
|
" if i> jump/4: \n", |
|
|
" print(\"ETA:\",time.ctime(time.time()+(total_iterations-i)/throuput))\n", |
|
|
" else: \n", |
|
|
" print(\"\")\n", |
|
|
" cur_at = now\n", |
|
|
" last_iter = i\n", |
|
|
" cur_log_perp.fill(0)\n", |
|
|
"\n", |
|
|
" if int(time.time() - start_at + 1) % generate_every == 0: \n", |
|
|
" plot_progress(training_perps,\n", |
|
|
" title=\"Training perplexity (vocab size: {})\".format(len(vocab)),\n", |
|
|
" start_at=-20) \n", |
|
|
" print(\"--- Generating text: \")\n", |
|
|
" generate(to_word(1), 150, vocab, start_state=None,separator=\"\")\n", |
|
|
" \n", |
|
|
" if (i+1) % jump == 0:\n", |
|
|
" epoch += 1\n", |
|
|
" \n", |
|
|
" if (i + 1) % int(validate_every) == 0:\n", |
|
|
" print('Validating..',end=\" \")\n", |
|
|
" sys.stdout.flush()\n", |
|
|
" now = time.time()\n", |
|
|
" perp = evaluate(valid_data)\n", |
|
|
" valid_perps[i] = perp\n", |
|
|
" #print('ETA for end of training: in {:.1f} minutes'.format((total_iterations-i)/throuput/60.0))\n", |
|
|
" print('epoch {} validation perplexity: {:.2f}'.format(epoch, perp))\n", |
|
|
" cur_at += time.time() - now # skip time of evaluation\n", |
|
|
"\n", |
|
|
" if \"SGD\" in str(type(optimizer)) and epoch >= 8:\n", |
|
|
" optimizer.lr /= 1.1\n", |
|
|
" print('learning rate =', optimizer.lr)\n", |
|
|
"\n", |
|
|
" sys.stdout.flush()\n", |
|
|
" \n", |
|
|
"print('\\nTraining complete! Evaluating test data..',end=\"\")\n", |
|
|
"sys.stdout.flush()\n", |
|
|
"test_perp = evaluate(test_data)\n", |
|
|
"print('done!\\n\\nTest perplexity:', test_perp)\n", |
|
|
" " |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "markdown", |
|
|
"metadata": {}, |
|
|
"source": [ |
|
|
"## Now, wait for the training to complete\n", |
|
|
"\n", |
|
|
"* After a couple iterations, you will get an estimated ETA for completion\n", |
|
|
"* You can interrupt it with Kernel -> interrupt and continue after some tests! \n", |
|
|
"* (uncomment and run the cell before the training loop to reinstate the iteration counter if you do)" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "markdown", |
|
|
"metadata": {}, |
|
|
"source": [ |
|
|
"### Once it's done, generate a complete report about the run:" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": null, |
|
|
"metadata": { |
|
|
"collapsed": false, |
|
|
"scrolled": false |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"items = \"n_epoch n_units batchsize bprop_len grad_clip train_file optimizer train_chars tokenize_caps\"\n", |
|
|
"for x in items.split(\" \"):\n", |
|
|
" print(x,\":\",locals()[x])\n", |
|
|
"\n", |
|
|
"plot_progress(training_perps,title=\"Training perplexity\",start_at=3)\n", |
|
|
"plot_progress(valid_perps,title=\"Validation perplexity\",start_at=3)" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "markdown", |
|
|
"metadata": { |
|
|
"collapsed": false |
|
|
}, |
|
|
"source": [ |
|
|
"#### Generate some text like this:" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": null, |
|
|
"metadata": { |
|
|
"collapsed": false |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"prompt = \"from \"\n", |
|
|
"prod_state = None\n", |
|
|
"for randomness in [0.1,0.3,0.5,1.0,1.4]:\n", |
|
|
" prod_state = generate(prompt,600,vocab,randomness=randomness,start_state=prod_state,separator=\"\")" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "markdown", |
|
|
"metadata": {}, |
|
|
"source": [ |
|
|
"## Development stuff below .." |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": null, |
|
|
"metadata": { |
|
|
"collapsed": true |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"########## DEVELOPMENT SECTION BELOW ##########\n", |
|
|
"########## DEVELOPMENT SECTION BELOW ##########\n", |
|
|
"########## DEVELOPMENT SECTION BELOW ##########" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": null, |
|
|
"metadata": { |
|
|
"collapsed": false |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"# alternative generation method, fails utterly so far\n", |
|
|
"\n", |
|
|
"def generate_choice(primer_text,amount,dictionary,randomness=0.5,start_state=None,stop_count=3, separator=\" \"):\n", |
|
|
" state = start_state or make_initial_state(1,False)\n", |
|
|
" \n", |
|
|
" primer_text.replace(\"\\n\",\"<eos>\")\n", |
|
|
" print(primer_text + \"...\")\n", |
|
|
" \n", |
|
|
" if separator: # don't split if it's a character based model!\n", |
|
|
" primer_text = primer_text.split()\n", |
|
|
" primer_x = [to_index(word) for word in primer_text]\n", |
|
|
"\n", |
|
|
" # priming until before the last item, that goes into generation loop since we want the result\n", |
|
|
" for item in primer_x[:-1]:\n", |
|
|
" state, y = produce_one_step(np.array([item],dtype=\"int32\"),state)\n", |
|
|
" yarr = [float(x) for x in cuda.to_cpu(y.data.ravel())]\n", |
|
|
" #print(to_word(item),\"->\",to_word(np.argmax(yarr)),end=\" # \")\n", |
|
|
" sys.stdout.flush()\n", |
|
|
" \n", |
|
|
" #print(\"\\nLooping:\\n\")\n", |
|
|
" \n", |
|
|
" current = primer_x[-1]\n", |
|
|
" end_count=0\n", |
|
|
"\n", |
|
|
" letters = list(vocab.values())\n", |
|
|
"\n", |
|
|
" for i in range(amount):\n", |
|
|
" # feed x to model\n", |
|
|
" state, y = produce_one_step(np.array([current],dtype=\"int32\"),state)\n", |
|
|
" # append y to x - wait, we DON'T NEED TO APPEND; THIS IS A REAL RNN\n", |
|
|
" # print y\n", |
|
|
" yarr = cuda.to_cpu(y.data.ravel())\n", |
|
|
" probs = np.array(yarr,dtype='float64')\n", |
|
|
" probs -= min(probs)\n", |
|
|
" probs /= sum(probs)\n", |
|
|
" result_word = \"<unk>\"\n", |
|
|
" while result_word == \"<unk>\":\n", |
|
|
" yidx = np.random.choice(letters,p=probs)\n", |
|
|
" result_word = to_word(yidx)\n", |
|
|
" print(result_word.replace(\"\\r\",\"<r>\"),end=separator)\n", |
|
|
" sys.stdout.flush()\n", |
|
|
" current = to_index(result_word)\n", |
|
|
"\n", |
|
|
" if i >= 5: # look for production stoppers after 5 words\n", |
|
|
" if \".\" in result_word or \"!\" in result_word or \"?\" in result_word:\n", |
|
|
" end_count += 1\n", |
|
|
" if \"<eos>\" in result_word:\n", |
|
|
" end_count += 3\n", |
|
|
" if end_count >= stop_count:\n", |
|
|
" break\n", |
|
|
" \n", |
|
|
" #y_cpu = cuda.to_cpu(y)\n", |
|
|
" #print(\"y.data-\",y.data[0][-1],end=\"#\")\n", |
|
|
" #current=int(y_cpu.data[0][-1])\n", |
|
|
" print(\"\\n\",\"-\"*40)\n", |
|
|
" \n", |
|
|
" return state" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": null, |
|
|
"metadata": { |
|
|
"collapsed": false |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"# alternative generation text\n", |
|
|
"#prompt = to_word(0)\n", |
|
|
"#prod_state = None\n", |
|
|
"#for randomness in [0.1,0.3,0.5,1.0,1.4]:\n", |
|
|
"# prod_state = generate_choice(prompt,600,vocab,randomness=randomness,start_state=prod_state,separator=\"\")" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": null, |
|
|
"metadata": { |
|
|
"collapsed": false |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"# how to save / load trained networks?\n", |
|
|
"###from pickle import dumps, loads\n", |
|
|
"#import json\n", |
|
|
"#members = dict(state.items())\n", |
|
|
"#json.dumps(members)??\n", |
|
|
"str(to_word(1))" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": null, |
|
|
"metadata": { |
|
|
"collapsed": false |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"generate(str(to_word(0)), 150, vocab, start_state=None,separator=\"\")" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": null, |
|
|
"metadata": { |
|
|
"collapsed": false |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": null, |
|
|
"metadata": { |
|
|
"collapsed": false |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"from collections import Counter\n", |
|
|
"Counter(open(\"chainer.txt\").read())" |
|
|
] |
|
|
}, |
|
|
{ |
|
|
"cell_type": "code", |
|
|
"execution_count": null, |
|
|
"metadata": { |
|
|
"collapsed": true |
|
|
}, |
|
|
"outputs": [], |
|
|
"source": [ |
|
|
"state,result = produce_one_step(np.array([3]),make_initial_state(1,False))\n", |
|
|
"y=cuda.to_cpu(result.data.ravel())\n", |
|
|
"y = np.array(y,dtype='float64')\n", |
|
|
"y -= y.min()\n", |
|
|
"y /= sum(y) \n" |
|
|
] |
|
|
} |
|
|
], |
|
|
"metadata": { |
|
|
"kernelspec": { |
|
|
"display_name": "Python 3", |
|
|
"language": "python", |
|
|
"name": "python3" |
|
|
}, |
|
|
"language_info": { |
|
|
"codemirror_mode": { |
|
|
"name": "ipython", |
|
|
"version": 3 |
|
|
}, |
|
|
"file_extension": ".py", |
|
|
"mimetype": "text/x-python", |
|
|
"name": "python", |
|
|
"nbconvert_exporter": "python", |
|
|
"pygments_lexer": "ipython3", |
|
|
"version": "3.4.3" |
|
|
} |
|
|
}, |
|
|
"nbformat": 4, |
|
|
"nbformat_minor": 0 |
|
|
} |