1210 lines
148 KiB
Plaintext
1210 lines
148 KiB
Plaintext
|
|
{
|
||
|
|
"cells": [
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 1,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:39:19.015734Z",
|
||
|
|
"start_time": "2021-04-02T02:39:17.737431Z"
|
||
|
|
},
|
||
|
|
"tags": [
|
||
|
|
"remove_cell"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"import torch\n",
|
||
|
|
"import torch.nn as nn\n",
|
||
|
|
"import torch.nn.functional as F\n",
|
||
|
|
"import torchvision \n",
|
||
|
|
"from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence\n",
|
||
|
|
"from torchvision import transforms\n",
|
||
|
|
"\n",
|
||
|
|
"from torch.utils.data import Dataset, DataLoader\n",
|
||
|
|
"\n",
|
||
|
|
"from tqdm.autonotebook import tqdm\n",
|
||
|
|
"\n",
|
||
|
|
"import numpy as np\n",
|
||
|
|
"import seaborn as sns\n",
|
||
|
|
"import matplotlib.pyplot as plt\n",
|
||
|
|
"from matplotlib.pyplot import imshow\n",
|
||
|
|
"\n",
|
||
|
|
"import pandas as pd\n",
|
||
|
|
"\n",
|
||
|
|
"from sklearn.metrics import accuracy_score\n",
|
||
|
|
"\n",
|
||
|
|
"import time\n",
|
||
|
|
"\n",
|
||
|
|
"from idlmam import train_network, Flatten, weight_reset, View, set_seed\n",
|
||
|
|
"from idlmam import AttentionAvg, GeneralScore, DotScore, AdditiveAttentionScore, ApplyAttention, getMaskByFill"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 2,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:39:19.020786Z",
|
||
|
|
"start_time": "2021-04-02T02:39:19.017111Z"
|
||
|
|
},
|
||
|
|
"tags": [
|
||
|
|
"remove_cell"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"%matplotlib inline\n",
|
||
|
|
"from IPython.display import set_matplotlib_formats\n",
|
||
|
|
"set_matplotlib_formats('png', 'pdf')\n",
|
||
|
|
"\n",
|
||
|
|
"from IPython.display import display_pdf\n",
|
||
|
|
"from IPython.display import Latex"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 3,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:39:19.027469Z",
|
||
|
|
"start_time": "2021-04-02T02:39:19.021895Z"
|
||
|
|
},
|
||
|
|
"tags": [
|
||
|
|
"remove_cell"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"torch.backends.cudnn.deterministic=True\n",
|
||
|
|
"set_seed(42)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 4,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:39:19.068731Z",
|
||
|
|
"start_time": "2021-04-02T02:39:19.028602Z"
|
||
|
|
},
|
||
|
|
"tags": [
|
||
|
|
"remove_cell"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"device = torch.device(\"cuda\") if torch.cuda.is_available() else torch.device(\"cpu\")"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 5,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:39:19.085718Z",
|
||
|
|
"start_time": "2021-04-02T02:39:19.070201Z"
|
||
|
|
},
|
||
|
|
"tags": [
|
||
|
|
"remove_cell"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"B = 128\n",
|
||
|
|
"epochs = 10"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 6,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:39:20.252467Z",
|
||
|
|
"start_time": "2021-04-02T02:39:19.087349Z"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"from io import BytesIO\n",
|
||
|
|
"from zipfile import ZipFile\n",
|
||
|
|
"from urllib.request import urlopen\n",
|
||
|
|
"import re\n",
|
||
|
|
"\n",
|
||
|
|
"all_data = []\n",
|
||
|
|
"resp = urlopen(\"https://download.pytorch.org/tutorial/data.zip\")\n",
|
||
|
|
"zipfile = ZipFile(BytesIO(resp.read()))\n",
|
||
|
|
"for line in zipfile.open(\"data/eng-fra.txt\").readlines():\n",
|
||
|
|
" line = line.decode('utf-8').lower()#lower case only please\n",
|
||
|
|
" line = re.sub(r\"[-.!?]+\", r\" \", line)#no puntuation\n",
|
||
|
|
" source_lang, target_lang = line.split(\"\\t\")[0:2]\n",
|
||
|
|
" all_data.append( (source_lang.strip(), target_lang.strip()) ) #(english, french)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 7,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:39:20.265708Z",
|
||
|
|
"start_time": "2021-04-02T02:39:20.254416Z"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"('go', 'va')\n",
|
||
|
|
"('run', 'cours')\n",
|
||
|
|
"('run', 'courez')\n",
|
||
|
|
"('wow', 'ça alors')\n",
|
||
|
|
"('fire', 'au feu')\n",
|
||
|
|
"('help', \"à l'aide\")\n",
|
||
|
|
"('jump', 'saute')\n",
|
||
|
|
"('stop', 'ça suffit')\n",
|
||
|
|
"('stop', 'stop')\n",
|
||
|
|
"('stop', 'arrête toi')\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"for i in range(10):\n",
|
||
|
|
" print(all_data[i])"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 8,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:39:20.418728Z",
|
||
|
|
"start_time": "2021-04-02T02:39:20.267277Z"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"Using 66251 / 135842\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"short_subset = [] #the subset we will actually use\n",
|
||
|
|
"MAX_LEN = 6\n",
|
||
|
|
"for (s, t) in all_data:\n",
|
||
|
|
" if max(len(s.split(\" \")), len(t.split(\" \"))) <= MAX_LEN:\n",
|
||
|
|
" short_subset.append((s,t))\n",
|
||
|
|
"print(\"Using \", len(short_subset), \"/\", len(all_data))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 9,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:39:20.550299Z",
|
||
|
|
"start_time": "2021-04-02T02:39:20.419974Z"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"Size of Vocab: 24577\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"SOS_token = \"<SOS>\" #\"START_OF_SENTANCE_TOKEN\"\n",
|
||
|
|
"EOS_token = \"<EOS>\" #\"END_OF_SENTANCE_TOKEN\"\n",
|
||
|
|
"PAD_token = \"_PADDING_\"\n",
|
||
|
|
"\n",
|
||
|
|
"word2indx = {PAD_token:0, SOS_token:1, EOS_token:2}\n",
|
||
|
|
"for s, t in short_subset:\n",
|
||
|
|
" for sentance in (s, t):\n",
|
||
|
|
" for word in sentance.split(\" \"):\n",
|
||
|
|
" if word not in word2indx:\n",
|
||
|
|
" word2indx[word] = len(word2indx)\n",
|
||
|
|
"print(\"Size of Vocab: \", len(word2indx))\n",
|
||
|
|
"#build the inverted dict for looking at the outputs later\n",
|
||
|
|
"indx2word = {}\n",
|
||
|
|
"for word, indx in word2indx.items():\n",
|
||
|
|
" indx2word[indx] = word"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 10,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:39:20.556031Z",
|
||
|
|
"start_time": "2021-04-02T02:39:20.551494Z"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"class TranslationDataset(Dataset):\n",
|
||
|
|
" \"\"\"\n",
|
||
|
|
" Takes a dataset with tuples of strings (x, y) and\n",
|
||
|
|
" converts them to tuples of int64 tensors. \n",
|
||
|
|
" This makes it easy to encode Seq2Seq problems.\n",
|
||
|
|
" \n",
|
||
|
|
" Strings in the input and output targets will be broken up by spaces\n",
|
||
|
|
" \"\"\"\n",
|
||
|
|
"\n",
|
||
|
|
" def __init__(self, lang_pairs, word2indx):\n",
|
||
|
|
" \"\"\"\n",
|
||
|
|
" lang_pairs: a List[Tuple[String,String]] containing the source,target pairs for a Seq2Seq problem. \n",
|
||
|
|
" word2indx: a Map[String,Int] that converts each word in an input string into a unique ID. \n",
|
||
|
|
" \"\"\"\n",
|
||
|
|
" self.lang_pairs = lang_pairs\n",
|
||
|
|
" self.word2indx = word2indx\n",
|
||
|
|
"\n",
|
||
|
|
" def __len__(self):\n",
|
||
|
|
" return len(self.lang_pairs)\n",
|
||
|
|
"\n",
|
||
|
|
" def __getitem__(self, idx):\n",
|
||
|
|
" x, y = self.lang_pairs[idx]\n",
|
||
|
|
" x = SOS_token + \" \" + x + \" \" + EOS_token\n",
|
||
|
|
" y = y + \" \" + EOS_token\n",
|
||
|
|
" \n",
|
||
|
|
" #convert to lists of integers\n",
|
||
|
|
" x = [self.word2indx[w] for w in x.split(\" \")]\n",
|
||
|
|
" y = [self.word2indx[w] for w in y.split(\" \")]\n",
|
||
|
|
" \n",
|
||
|
|
" x = torch.tensor(x, dtype=torch.int64)\n",
|
||
|
|
" y = torch.tensor(y, dtype=torch.int64)\n",
|
||
|
|
" \n",
|
||
|
|
" return x, y\n",
|
||
|
|
"bigdataset = TranslationDataset(short_subset, word2indx)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 11,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:39:20.561896Z",
|
||
|
|
"start_time": "2021-04-02T02:39:20.557175Z"
|
||
|
|
},
|
||
|
|
"tags": [
|
||
|
|
"remove_cell"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"#Want a consistent dataset split\n",
|
||
|
|
"set_seed(42)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 12,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:39:20.572512Z",
|
||
|
|
"start_time": "2021-04-02T02:39:20.563126Z"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"train_size = round(len(bigdataset)*0.9)\n",
|
||
|
|
"test_size = len(bigdataset)-train_size\n",
|
||
|
|
"train_dataset, test_dataset = torch.utils.data.random_split(bigdataset, [train_size, test_size])\n",
|
||
|
|
"\n",
|
||
|
|
"def pad_batch(batch):\n",
|
||
|
|
" \"\"\"\n",
|
||
|
|
" Pad items in the batch to the length of the longest item in the batch\n",
|
||
|
|
" \"\"\"\n",
|
||
|
|
" #We actually have two different maxiumum lengths! The max length of the input sequences, and the max \n",
|
||
|
|
" #length of the output sequences. So we will determine each seperatly, and only pad the inputs/outputs\n",
|
||
|
|
" #by the exact amount we need\n",
|
||
|
|
" max_x = max([i[0].size(0) for i in batch])\n",
|
||
|
|
" max_y = max([i[1].size(0) for i in batch])\n",
|
||
|
|
" \n",
|
||
|
|
" PAD = word2indx[PAD_token]\n",
|
||
|
|
" \n",
|
||
|
|
" #We will use the F.pad function to pad each tensor to the right\n",
|
||
|
|
" X = [F.pad(i[0], (0,max_x-i[0].size(0)), value=PAD) for i in batch]\n",
|
||
|
|
" Y = [F.pad(i[1], (0,max_y-i[1].size(0)), value=PAD) for i in batch]\n",
|
||
|
|
" \n",
|
||
|
|
" X, Y = torch.stack(X), torch.stack(Y)\n",
|
||
|
|
" \n",
|
||
|
|
" return (X, Y), Y\n",
|
||
|
|
"\n",
|
||
|
|
"train_loader = DataLoader(train_dataset, batch_size=B, shuffle=True, collate_fn=pad_batch)\n",
|
||
|
|
"test_loader = DataLoader(test_dataset, batch_size=B, collate_fn=pad_batch)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 13,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:39:20.586635Z",
|
||
|
|
"start_time": "2021-04-02T02:39:20.573708Z"
|
||
|
|
},
|
||
|
|
"tags": [
|
||
|
|
"remove_cell"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"class Seq2SeqAttention(nn.Module):\n",
|
||
|
|
"\n",
|
||
|
|
" def __init__(self, num_embeddings, embd_size, hidden_size, padding_idx=None, layers=1, max_decode_length=20):\n",
|
||
|
|
" super(Seq2SeqAttention, self).__init__()\n",
|
||
|
|
" self.padding_idx = padding_idx\n",
|
||
|
|
" self.hidden_size = hidden_size\n",
|
||
|
|
" self.embd = nn.Embedding(num_embeddings, embd_size, padding_idx=padding_idx)\n",
|
||
|
|
" \n",
|
||
|
|
" #We set the hidden size to half the intended length, because we will make the \n",
|
||
|
|
" #encoder bi-directional. That means we will get 2 hidden state representations\n",
|
||
|
|
" #which we will concatinate together, giving us the desired size!\n",
|
||
|
|
" self.encode_layers = nn.GRU(input_size=embd_size, hidden_size=hidden_size//2, \n",
|
||
|
|
" num_layers=layers, bidirectional=True)\n",
|
||
|
|
" #decoder will be uni-directionall, and we need to use CRUCells so that we can \n",
|
||
|
|
" #do the decoding one step at a time\n",
|
||
|
|
" self.decode_layers = nn.ModuleList([nn.GRUCell(embd_size, hidden_size)] + \n",
|
||
|
|
" [nn.GRUCell(hidden_size, hidden_size) for i in range(layers-1)])\n",
|
||
|
|
" self.score_net = DotScore(hidden_size)\n",
|
||
|
|
" #predict_word will be a small fully connected network that we use to convert the \n",
|
||
|
|
" #result of the attention mechanism and the local context into a prediction for \n",
|
||
|
|
" #the next word\n",
|
||
|
|
" self.predict_word = nn.Sequential(\n",
|
||
|
|
" nn.Linear(2*hidden_size, hidden_size),\n",
|
||
|
|
" nn.LeakyReLU(),\n",
|
||
|
|
" nn.LayerNorm(hidden_size),\n",
|
||
|
|
" nn.Linear(hidden_size, hidden_size),\n",
|
||
|
|
" nn.LeakyReLU(),\n",
|
||
|
|
" nn.LayerNorm(hidden_size),\n",
|
||
|
|
" nn.Linear(hidden_size, num_embeddings)\n",
|
||
|
|
" )\n",
|
||
|
|
" self.max_decode_length = max_decode_length\n",
|
||
|
|
" self.apply_attn = ApplyAttention()\n",
|
||
|
|
" \n",
|
||
|
|
" def forward(self, input):\n",
|
||
|
|
" #Input should be (B, T) or ((B, T), (B, T'))\n",
|
||
|
|
" if isinstance(input, tuple):\n",
|
||
|
|
" input, target = input\n",
|
||
|
|
" else:\n",
|
||
|
|
" target = None\n",
|
||
|
|
" #What is the batch size?\n",
|
||
|
|
" B = input.size(0)\n",
|
||
|
|
" #What is the max number of input time steps?\n",
|
||
|
|
" T = input.size(1)\n",
|
||
|
|
"\n",
|
||
|
|
" x = self.embd(input) #(B, T, D)\n",
|
||
|
|
"\n",
|
||
|
|
" #grab the device that the model currently resides on\n",
|
||
|
|
" #we will need this later \n",
|
||
|
|
" device = x.device\n",
|
||
|
|
"\n",
|
||
|
|
" mask = getMaskByFill(x)\n",
|
||
|
|
"\n",
|
||
|
|
" #We will use the mask to figure out how long \n",
|
||
|
|
" #each input sequence is\n",
|
||
|
|
" seq_lengths = mask.sum(dim=1).view(-1) #shape (B), containing the # of non-zero values\n",
|
||
|
|
" #the sequence lengths will be used to create a packed input for the encoder RNN\n",
|
||
|
|
" x_packed = pack_padded_sequence(x, seq_lengths.cpu(), batch_first=True, enforce_sorted=False)\n",
|
||
|
|
" h_encoded, h_last = self.encode_layers(x_packed)\n",
|
||
|
|
" h_encoded, _ = pad_packed_sequence(h_encoded) #(B, T, 2, D//2) , b/c its bidirectional\n",
|
||
|
|
" h_encoded = h_encoded.view(B, T, -1) #(B, T, D)\n",
|
||
|
|
" #now h_encoded is the result of running the encoder RNN on the input!\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
" #getting the last hidden state is a little trickier\n",
|
||
|
|
" #first the output gets reshaped as (num_layers, directions, batch_size, hidden_size)\n",
|
||
|
|
" #and then we grab the last index in the first dimension, because we want the \n",
|
||
|
|
" #last layer's output\n",
|
||
|
|
" hidden_size = h_encoded.size(2) \n",
|
||
|
|
" h_last = h_last.view(-1, 2, B, hidden_size//2)[-1,:,:,:] #shape is now (2, B, D/2)\n",
|
||
|
|
" #now we will reorder to (B, 2, D/2), and flatten the last two dimensions down to (B, D)\n",
|
||
|
|
" h_last = h_last.permute(1, 0, 2).reshape(B, -1)\n",
|
||
|
|
" \n",
|
||
|
|
" \n",
|
||
|
|
" #End of Encoding portion. h_encoded now contains the representation of the input data!\n",
|
||
|
|
" #h_last has the final ouputs of the RNN, to use as the initial input state for the decoder\n",
|
||
|
|
" \n",
|
||
|
|
" #The first input to the decoder will be the output of the last encoder step\n",
|
||
|
|
" #decoder_input = h_last\n",
|
||
|
|
" \n",
|
||
|
|
" # new hidden states for decoders\n",
|
||
|
|
" h_prevs = [h_last for l in range(len(self.decode_layers))]\n",
|
||
|
|
"\n",
|
||
|
|
" #We will save all the attention mechanism results for visualization later!\n",
|
||
|
|
" all_attentions = []\n",
|
||
|
|
" all_predictions = []\n",
|
||
|
|
"\n",
|
||
|
|
" #Grab the last item from the input (which should be an EOS marker)\n",
|
||
|
|
" #as the first input for the decoder\n",
|
||
|
|
" #We could also hard-code the SOS marker instead\n",
|
||
|
|
" decoder_input = self.embd(input.gather(1,seq_lengths.view(-1,1)-1).flatten()) #(B, D)\n",
|
||
|
|
"\n",
|
||
|
|
" #How many decoding steps should we do?\n",
|
||
|
|
" steps = min(self.max_decode_length, T)\n",
|
||
|
|
" #If we are training, the target values tells us exactly\n",
|
||
|
|
" #how many steps to take\n",
|
||
|
|
" if target is not None: #We know the exact decode length!\n",
|
||
|
|
" steps = target.size(1)\n",
|
||
|
|
" \n",
|
||
|
|
" #Do we use teacher forcing (true) or auto-regressive (false)\n",
|
||
|
|
" teacher_forcing = np.random.choice((True,False))\n",
|
||
|
|
" for t in range(steps):\n",
|
||
|
|
" x_in = decoder_input #(B, D)\n",
|
||
|
|
"\n",
|
||
|
|
" for l in range(len(self.decode_layers)):\n",
|
||
|
|
" h_prev = h_prevs[l] \n",
|
||
|
|
" h = self.decode_layers[l](x_in, h_prev)\n",
|
||
|
|
"\n",
|
||
|
|
" h_prevs[l] = h\n",
|
||
|
|
" x_in = h\n",
|
||
|
|
" h_decoder = x_in #(B, D), we now have the hidden state for the decoder at this time step\n",
|
||
|
|
"\n",
|
||
|
|
" #This is the attention mechanism, lets look at all the previous encoded states and \n",
|
||
|
|
" #see which look relevant\n",
|
||
|
|
"\n",
|
||
|
|
" scores = self.score_net(h_encoded, h_decoder) #(B, T, 1)\n",
|
||
|
|
" context, weights = self.apply_attn(h_encoded, scores, mask=mask)\n",
|
||
|
|
"\n",
|
||
|
|
" #save the attention weights for visualization later\n",
|
||
|
|
" all_attentions.append( weights.detach() ) #we are detaching the weights because we \n",
|
||
|
|
" #do not want to compute anything with them anymore, we just want to save their \n",
|
||
|
|
" #values to make visualizations\n",
|
||
|
|
"\n",
|
||
|
|
" #Now lets compute the final representation by concatinating the \n",
|
||
|
|
" #attention result and the initial context\n",
|
||
|
|
" word_pred = torch.cat((context, h_decoder), dim=1) #(B, D) + (B, D) -> (B, 2*D)\n",
|
||
|
|
" #and get a prediction about what the next token is by pushing it\n",
|
||
|
|
" #through a small fully-connected network\n",
|
||
|
|
" word_pred = self.predict_word(word_pred) #(B, 2*D) -> (B, V)\n",
|
||
|
|
" all_predictions.append(word_pred)\n",
|
||
|
|
" \n",
|
||
|
|
" #Now we have $\\hat{y}_t$! we need to select the input for the next\n",
|
||
|
|
" #time step. We use torch.no_grad() because the gradient will \n",
|
||
|
|
" #carry through the hidden states of the RNN, not the input tokens\n",
|
||
|
|
" with torch.no_grad():\n",
|
||
|
|
" if self.training:\n",
|
||
|
|
" if target is not None and teacher_forcing:\n",
|
||
|
|
" #We have the target and selected teacher forcing, so use the\n",
|
||
|
|
" #correct next answer\n",
|
||
|
|
" next_words = target[:,t].squeeze()\n",
|
||
|
|
" else:\n",
|
||
|
|
" #Sample the next token based on the predictions made\n",
|
||
|
|
" next_words = torch.multinomial(F.softmax(word_pred, dim=1), 1)[:,-1]\n",
|
||
|
|
" else:\n",
|
||
|
|
" #we are trying to make an actual prediction, so take the most likely word\n",
|
||
|
|
" #we could improve this by using temperature and sampling like we did \n",
|
||
|
|
" #for the CharRNN model!\n",
|
||
|
|
" next_words = torch.argmax(word_pred, dim=1)\n",
|
||
|
|
" #end of torch.no_grad()\n",
|
||
|
|
" \n",
|
||
|
|
" #We've decided what the next tokens are, we are back to using\n",
|
||
|
|
" #the gradient calculation so that the embedding layer is adjusted\n",
|
||
|
|
" #appropriately during training. \n",
|
||
|
|
" decoder_input = self.embd(next_words.to(device))\n",
|
||
|
|
" \n",
|
||
|
|
" #done decoding!\n",
|
||
|
|
" if self.training: #When training, only the predictions are important\n",
|
||
|
|
" return torch.stack(all_predictions, dim=1)\n",
|
||
|
|
" else:#When evaluatin, we also want to look at the attention weights\n",
|
||
|
|
" return torch.stack(all_predictions, dim=1), torch.stack(all_attentions, dim=1).squeeze()"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 14,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:39:20.592283Z",
|
||
|
|
"start_time": "2021-04-02T02:39:20.587774Z"
|
||
|
|
},
|
||
|
|
"tags": [
|
||
|
|
"remove_cell"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"set_seed(42)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 15,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:39:20.667146Z",
|
||
|
|
"start_time": "2021-04-02T02:39:20.593411Z"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"epochs = 20\n",
|
||
|
|
"seq2seq = Seq2SeqAttention(len(word2indx), 64, 256, padding_idx=word2indx[PAD_token], layers=3, max_decode_length=MAX_LEN+2)\n",
|
||
|
|
"for p in seq2seq.parameters():\n",
|
||
|
|
" p.register_hook(lambda grad: torch.clamp(grad, -10, 10))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 16,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:39:20.671422Z",
|
||
|
|
"start_time": "2021-04-02T02:39:20.668372Z"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"def CrossEntLossTime(x, y):\n",
|
||
|
|
" \"\"\"\n",
|
||
|
|
" x: output with shape (B, T, V)\n",
|
||
|
|
" y: labels with shape (B, T')\n",
|
||
|
|
" \n",
|
||
|
|
" \"\"\"\n",
|
||
|
|
" if isinstance(x, tuple):\n",
|
||
|
|
" x, _ = x\n",
|
||
|
|
" #We do not want to compute a loss for items that have been padded out!\n",
|
||
|
|
" cel = nn.CrossEntropyLoss(ignore_index=word2indx[PAD_token])\n",
|
||
|
|
" T = min(x.size(1), y.size(1))\n",
|
||
|
|
" \n",
|
||
|
|
" loss = 0\n",
|
||
|
|
" for t in range(T):\n",
|
||
|
|
" loss += cel(x[:,t,:], y[:,t])\n",
|
||
|
|
" return loss"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 17,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:49:02.771218Z",
|
||
|
|
"start_time": "2021-04-02T02:39:20.672587Z"
|
||
|
|
},
|
||
|
|
"tags": [
|
||
|
|
"remove_output"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "202e44794cb44d2485879cfaebfc5601",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Epoch'), FloatProgress(value=0.0, max=20.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/vnd.jupyter.widget-view+json": {
|
||
|
|
"model_id": "",
|
||
|
|
"version_major": 2,
|
||
|
|
"version_minor": 0
|
||
|
|
},
|
||
|
|
"text/plain": [
|
||
|
|
"HBox(children=(HTML(value='Training'), FloatProgress(value=0.0, max=466.0), HTML(value='')))"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"seq2seq_results = train_network(seq2seq, CrossEntLossTime, train_loader,epochs=epochs, device=device)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 18,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:49:03.022473Z",
|
||
|
|
"start_time": "2021-04-02T02:49:02.772787Z"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"text/plain": [
|
||
|
|
"<AxesSubplot:xlabel='epoch', ylabel='train loss'>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"execution_count": 18,
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "execute_result"
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/pdf": "JVBERi0xLjQKJazcIKu6CjEgMCBvYmoKPDwgL1BhZ2VzIDIgMCBSIC9UeXBlIC9DYXRhbG9nID4+CmVuZG9iago4IDAgb2JqCjw8IC9FeHRHU3RhdGUgNCAwIFIgL0ZvbnQgMyAwIFIgL1BhdHRlcm4gNSAwIFIKL1Byb2NTZXQgWyAvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0gL1NoYWRpbmcgNiAwIFIKL1hPYmplY3QgNyAwIFIgPj4KZW5kb2JqCjEwIDAgb2JqCjw8IC9Bbm5vdHMgWyBdIC9Db250ZW50cyA5IDAgUgovR3JvdXAgPDwgL0NTIC9EZXZpY2VSR0IgL1MgL1RyYW5zcGFyZW5jeSAvVHlwZSAvR3JvdXAgPj4KL01lZGlhQm94IFsgMCAwIDM4Mi41OTA2MjUgMjYyLjE4Mzc1IF0gL1BhcmVudCAyIDAgUiAvUmVzb3VyY2VzIDggMCBSCi9UeXBlIC9QYWdlID4+CmVuZG9iago5IDAgb2JqCjw8IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9MZW5ndGggMTEgMCBSID4+CnN0cmVhbQp4nJVWTW8cNwy9z6/QsT1U5ocoiccYbQ3klsRAz8Vm48SwnTou6r/fJ+3HaNb70doYYOeBwyeSTyQ53E9X7zjcvQQK93heA4ebcPXr+p9vq/XHm+uwepkI+OOkVaI5ZTG8PoyvkiVy1WKAafH2dZqeJnjHFzdwfDdNiXZfaYmWmhlcF4t6gD6MqFiKvvU5exhRMH1BJLKJ5A5kiCZWxNOogUxmsVKtVEbmAUyRtsTTNc78Ol3fhqvfOTCF2y9TKrGa5cr4lyAS3cLt5+knivRzuL0Pv91OnW5yeLScLY00A3ieppbopCa1UOWBBrle0rAaLJMRjzwjep6IBUzGMDBfMNlhQIwyuImmReJG9AJTBpO7iKRaB6JyGJJwjkTEvkjdiJ4nEkqx5qKoUBmJ+E2NxOAzVUqL5I3oBaYE4bEJypSLj1Rv6iQOp24VoY9UA3qBqoIqKxXLtqR6UyjVHBmudHm3BvQ8lQpcMqFSlpYJHEq1LK1LxMFwFT1KqSwb+/Vf31dfl2ebL22mCG1rKf3eIwsH6Ik0lCja/KNGzmwkZCobwZ5iQo4dZmwLphk9paJYCxQES40smhOBr26VdIqLFcYq2XRBNsCX2Fg8qlpBGktN2xKfpMswTqk4L+lm+CJdNkgEllmg995iTgaHdEX0PhdfsA3wJTYhjiUTQZSkeUN3MjgcCMb4vZTIAF+kw1deBPLUnDcqUTqqYMKg+IUxHzjF4trroBFlgJIf++BrH//9489vT+Hh+8vLzslzODLIFBcM9wbXJaXwYx3+CE9BwvvA0docgpoYEyRLMcSc8vavhKZ99AJB3/fw8XD6DjNKkkVGL+SEzBSOVYqnHLji4iZRaSrDBKkJdykFNo7IOHXxMSmaYxbYsKCleKXccfZYqynSxISmJElqg+dBgmtQXc2lwXDZkqoeqkYjNItu3Vp8Emg3lBwLWk53DRPP7FxCQYiarTZdsjumNpPl0DRYKHu7i0Ofz40kCTUniApNyVU1GMRdWBEw4FQjKQKV1hFS4ZzbQSSjxVnJzAG7AQjNu3XFCECrTh5M0akITb7BcxducSH7ucHoM7G3mBIMRRaku51EpeIuJzCF5FBi/w4wZgGbKjziTBgHmzIoOhoXDAoNWB2QG63tJNOn6UN47qqg/YayrPfRDen40gNvx1anx1OrE+z/x/61sJ7dnPN+9U43C9j7tu3hee0hbnc/wbjQ7rxVVbnfVbjLde9uxlsKkWZRFGjEFVoarL1US7JE0852NY046rA76gKGrLgNnzASJt8aj6fbg6sxlj3aFMVthCYuAyxOg+mWawTL4HWPzlE8LOB9yCPXnJ6jOV619fh6tx73lgTxvW1L4T+2pQkyFU/7ANCJ+mjgA6hrgrrWt2LY7uIHe8d85Jbr3nI/rZ8Fz67ffpj+BRGwj8oKZW5kc3RyZWFtCmVuZG9iagoxMSAwIG9iagoxMDY4CmVuZG9iagoxNiAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZSAvTGVuZ3RoIDMzOCA+PgpzdHJlYW0KeJw1UkuSW0EI279T6AKuav7NeZya1eT+2wjsrKCBFhKQFjjIxEsMUY1yxR95gvE6gb/r5Wn8Pt6F1IKnIv3AtWkb78eaNVGwNGIpzD72/Sghx1Pj3xDouUgTZmQyciAZiPu1Pn/Wm0w5/AakaXP6KEl6EC3Y3Rp2fFmQQdKTGpbs5Id1LbC6CE2YG2siGTm1MjXPx57hMp4YI0HVLCBJn7hPFYxIMx47Zy15kOF4qhcvfr2N1zKPqZdVBTK2CeZgO5kJpygiEL+gJLmJu2jqKI5mxprbhYaSIvfdPZyc9Lq/nEQFXgnhLNYSjhl6yjInOw1KoGrlBJhhvfaFcZo2SrhT0+1dsa/fZyZh3Oaws1IyDc5xcC+bzBEke90xYRMeh5j37hGMxLz5XWwRXLnMuSbTj/0o2kgfFNfnXE2ZrSjhH6rkiRXX+P/83s/PP5A3fbEKZW5kc3RyZWFtCmVuZG9iagoxNyAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZSAvTGVuZ3RoIDMwNCA+PgpzdHJlYW0KeJw9kjuSwzAMQ3udghfIjPiT5PNkJ5X3/u0+MslWgEmJACgvdZmypjwgaSYJ/9Hh4WI75XfYns3MwLVELxPLKc+hK8TcRfmymY26sjrFqsMwnVv0qJyLhk2TmucqSxm3C57DtYnnln3EDzc0qAd1jUvCDd3VaFkKzXB1/zu9R9l3NTwXm1Tq1BePF1EV5vkhT6KH6UrifDwoIVx7MEYWEuRT0UCOs1yt8l5C9g63GrLCQWpJ57MnPNh1ek8ubhfNEA9kuVT4TlHs7dAzvuxKCT0StuFY7n07mrHpGps47H7vRtbKjK5oIX7IVyfrJWDcUyZFEmROtlhui9We7qEopnOGcxkg6tmKhlLmYlerfww7bywv2SzIlMwLMkanTZ44eMh+jZr0eZXneP0BbPNzOwplbmRzdHJlYW0KZW5kb2JqCjE4IDAgb2JqCjw8IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9MZW5ndGggMjMwID4+CnN0cmVhbQp4nDVRSW7DMAy86xXzgQDiLr/HQU/t/68d0glgYGhLnM0RGxsReInBz0HkxlvWjJr4m8ld8bs8FR4Jt4InUQRehnvZCS5vGJf9OMx88F5aOZMaTzIgF9n08ETIYJdA6MDsGtRhm2kn+oaEz45INRtZTl9L0EurEChP2X6nC0q0rerP7bMutO1rTzjZ7aknlU8gnluyApeNV0wWYxn0ROUuxfRBqrOFnoTyonwOsvmoIRJdopyBJwYHo0A7sOe2n4lXhaB1dZ+2jaEaKR1P/zY0NUki5BMlnNnSuFv4/p57/fwDplRTnwplbmRzdHJlYW0KZW5kb2JqCjE5IDAgb2JqCjw8IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9MZW5ndGggMjQ1ID4+CnN0cmVhbQp4nEVQu41DMQzrPQUXCGD9LHued0iV2789SkZwhSFaP5JaEpiIwEsMsZRv4kdGQT0LvxeF4jPEzxeFQc6EpECc9RkQmXiG2kZu6HZwzrzDM4w5AhfFWnCm05n2XNjknAcnEM5tlPGMQrpJVBVxVJ9xTPGqss+N14GltWyz05HsIY2ES0klJpd+Uyr/tClbKujaRROwSOSBk0004Sw/Q5JizKCUUfcwtY70cbKRR3XQydmcOS2Z2e6n7Ux8D1gmmVHlKZ3nMj4nqfNcTn3usx3R5KKlVfuc/d6RlvIitduh1elXJVGZjdWnkLg8/4yf8f4DjqBZPgplbmRzdHJlYW0KZW5kb2JqCjIwIDAgb2JqCjw8IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9MZW5ndGggMjQ3ID4+CnN0cmVhbQp4nE1Ru21EMQzr3xRc4ADra3meC1Jd9m9Dy
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 432x288 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {
|
||
|
|
"needs_background": "light"
|
||
|
|
},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"sns.lineplot(x='epoch', y='train loss', data=seq2seq_results, label='Seq2Seq')"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 19,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:49:03.028281Z",
|
||
|
|
"start_time": "2021-04-02T02:49:03.023936Z"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"def plot_heatmap(src, trg, scores):\n",
|
||
|
|
" fig, ax = plt.subplots()\n",
|
||
|
|
" heatmap = ax.pcolor(scores, cmap='gray')\n",
|
||
|
|
"\n",
|
||
|
|
" ax.set_xticklabels(trg, minor=False, rotation='vertical')\n",
|
||
|
|
" ax.set_yticklabels(src, minor=False)\n",
|
||
|
|
"\n",
|
||
|
|
" # put the major ticks at the middle of each cell\n",
|
||
|
|
" # and the x-ticks on top\n",
|
||
|
|
" ax.xaxis.tick_top()\n",
|
||
|
|
" ax.set_xticks(np.arange(scores.shape[1]) + 0.5, minor=False)\n",
|
||
|
|
" ax.set_yticks(np.arange(scores.shape[0]) + 0.5, minor=False)\n",
|
||
|
|
" ax.invert_yaxis()\n",
|
||
|
|
"\n",
|
||
|
|
" plt.colorbar(heatmap)\n",
|
||
|
|
" plt.show()"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 20,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:49:03.073143Z",
|
||
|
|
"start_time": "2021-04-02T02:49:03.029730Z"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"seq2seq = seq2seq.eval().cpu()\n",
|
||
|
|
"def results(indx):\n",
|
||
|
|
" eng_x, french_y = test_dataset[indx]\n",
|
||
|
|
" eng_str = \" \".join([indx2word[i] for i in eng_x.cpu().numpy()])\n",
|
||
|
|
" french_str = \" \".join([indx2word[i] for i in french_y.cpu().numpy()])\n",
|
||
|
|
" print(\"Input: \", eng_str)\n",
|
||
|
|
" print(\"Target: \", french_str)\n",
|
||
|
|
" \n",
|
||
|
|
" with torch.no_grad():\n",
|
||
|
|
" preds, attention = seq2seq(eng_x.unsqueeze(0))\n",
|
||
|
|
" p = torch.argmax(preds, dim=2)\n",
|
||
|
|
" pred_str = \" \".join([indx2word[i] for i in p[0,:].cpu().numpy()])\n",
|
||
|
|
" print(\"Predicted: \", pred_str)\n",
|
||
|
|
" plot_heatmap(eng_str.split(\" \"), pred_str.split(\" \"), attention.T.cpu().numpy())"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 21,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:49:03.431726Z",
|
||
|
|
"start_time": "2021-04-02T02:49:03.074711Z"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"Input: <SOS> some animals are afraid of fire <EOS>\n",
|
||
|
|
"Target: certains animaux craignent le feu <EOS>\n",
|
||
|
|
"Predicted: les animaux ont peur du feu <EOS> <EOS>\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"name": "stderr",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"/home/edraff/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:5: UserWarning: FixedFormatter should only be used together with FixedLocator\n",
|
||
|
|
" \"\"\"\n",
|
||
|
|
"/home/edraff/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:6: UserWarning: FixedFormatter should only be used together with FixedLocator\n",
|
||
|
|
" \n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/pdf": "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
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 432x288 with 2 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {
|
||
|
|
"needs_background": "light"
|
||
|
|
},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"results(12) "
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 22,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:49:03.779389Z",
|
||
|
|
"start_time": "2021-04-02T02:49:03.433053Z"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"Input: <SOS> what is the weather like today <EOS>\n",
|
||
|
|
"Target: comment est le temps aujourd'hui <EOS>\n",
|
||
|
|
"Predicted: quel temps fait il aujourd'hui <EOS> <EOS> <EOS>\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"name": "stderr",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"/home/edraff/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:5: UserWarning: FixedFormatter should only be used together with FixedLocator\n",
|
||
|
|
" \"\"\"\n",
|
||
|
|
"/home/edraff/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:6: UserWarning: FixedFormatter should only be used together with FixedLocator\n",
|
||
|
|
" \n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/pdf": "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
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 432x288 with 2 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {
|
||
|
|
"needs_background": "light"
|
||
|
|
},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"results(13) "
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 23,
|
||
|
|
"metadata": {
|
||
|
|
"ExecuteTime": {
|
||
|
|
"end_time": "2021-04-02T02:49:04.114861Z",
|
||
|
|
"start_time": "2021-04-02T02:49:03.780582Z"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"Input: <SOS> no one disagreed <EOS>\n",
|
||
|
|
"Target: personne ne fut en désaccord <EOS>\n",
|
||
|
|
"Predicted: personne n'exprima de désaccord <EOS>\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"name": "stderr",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"/home/edraff/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:5: UserWarning: FixedFormatter should only be used together with FixedLocator\n",
|
||
|
|
" \"\"\"\n",
|
||
|
|
"/home/edraff/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:6: UserWarning: FixedFormatter should only be used together with FixedLocator\n",
|
||
|
|
" \n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"application/pdf": "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
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 432x288 with 2 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {
|
||
|
|
"needs_background": "light"
|
||
|
|
},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"results(16) "
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"metadata": {
|
||
|
|
"author": "BLUE About Validation Loss?",
|
||
|
|
"celltoolbar": "Tags",
|
||
|
|
"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.7.9"
|
||
|
|
},
|
||
|
|
"latex_envs": {
|
||
|
|
"LaTeX_envs_menu_present": true,
|
||
|
|
"autoclose": false,
|
||
|
|
"autocomplete": false,
|
||
|
|
"bibliofile": "biblio.bib",
|
||
|
|
"cite_by": "apalike",
|
||
|
|
"current_citInitial": 1,
|
||
|
|
"eqLabelWithNumbers": true,
|
||
|
|
"eqNumInitial": 1,
|
||
|
|
"hotkeys": {
|
||
|
|
"equation": "Ctrl-E",
|
||
|
|
"itemize": "Ctrl-I"
|
||
|
|
},
|
||
|
|
"labels_anchors": false,
|
||
|
|
"latex_user_defs": false,
|
||
|
|
"report_style_numbering": false,
|
||
|
|
"user_envs_cfg": false
|
||
|
|
},
|
||
|
|
"latex_metadata": {
|
||
|
|
"title": "Sequence to Sequence"
|
||
|
|
},
|
||
|
|
"varInspector": {
|
||
|
|
"cols": {
|
||
|
|
"lenName": 16,
|
||
|
|
"lenType": 16,
|
||
|
|
"lenVar": 40
|
||
|
|
},
|
||
|
|
"kernels_config": {
|
||
|
|
"python": {
|
||
|
|
"delete_cmd_postfix": "",
|
||
|
|
"delete_cmd_prefix": "del ",
|
||
|
|
"library": "var_list.py",
|
||
|
|
"varRefreshCmd": "print(var_dic_list())"
|
||
|
|
},
|
||
|
|
"r": {
|
||
|
|
"delete_cmd_postfix": ") ",
|
||
|
|
"delete_cmd_prefix": "rm(",
|
||
|
|
"library": "var_list.r",
|
||
|
|
"varRefreshCmd": "cat(var_dic_list()) "
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"types_to_exclude": [
|
||
|
|
"module",
|
||
|
|
"function",
|
||
|
|
"builtin_function_or_method",
|
||
|
|
"instance",
|
||
|
|
"_Feature"
|
||
|
|
],
|
||
|
|
"window_display": false
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"nbformat": 4,
|
||
|
|
"nbformat_minor": 2
|
||
|
|
}
|