-
-
Save FrancescoSaverioZuppichini/6d711a151727a5956fad007913bd0a22 to your computer and use it in GitHub Desktop.
Recreating char-rnn from the spro/practical-pytorch tutorials.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"import torch\n", | |
"import torch.nn as nn\n", | |
"from torch.autograd import Variable\n", | |
"import random\n", | |
"import time\n", | |
"import math\n", | |
"from IPython.display import clear_output\n", | |
"\n", | |
"use_cuda = torch.cuda.is_available()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"seq_length = 50\n", | |
"batch_size = 50\n", | |
"hidden_size = 128\n", | |
"epoch_count = 10\n", | |
"n_layers = 2\n", | |
"lr = 2e-3\n", | |
"input_filename = 'tiny-shakespeare.txt'" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"text = open(input_filename).read() #.lower()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"chars = set(text)\n", | |
"chars_len = len(chars)\n", | |
"char_to_index = {}\n", | |
"index_to_char = {}\n", | |
"for i, c in enumerate(chars):\n", | |
" char_to_index[c] = i\n", | |
" index_to_char[i] = c" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"[[0, 1, 2], [3, 4, 5], [6, 7, 8]]\n", | |
"[(0, 1), (1, 2), (2, 3)]\n" | |
] | |
} | |
], | |
"source": [ | |
"def time_since(since):\n", | |
" s = time.time() - since\n", | |
" m = math.floor(s / 60)\n", | |
" s -= m * 60\n", | |
" return '%dm %ds' % (m, s)\n", | |
"\n", | |
"def chunks(l, n):\n", | |
" for i in range(0, len(l) - n, n):\n", | |
" yield l[i:i + n]\n", | |
"\n", | |
"print list(chunks(range(11), 3))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"torch.Size([51, 50])\n" | |
] | |
} | |
], | |
"source": [ | |
"# convert all characters to indices\n", | |
"batches = [char_to_index[char] for char in text]\n", | |
"\n", | |
"# chunk into sequences of length seq_length + 1\n", | |
"batches = list(chunks(batches, seq_length + 1))\n", | |
"\n", | |
"# chunk sequences into batches\n", | |
"batches = list(chunks(batches, batch_size))\n", | |
"\n", | |
"# convert batches to tensors and transpose\n", | |
"batches = [torch.LongTensor(batch).transpose_(0,1) for batch in batches]\n", | |
"\n", | |
"# each batch is (sequence_length + 1) x batch_size\n", | |
"print batches[0].size()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"class RNN(nn.Module):\n", | |
" def __init__(self, input_size, hidden_size, output_size, n_layers, batch_size):\n", | |
" super(RNN, self).__init__()\n", | |
" self.input_size = input_size\n", | |
" self.hidden_size = hidden_size\n", | |
" self.output_size = output_size\n", | |
" self.n_layers = n_layers\n", | |
" self.batch_size = batch_size\n", | |
" \n", | |
" self.encoder = nn.Embedding(input_size, hidden_size)\n", | |
" self.cells = nn.GRU(hidden_size, hidden_size, n_layers)\n", | |
" self.decoder = nn.Linear(hidden_size, output_size)\n", | |
" \n", | |
" def forward(self, input, hidden):\n", | |
" input = self.encoder(input)\n", | |
" output, hidden = self.cells(input, hidden)\n", | |
" output = self.decoder(output.view(output.size(0) * output.size(1), output.size(2)))\n", | |
" return output, hidden\n", | |
" \n", | |
" def create_hidden(self):\n", | |
" # should this be small random instead of zeros\n", | |
" # should this also be stored in the class rather than being passed around?\n", | |
" return torch.zeros(self.n_layers, self.batch_size, self.hidden_size)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": { | |
"collapsed": false, | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"\n", | |
"Duration: 0m 27s\n", | |
"Epoch: 1/10\n", | |
"Batch: 315/437, 11.33/s\n", | |
"Loss: 1.84\n", | |
"\n" | |
] | |
} | |
], | |
"source": [ | |
"print_every = 5\n", | |
"\n", | |
"model = RNN(chars_len, hidden_size, chars_len, n_layers, batch_size)\n", | |
"optimizer = torch.optim.Adam(model.parameters(), lr=lr)\n", | |
"loss_function = nn.CrossEntropyLoss()\n", | |
"hidden = Variable(model.create_hidden())\n", | |
"\n", | |
"if use_cuda:\n", | |
" model = model.cuda()\n", | |
" hidden = hidden.cuda()\n", | |
"\n", | |
"start = time.time()\n", | |
"all_losses = []\n", | |
"\n", | |
"format_string = \\\n", | |
"\"\"\"\n", | |
"Duration: {duration}\n", | |
"Epoch: {epoch}/{epoch_count}\n", | |
"Batch: {batch}/{batch_count}, {batch_rate:.2f}/s\n", | |
"Loss: {loss:.2f}\n", | |
"\"\"\"\n", | |
"\n", | |
"try:\n", | |
" for epoch in range(1, epoch_count + 1):\n", | |
" random.shuffle(batches)\n", | |
" for batch, batch_tensor in enumerate(batches):\n", | |
" if use_cuda:\n", | |
" batch_tensor = batch_tensor.cuda()\n", | |
" \n", | |
" # reset the model\n", | |
" model.zero_grad()\n", | |
" \n", | |
" # everything except the last\n", | |
" input_variable = Variable(batch_tensor[:-1])\n", | |
" \n", | |
" # everything except the first, flattened\n", | |
" target_variable = Variable(batch_tensor[1:].view(-1))\n", | |
" \n", | |
" # prediction and calculate loss\n", | |
" output, _ = model(input_variable, hidden)\n", | |
" loss = loss_function(output, target_variable)\n", | |
"\n", | |
" # backprop and optimize\n", | |
" loss.backward()\n", | |
" optimizer.step()\n", | |
" \n", | |
" loss = loss.data[0]\n", | |
" all_losses.append(loss)\n", | |
"\n", | |
" if print_every > 0 and batch % print_every == 0:\n", | |
" clear_output(wait=True)\n", | |
" batch_count = len(batches)\n", | |
" batch_rate = ((batch_count * (epoch - 1)) + batch) / (time.time() - start)\n", | |
" print(format_string.format(duration=time_since(start),\n", | |
" epoch=epoch,\n", | |
" epoch_count=epoch_count,\n", | |
" batch=batch,\n", | |
" batch_count=batch_count,\n", | |
" batch_rate=batch_rate,\n", | |
" loss=loss))\n", | |
" \n", | |
"except KeyboardInterrupt:\n", | |
" pass" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x10d29ded0>" | |
] | |
}, | |
"metadata": { | |
"image/png": { | |
"height": 250, | |
"width": 373 | |
} | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"%matplotlib inline\n", | |
"import matplotlib.pyplot as plt\n", | |
"plt.plot(all_losses)\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"def index_to_tensor(index):\n", | |
" tensor = torch.zeros(1, 1).long()\n", | |
" tensor[0,0] = index\n", | |
" return Variable(tensor)\n", | |
"\n", | |
"# print(index_to_tensor(10))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"def evaluate(prime_str='A', predict_len=100, temperature=0.8):\n", | |
" model.batch_size = 1\n", | |
" hidden = Variable(model.create_hidden())\n", | |
" \n", | |
" if use_cuda:\n", | |
" hidden = hidden.cuda()\n", | |
" \n", | |
" prime_tensors = [index_to_tensor(char_to_index[char]) for char in prime_str]\n", | |
" \n", | |
" if use_cuda:\n", | |
" prime_tensors = [tensor.cuda() for tensor in prime_tensors]\n", | |
"\n", | |
" for prime_tensor in prime_tensors[:-2]:\n", | |
" _, hidden = model(prime_tensor, hidden)\n", | |
" \n", | |
" inp = prime_tensors[-1]\n", | |
" predicted = prime_str\n", | |
" for p in range(predict_len):\n", | |
" if use_cuda:\n", | |
" inp = inp.cuda()\n", | |
" \n", | |
" output, hidden = model(inp, hidden)\n", | |
" \n", | |
" # Sample from the network as a multinomial distribution\n", | |
" output_dist = output.data.view(-1).div(temperature).exp()\n", | |
" top_i = torch.multinomial(output_dist, 1)[0]\n", | |
" \n", | |
" # Add predicted character to string and use as next input\n", | |
" predicted_char = index_to_char[top_i]\n", | |
" predicted += predicted_char\n", | |
" inp = index_to_tensor(char_to_index[predicted_char])\n", | |
"\n", | |
" return predicted" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": { | |
"collapsed": false, | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"That war the death.\n", | |
"\n", | |
"CLUCIO:\n", | |
"He denicle in him to me or shall but man a meet'st such that my freat,\n", | |
"And the comest from you!\n", | |
"\n", | |
"DUKE VINCENTIO:\n", | |
"Our wy recauch putio's an other's grave.\n", | |
"\n", | |
"MERTIANA:\n", | |
"I we beg of the done.\n", | |
"\n", | |
"PARIET:\n", | |
"What stranged, or a marm: as well my hears the Harminess scillow; it in this sweecha-stand case.\n", | |
"An I have we know not but withman an I havinger thine.\n", | |
"\n", | |
"CLIFF LAURENCE:\n", | |
"Bathal thou to hand of a vifes advice to be come of a grave's most of yours,\n", | |
"But with him:\n", | |
"He treight: I wil\n" | |
] | |
} | |
], | |
"source": [ | |
"print(evaluate('Th', 500, temperature=0.8))" | |
] | |
} | |
], | |
"metadata": { | |
"anaconda-cloud": {}, | |
"kernelspec": { | |
"display_name": "Python 2", | |
"language": "python", | |
"name": "python2" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 2 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython2", | |
"version": "2.7.13" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 1 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment