pytorch-sentiment-analysis/1_nbow.ipynb
2021-07-15 22:41:50 +01:00

1893 lines
159 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "a36e41e8",
"metadata": {},
"source": [
"# 1 - NBoW\n",
"\n",
"In this series we'll be building a machine learning model to perform sentiment analysis -- a subset of text classification where the task is to detect if a given sentence is positive or negative -- using [PyTorch](https://github.com/pytorch/pytorch) and [torchtext](https://github.com/pytorch/text). The dataset used will be movie reviews from the [IMDb dataset](http://ai.stanford.edu/~amaas/data/sentiment/), which we'll obtain using the [datasets](https://github.com/huggingface/datasets) library.\n",
"\n",
"## Introduction\n",
"\n",
"In this first notebook, we'll start very simple with one of the most basic models for *NLP* (natural language processing): a *NBoW* (*neural bag-of-words*) model (also known as *continuous bag-of-words*, *CBoW*). The NBoW model are a strong, commonly used, baseline model for NLP tasks. They should be one of the first models you implement when performing sentiment analysis/text classification.\n",
"\n",
"![](assets/nbow_model.png)\n",
"\n",
"An NBoW model takes in a sequence of $T$ *tokens*, $X=\\{x_1,...,x_T\\} \\in \\mathbb{Z}^T$ and passes each token through an *embedding layer* to obtain a sequence of *embedding vectors*. The sequence of embedding vectors is just known as an *embedding*, $E=\\{e_1,...,e_T\\} \\in \\mathbb{R}^{T \\times D}$, where $D$ is known as the *embedding dimension*. It then *pools* the embeddings across the sequence dimension to get $P \\in \\mathbb{R}^D$ and then finally passes $P$ through a linear layer (also known as a fully connected layer), to get a prediction, $\\hat{Y} \\in \\mathbb{R}^C$, where $C$ is the number of classes. We'll explain what a token is, and what each of the layers -- embedding layer, pooling, and linear layer -- do in due course. \n",
"\n",
"A note on notation, what does something like $E=\\{e_1,...,e_T\\} \\in \\mathbb{R}^{T \\times D}$ mean? $\\mathbb{R}^{T \\times D}$ means a $T \\times D$ sized tensor full of real numbers, i.e. a `torch.FloatTensor`. $X=\\{x_1,...,x_T\\} \\in \\mathbb{Z}^T$ is a $T$ sized tensor full of integers, i.e. a `torch.LongTensor`.\n",
"\n",
"## Preparing Data\n",
"\n",
"Before we can implement our NBoW model, we first have to perform quite a few steps to get our data ready to use. NLP usually requires quite a lot of data wrangling beforehand, though libraries such as `datasets` and `torchtext` handle most of this for us.\n",
"\n",
"The steps to take are:\n",
"- importing modules\n",
"- loading data\n",
"- tokenizing data\n",
"- creating data splits\n",
"- creating a vocabulary\n",
"- numericalizing data\n",
"- creating the dataloaders\n",
"\n",
"### Importing Modules\n",
"\n",
"First, we'll import the required modules. \n",
"\n",
"We use the `datasets` module for handling datasets, `matplotlib` for plotting our results, `numpy` for numerical analysis, `torch` for tensor computations, `torch.nn` for neural networks, `torch.optim` for neural network optimizers, `torchtext` for text processing, and `tqdm` for process bars."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "e322bd29",
"metadata": {},
"outputs": [],
"source": [
"import functools\n",
"import sys\n",
"\n",
"import datasets\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import torch\n",
"import torch.nn as nn\n",
"import torch.optim as optim\n",
"import torchtext\n",
"import tqdm"
]
},
{
"cell_type": "markdown",
"id": "a5478fc3",
"metadata": {},
"source": [
"We'll also make sure to set the random seeds for `torch` and `numpy`. This is to ensure this notebook is reproducable, i.e. we get the same results each time we run it.\n",
"\n",
"It is usually good practice to run your experiments multiple times with different random seeds -- both to measure the variance of your model and also to avoid having results only calculated with either \"good\" or \"bad\" seeds, i.e. being very lucky or unlucky with the randomness in the training process."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "fcc98ce9",
"metadata": {},
"outputs": [],
"source": [
"seed = 0\n",
"\n",
"torch.manual_seed(seed)\n",
"np.random.seed(seed)"
]
},
{
"cell_type": "markdown",
"id": "55b1eb74",
"metadata": {},
"source": [
"Next, we'll load our dataset using the `datasets` library. The first argument is the name of the dataset and the `split` argument chooses which *splits* of the data we want. \n",
"\n",
"Datasets usually come in two or more *splits*, non-overlapping examples from the data, most commonly a *train split* -- which we train our model on -- and a *test split* -- which we evaluate our trained model on. There's also a *validation split*, which we'll talk more about later. The train, test and validation split are also commonly called the train, test and validation sets -- we'll use split and set interchangeably\n",
" in these tutorials -- and the dataset usually refers to all three of the sets combined. The IMDb dataset actually comes with a third split, called *unsupervised*, which contains a bunch of examples without labels. We don't want these so we don't include them in our `split` argument. Note that if we didn't pass an argument to `split` then it would load all available splits of the data.\n",
"\n",
"How do we know that we have to use \"imdb\" for the IMDb dataset and that there's an \"unsupervised\" split? The `datasets` library has a great website used to browse the available datasets, see: https://huggingface.co/datasets/. By navigating to the [IMDb dataset page](https://huggingface.co/datasets/imdb) we can see more information specifically about the IMDb dataset.\n",
"\n",
"The output received when loading the dataset tells us that it is using a locally cached version instead of downloading the dataset from online."
]
},
{
"cell_type": "code",
"execution_count": 63,
"id": "798f5387",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Reusing dataset imdb (/home/ben/.cache/huggingface/datasets/imdb/plain_text/1.0.0/e3c66f1788a67a89c7058d97ff62b6c30531e05b549de56d3ab91891f0561f9a)\n"
]
}
],
"source": [
"train_data, test_data = datasets.load_dataset(\"imdb\", split=[\"train\", \"test\"])"
]
},
{
"cell_type": "markdown",
"id": "93721296",
"metadata": {},
"source": [
"We can print out the splits which shows us the *features* and *num_rows* of the dataset. num_rows are the number of examples in split, as we can see, there are 25,000 examples in each. Each example in a dataset provided by the `datasets` library is a dictionary, and the features are the keys which appear in every one of those dictionaries/examples. So, each example in the IMDb dataset has a *text* and a *label* key."
]
},
{
"cell_type": "code",
"execution_count": 64,
"id": "42338609",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(Dataset({\n",
" features: ['label', 'text'],\n",
" num_rows: 25000\n",
" }),\n",
" Dataset({\n",
" features: ['label', 'text'],\n",
" num_rows: 25000\n",
" }))"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_data, test_data"
]
},
{
"cell_type": "markdown",
"id": "8ec70556",
"metadata": {},
"source": [
"We can check the `features` attribute of a split to get more information about the features. We can see that *text* is a `Value` of `dtype=string` -- in other words, it's a string -- and that *label* is a `ClassLabel`. A `ClassLabel` means the feature is an integer representation of which class the example belongs to. `num_classes=2` means that our labels are one of two values, 0 or 1, and `names=['neg', 'pos']` gives us the human-readable versions of those values. Thus, a label of 0 means the example is a negative review and a label of 1 means the example is a positive review."
]
},
{
"cell_type": "code",
"execution_count": 65,
"id": "58f5cc56",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'label': ClassLabel(num_classes=2, names=['neg', 'pos'], names_file=None, id=None),\n",
" 'text': Value(dtype='string', id=None)}"
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_data.features"
]
},
{
"cell_type": "markdown",
"id": "84271369",
"metadata": {},
"source": [
"We can look at an example by indexing into the train set. As we can see, the text is quite noisy and also rambles on quite a bit."
]
},
{
"cell_type": "code",
"execution_count": 66,
"id": "25a6e8cb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'label': 1,\n",
" 'text': 'Bromwell High is a cartoon comedy. It ran at the same time as some other programs about school life, such as \"Teachers\". My 35 years in the teaching profession lead me to believe that Bromwell High\\'s satire is much closer to reality than is \"Teachers\". The scramble to survive financially, the insightful students who can see right through their pathetic teachers\\' pomp, the pettiness of the whole situation, all remind me of the schools I knew and their students. When I saw the episode in which a student repeatedly tried to burn down the school, I immediately recalled ......... at .......... High. A classic line: INSPECTOR: I\\'m here to sack one of your teachers. STUDENT: Welcome to Bromwell High. I expect that many adults of my age think that Bromwell High is far fetched. What a pity that it isn\\'t!'}"
]
},
"execution_count": 66,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_data[0]"
]
},
{
"cell_type": "markdown",
"id": "f8536207",
"metadata": {},
"source": [
"One of the first things we need to do to our data is *tokenize* it. Machine learning models aren't designed to handle strings, they're design to handle numbers. So what we need to do is break down our string into individual *tokens*, and then convert these tokens to numbers. We'll get to the conversion later, but first we'll look at *tokenization*.\n",
"\n",
"Tokenization involves using a *tokenizer* to process the strings in our dataset. A tokenizer is a function that goes from a string to a list of strings. There are many types of tokenizers available, but we're going to use a relatively simple one provided by `torchtext` called the `basic_english` tokenizer. We load our tokenizer as such:"
]
},
{
"cell_type": "code",
"execution_count": 67,
"id": "3017c0ab",
"metadata": {},
"outputs": [],
"source": [
"tokenizer = torchtext.data.utils.get_tokenizer(\"basic_english\")"
]
},
{
"cell_type": "markdown",
"id": "4db58859",
"metadata": {},
"source": [
"We can use the tokenizer by calling it on a string.\n",
"\n",
"Notice it creates a token by splitting the word on spaces, puts punctuation as its own token, and also lowercases every single word.\n",
"\n",
"The `get_tokenizer` function also supports other tokenizers, such as ones provided by [spaCy](https://spacy.io/) and [nltk](https://www.nltk.org/). "
]
},
{
"cell_type": "code",
"execution_count": 68,
"id": "2d0de969",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['hello',\n",
" 'world',\n",
" '!',\n",
" 'how',\n",
" 'are',\n",
" 'you',\n",
" 'doing',\n",
" 'today',\n",
" '?',\n",
" 'i',\n",
" \"'\",\n",
" 'm',\n",
" 'doing',\n",
" 'fantastic',\n",
" '!']"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tokenizer(\"Hello world! How are you doing today? I'm doing fantastic!\")"
]
},
{
"cell_type": "markdown",
"id": "593711b9",
"metadata": {},
"source": [
"Now we have our tokenizer defined, we want to actually tokenize our data.\n",
"\n",
"Each dataset provided by the `datasets` library is an instance of a `Dataset` class. We can see all the methods in a `Dataset` [here](https://huggingface.co/docs/datasets/package_reference/main_classes.html#dataset), but the main one we are interested in is [`map`](https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map). By using `map` we can apply a function to every example in the dataset and either update the example or create a new feature.\n",
"\n",
"We define the `tokenize_example` function below which takes in an `example`, a `tokenizer` and a `max_length` argument, tokenizes the text in the example, given by `example['text']`, trims the tokens to a maximum length and then returns a dictionary with the new feature name and feature value for that example. Note that the first argument to a function which we are going to `map` must always be the example dictionary, and it must always return a dictionary where the keys are the feature names and the values are the feature values to be added to this example. \n",
"\n",
"We're trimming the tokens to a maximum length here as some examples are unnecessarily long and we can predict sentiment pretty well just using the first couple of hundred tokens -- though this might not be true for you if you're using a different dataset!"
]
},
{
"cell_type": "code",
"execution_count": 69,
"id": "876ad3b9",
"metadata": {},
"outputs": [],
"source": [
"def tokenize_example(example, tokenizer, max_length):\n",
" tokens = tokenizer(example['text'])[:max_length]\n",
" return {'tokens': tokens}"
]
},
{
"cell_type": "markdown",
"id": "35129a1b",
"metadata": {},
"source": [
"We apply the `tokenize_example` function below, on both the train and test sets. Any arguments to the function -- that aren't the example -- need to be passed as the `fn_kwargs` dictionary, with the keys being the argument names and the values the value passed to that argument.\n",
"\n",
"Operations on a `Dataset` are **not** performed in-place. You should always return the result into a new variable.\n",
"\n",
"Note the warnings showing that as I have performed this `map` before, the results are cached and are thus loaded from the cache instead of being calculated again."
]
},
{
"cell_type": "code",
"execution_count": 70,
"id": "5e295030",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Loading cached processed dataset at /home/ben/.cache/huggingface/datasets/imdb/plain_text/1.0.0/e3c66f1788a67a89c7058d97ff62b6c30531e05b549de56d3ab91891f0561f9a/cache-ad1b7a77180a232c.arrow\n",
"Loading cached processed dataset at /home/ben/.cache/huggingface/datasets/imdb/plain_text/1.0.0/e3c66f1788a67a89c7058d97ff62b6c30531e05b549de56d3ab91891f0561f9a/cache-01c0069c185da175.arrow\n"
]
}
],
"source": [
"max_length = 256\n",
"\n",
"train_data = train_data.map(tokenize_example, fn_kwargs={'tokenizer': tokenizer, 'max_length': max_length})\n",
"test_data = test_data.map(tokenize_example, fn_kwargs={'tokenizer': tokenizer, 'max_length': max_length})"
]
},
{
"cell_type": "markdown",
"id": "a61b38c0",
"metadata": {},
"source": [
"We can now see that our `train_data` has a *tokens* feature -- as \"tokens\" was a key in the dictionary returned by the function we used for the `map`."
]
},
{
"cell_type": "code",
"execution_count": 71,
"id": "f647bdf9",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Dataset({\n",
" features: ['label', 'text', 'tokens'],\n",
" num_rows: 25000\n",
"})"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_data"
]
},
{
"cell_type": "markdown",
"id": "db3443a0",
"metadata": {},
"source": [
"By looking at the `features` attribute we can see it has automatically added the information about the tokens feature -- each is a sequence (a list) of strings. A `length=-1` means that all of our token sequences are not the same length."
]
},
{
"cell_type": "code",
"execution_count": 75,
"id": "1605d52b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'label': ClassLabel(num_classes=2, names=['neg', 'pos'], names_file=None, id=None),\n",
" 'text': Value(dtype='string', id=None),\n",
" 'tokens': Sequence(feature=Value(dtype='string', id=None), length=-1, id=None)}"
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_data.features"
]
},
{
"cell_type": "markdown",
"id": "1735d91a",
"metadata": {},
"source": [
"We can check the first example in our train set to see the result of the tokenization:"
]
},
{
"cell_type": "code",
"execution_count": 74,
"id": "2f3de3b9",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['bromwell',\n",
" 'high',\n",
" 'is',\n",
" 'a',\n",
" 'cartoon',\n",
" 'comedy',\n",
" '.',\n",
" 'it',\n",
" 'ran',\n",
" 'at',\n",
" 'the',\n",
" 'same',\n",
" 'time',\n",
" 'as',\n",
" 'some',\n",
" 'other',\n",
" 'programs',\n",
" 'about',\n",
" 'school',\n",
" 'life',\n",
" ',',\n",
" 'such',\n",
" 'as',\n",
" 'teachers',\n",
" '.']"
]
},
"execution_count": 74,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_data[0]['tokens'][:25]"
]
},
{
"cell_type": "markdown",
"id": "04d4ee14",
"metadata": {},
"source": [
"Next up, we'll create a *validation set* from our data. This is similar to our test set in that we do not train our model on it, we only evaluate our model on it. \n",
"\n",
"Why have both a validation set and a test set? Your test set respresents the real world data that you'd see if you actually deployed this model. You won't be able to see what data your model will be fed once deployed, and your test set is supposed to reflect that. Every time we tune our model hyperparameters or training set-up to make it do a bit better on the test set, we are leak information from the test set into the training process. If we do this too often then we begin to overfit on the test set. Hence, we need some data which can act as a \"proxy\" test set which we can look at more frequently in order to evaluate how well our model actually does on unseen data -- this is the validation set.\n",
"\n",
"We can split a `Dataset` using the `train_test_split` method which splits a dataset into two, creating a `DatasetDict` for each split, one called `train` and another called `test` -- a bit confusing because these are our train and validation sets, not the test. We use `test_size` to set the portion of the data used for the validation set -- 0.25 means we use 25% of the training set -- and the examples are chosen randomly."
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "15e48bfb",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Loading cached split indices for dataset at /home/ben/.cache/huggingface/datasets/imdb/plain_text/1.0.0/e3c66f1788a67a89c7058d97ff62b6c30531e05b549de56d3ab91891f0561f9a/cache-09bdb9cf28fcbb3c.arrow and /home/ben/.cache/huggingface/datasets/imdb/plain_text/1.0.0/e3c66f1788a67a89c7058d97ff62b6c30531e05b549de56d3ab91891f0561f9a/cache-8e0a9e291c417a75.arrow\n"
]
}
],
"source": [
"test_size = 0.25\n",
"\n",
"train_valid_data = train_data.train_test_split(test_size=test_size)\n",
"train_data = train_valid_data['train']\n",
"valid_data = train_valid_data['test']"
]
},
{
"cell_type": "markdown",
"id": "870c829b",
"metadata": {},
"source": [
"By showing the lengths of each split within our dataset, we can see the 25,000 training examples have now been split into 18,750 training examples and 6,250 validation examples, with the original 25,000 test examples remaining untouched."
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "c227e4fc",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(18750, 6250, 25000)"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(train_data), len(valid_data), len(test_data)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "4865e94a",
"metadata": {},
"outputs": [],
"source": [
"min_freq = 5\n",
"special_tokens = ['<unk>', '<pad>']\n",
"\n",
"vocab = torchtext.vocab.build_vocab_from_iterator(train_data['tokens'],\n",
" min_freq=min_freq,\n",
" specials=special_tokens)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "123ceb33",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"21526"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(vocab)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "d4ec89de",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['<unk>', '<pad>', 'the', '.', ',', 'a', 'and', 'of', 'to', \"'\"]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"vocab.get_itos()[:10]"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "29ac49c8",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"unk_index = vocab['<unk>']\n",
"\n",
"unk_index"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "447020e1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pad_index = vocab['<pad>']\n",
"\n",
"pad_index"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "201b5383",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"'some_token' in vocab"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "7a951ea0",
"metadata": {},
"outputs": [],
"source": [
"vocab.set_default_index(unk_index)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "407fe05d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"vocab['some_token']"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "76518d11",
"metadata": {},
"outputs": [],
"source": [
"def numericalize_data(example, vocab):\n",
" ids = [vocab[token] for token in example['tokens']]\n",
" return {'ids': ids}"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "dacaeaef",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Loading cached processed dataset at /home/ben/.cache/huggingface/datasets/imdb/plain_text/1.0.0/e3c66f1788a67a89c7058d97ff62b6c30531e05b549de56d3ab91891f0561f9a/cache-d266a0df023fa6e2.arrow\n",
"Loading cached processed dataset at /home/ben/.cache/huggingface/datasets/imdb/plain_text/1.0.0/e3c66f1788a67a89c7058d97ff62b6c30531e05b549de56d3ab91891f0561f9a/cache-296fd4058bb43b50.arrow\n",
"Loading cached processed dataset at /home/ben/.cache/huggingface/datasets/imdb/plain_text/1.0.0/e3c66f1788a67a89c7058d97ff62b6c30531e05b549de56d3ab91891f0561f9a/cache-6bc06b9661e3abbb.arrow\n"
]
}
],
"source": [
"train_data = train_data.map(numericalize_data, fn_kwargs={'vocab': vocab})\n",
"valid_data = valid_data.map(numericalize_data, fn_kwargs={'vocab': vocab})\n",
"test_data = test_data.map(numericalize_data, fn_kwargs={'vocab': vocab})"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "08751c45",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'label': 0,\n",
" 'text': 'This documentary is at its best when it is simply showing the ayurvedic healers\\' offices and treatment preparation. There is no denying the grinding poverty in India and desperation of even their wealthier clients. However, as an argument for ayurvedic medicine in general, this film fails miserably. Although Indian clients mention having seen \"aleopathic\" doctors, those doctors are not interviewed, and we have to take the vague statements of their patients at face value-- \"the doctor said there was no cure,\" \"the doctor said it was cancer\" etc. Well, \"no cure\" doesn\\'t mean \"no treatment,\" and what type of cancer exactly does the patient have? The film is at its most feeble when showing ayurvedic practice in America. There it is reduced, apparently, to the stunning suggestion that having a high powered Wall Street job can make your stomach hurt.',\n",
" 'tokens': ['this',\n",
" 'documentary',\n",
" 'is',\n",
" 'at',\n",
" 'its',\n",
" 'best',\n",
" 'when',\n",
" 'it',\n",
" 'is',\n",
" 'simply',\n",
" 'showing',\n",
" 'the',\n",
" 'ayurvedic',\n",
" 'healers',\n",
" \"'\",\n",
" 'offices',\n",
" 'and',\n",
" 'treatment',\n",
" 'preparation',\n",
" '.',\n",
" 'there',\n",
" 'is',\n",
" 'no',\n",
" 'denying',\n",
" 'the',\n",
" 'grinding',\n",
" 'poverty',\n",
" 'in',\n",
" 'india',\n",
" 'and',\n",
" 'desperation',\n",
" 'of',\n",
" 'even',\n",
" 'their',\n",
" 'wealthier',\n",
" 'clients',\n",
" '.',\n",
" 'however',\n",
" ',',\n",
" 'as',\n",
" 'an',\n",
" 'argument',\n",
" 'for',\n",
" 'ayurvedic',\n",
" 'medicine',\n",
" 'in',\n",
" 'general',\n",
" ',',\n",
" 'this',\n",
" 'film',\n",
" 'fails',\n",
" 'miserably',\n",
" '.',\n",
" 'although',\n",
" 'indian',\n",
" 'clients',\n",
" 'mention',\n",
" 'having',\n",
" 'seen',\n",
" 'aleopathic',\n",
" 'doctors',\n",
" ',',\n",
" 'those',\n",
" 'doctors',\n",
" 'are',\n",
" 'not',\n",
" 'interviewed',\n",
" ',',\n",
" 'and',\n",
" 'we',\n",
" 'have',\n",
" 'to',\n",
" 'take',\n",
" 'the',\n",
" 'vague',\n",
" 'statements',\n",
" 'of',\n",
" 'their',\n",
" 'patients',\n",
" 'at',\n",
" 'face',\n",
" 'value--',\n",
" 'the',\n",
" 'doctor',\n",
" 'said',\n",
" 'there',\n",
" 'was',\n",
" 'no',\n",
" 'cure',\n",
" ',',\n",
" 'the',\n",
" 'doctor',\n",
" 'said',\n",
" 'it',\n",
" 'was',\n",
" 'cancer',\n",
" 'etc',\n",
" '.',\n",
" 'well',\n",
" ',',\n",
" 'no',\n",
" 'cure',\n",
" 'doesn',\n",
" \"'\",\n",
" 't',\n",
" 'mean',\n",
" 'no',\n",
" 'treatment',\n",
" ',',\n",
" 'and',\n",
" 'what',\n",
" 'type',\n",
" 'of',\n",
" 'cancer',\n",
" 'exactly',\n",
" 'does',\n",
" 'the',\n",
" 'patient',\n",
" 'have',\n",
" '?',\n",
" 'the',\n",
" 'film',\n",
" 'is',\n",
" 'at',\n",
" 'its',\n",
" 'most',\n",
" 'feeble',\n",
" 'when',\n",
" 'showing',\n",
" 'ayurvedic',\n",
" 'practice',\n",
" 'in',\n",
" 'america',\n",
" '.',\n",
" 'there',\n",
" 'it',\n",
" 'is',\n",
" 'reduced',\n",
" ',',\n",
" 'apparently',\n",
" ',',\n",
" 'to',\n",
" 'the',\n",
" 'stunning',\n",
" 'suggestion',\n",
" 'that',\n",
" 'having',\n",
" 'a',\n",
" 'high',\n",
" 'powered',\n",
" 'wall',\n",
" 'street',\n",
" 'job',\n",
" 'can',\n",
" 'make',\n",
" 'your',\n",
" 'stomach',\n",
" 'hurt',\n",
" '.'],\n",
" 'ids': [14,\n",
" 627,\n",
" 10,\n",
" 37,\n",
" 100,\n",
" 125,\n",
" 60,\n",
" 11,\n",
" 10,\n",
" 361,\n",
" 834,\n",
" 2,\n",
" 0,\n",
" 0,\n",
" 9,\n",
" 12187,\n",
" 6,\n",
" 2407,\n",
" 9694,\n",
" 3,\n",
" 46,\n",
" 10,\n",
" 66,\n",
" 8861,\n",
" 2,\n",
" 16732,\n",
" 3705,\n",
" 13,\n",
" 2360,\n",
" 6,\n",
" 4374,\n",
" 7,\n",
" 69,\n",
" 77,\n",
" 0,\n",
" 13332,\n",
" 3,\n",
" 190,\n",
" 4,\n",
" 19,\n",
" 41,\n",
" 4597,\n",
" 21,\n",
" 0,\n",
" 6574,\n",
" 13,\n",
" 822,\n",
" 4,\n",
" 14,\n",
" 23,\n",
" 962,\n",
" 3426,\n",
" 3,\n",
" 265,\n",
" 1267,\n",
" 13332,\n",
" 798,\n",
" 266,\n",
" 111,\n",
" 0,\n",
" 5592,\n",
" 4,\n",
" 157,\n",
" 5592,\n",
" 30,\n",
" 29,\n",
" 8351,\n",
" 4,\n",
" 6,\n",
" 78,\n",
" 31,\n",
" 8,\n",
" 203,\n",
" 2,\n",
" 3400,\n",
" 6614,\n",
" 7,\n",
" 77,\n",
" 5229,\n",
" 37,\n",
" 454,\n",
" 0,\n",
" 2,\n",
" 937,\n",
" 307,\n",
" 46,\n",
" 17,\n",
" 66,\n",
" 4845,\n",
" 4,\n",
" 2,\n",
" 937,\n",
" 307,\n",
" 11,\n",
" 17,\n",
" 5362,\n",
" 487,\n",
" 3,\n",
" 82,\n",
" 4,\n",
" 66,\n",
" 4845,\n",
" 173,\n",
" 9,\n",
" 28,\n",
" 384,\n",
" 66,\n",
" 2407,\n",
" 4,\n",
" 6,\n",
" 55,\n",
" 618,\n",
" 7,\n",
" 5362,\n",
" 615,\n",
" 135,\n",
" 2,\n",
" 3307,\n",
" 31,\n",
" 56,\n",
" 2,\n",
" 23,\n",
" 10,\n",
" 37,\n",
" 100,\n",
" 94,\n",
" 6702,\n",
" 60,\n",
" 834,\n",
" 0,\n",
" 4335,\n",
" 13,\n",
" 865,\n",
" 3,\n",
" 46,\n",
" 11,\n",
" 10,\n",
" 4647,\n",
" 4,\n",
" 694,\n",
" 4,\n",
" 8,\n",
" 2,\n",
" 1253,\n",
" 5657,\n",
" 15,\n",
" 266,\n",
" 5,\n",
" 325,\n",
" 10526,\n",
" 1698,\n",
" 874,\n",
" 279,\n",
" 59,\n",
" 105,\n",
" 133,\n",
" 3035,\n",
" 1559,\n",
" 3]}"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_data[0]"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "678d0397",
"metadata": {},
"outputs": [],
"source": [
"train_data = train_data.with_format(type='torch', columns=['ids', 'label'])\n",
"valid_data = valid_data.with_format(type='torch', columns=['ids', 'label'])\n",
"test_data = test_data.with_format(type='torch', columns=['ids', 'label'])"
]
},
{
"cell_type": "markdown",
"id": "00a00726",
"metadata": {},
"source": [
"Same thing as `set_format`, but not in-place."
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "be56bf90",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'label': tensor(0),\n",
" 'ids': tensor([ 14, 627, 10, 37, 100, 125, 60, 11, 10, 361,\n",
" 834, 2, 0, 0, 9, 12187, 6, 2407, 9694, 3,\n",
" 46, 10, 66, 8861, 2, 16732, 3705, 13, 2360, 6,\n",
" 4374, 7, 69, 77, 0, 13332, 3, 190, 4, 19,\n",
" 41, 4597, 21, 0, 6574, 13, 822, 4, 14, 23,\n",
" 962, 3426, 3, 265, 1267, 13332, 798, 266, 111, 0,\n",
" 5592, 4, 157, 5592, 30, 29, 8351, 4, 6, 78,\n",
" 31, 8, 203, 2, 3400, 6614, 7, 77, 5229, 37,\n",
" 454, 0, 2, 937, 307, 46, 17, 66, 4845, 4,\n",
" 2, 937, 307, 11, 17, 5362, 487, 3, 82, 4,\n",
" 66, 4845, 173, 9, 28, 384, 66, 2407, 4, 6,\n",
" 55, 618, 7, 5362, 615, 135, 2, 3307, 31, 56,\n",
" 2, 23, 10, 37, 100, 94, 6702, 60, 834, 0,\n",
" 4335, 13, 865, 3, 46, 11, 10, 4647, 4, 694,\n",
" 4, 8, 2, 1253, 5657, 15, 266, 5, 325, 10526,\n",
" 1698, 874, 279, 59, 105, 133, 3035, 1559, 3])}"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_data[0]"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "d97786a1",
"metadata": {},
"outputs": [],
"source": [
"def collate(batch, pad_index):\n",
" batch_ids = [i['ids'] for i in batch]\n",
" batch_ids = nn.utils.rnn.pad_sequence(batch_ids, padding_value=pad_index, batch_first=True)\n",
" batch_label = [i['label'] for i in batch]\n",
" batch_label = torch.stack(batch_label)\n",
" batch = {'ids': batch_ids,\n",
" 'label': batch_label}\n",
" return batch"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "d3098a96",
"metadata": {},
"outputs": [],
"source": [
"batch_size = 512\n",
"\n",
"collate = functools.partial(collate, pad_index=pad_index)\n",
"\n",
"train_dataloader = torch.utils.data.DataLoader(train_data, \n",
" batch_size=batch_size, \n",
" collate_fn=collate, \n",
" shuffle=True)\n",
"\n",
"valid_dataloader = torch.utils.data.DataLoader(valid_data, batch_size=batch_size, collate_fn=collate)\n",
"test_dataloader = torch.utils.data.DataLoader(test_data, batch_size=batch_size, collate_fn=collate)"
]
},
{
"cell_type": "markdown",
"id": "d6ba2ac8",
"metadata": {},
"source": [
"Use `output_all_columns=True` to keep non-converted columns."
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "081f04a6",
"metadata": {},
"outputs": [],
"source": [
"class NBoW(nn.Module):\n",
" def __init__(self, vocab_size, embedding_dim, output_dim, pad_index):\n",
" super().__init__()\n",
" self.embedding = nn.Embedding(vocab_size, embedding_dim, padding_idx=pad_index)\n",
" self.fc = nn.Linear(embedding_dim, output_dim)\n",
"\n",
" def forward(self, ids):\n",
" # ids = [batch size, seq len]\n",
" embedded = self.embedding(ids)\n",
" # embedded = [batch size, seq len, embedding dim]\n",
" pooled = embedded.mean(dim=1)\n",
" # pooled = [batch size, embedding dim]\n",
" prediction = self.fc(pooled)\n",
" # prediction = [batch size, output dim]\n",
" return prediction"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "97897898",
"metadata": {},
"outputs": [],
"source": [
"vocab_size = len(vocab)\n",
"embedding_dim = 300\n",
"output_dim = len(train_data.unique('label'))\n",
"\n",
"model = NBoW(vocab_size, embedding_dim, output_dim, pad_index)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "4acc5118",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The model has 6,458,402 trainable parameters\n"
]
}
],
"source": [
"def count_parameters(model):\n",
" return sum(p.numel() for p in model.parameters() if p.requires_grad)\n",
"\n",
"print(f'The model has {count_parameters(model):,} trainable parameters')"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "866e0b64",
"metadata": {},
"outputs": [],
"source": [
"vectors = torchtext.vocab.FastText()"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "ead7be53",
"metadata": {},
"outputs": [],
"source": [
"hello_vector = vectors.get_vecs_by_tokens('hello')"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "1a64ead7",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"torch.Size([300])"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"hello_vector.shape"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "7ecc5d88",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([-1.5945e-01, -1.8259e-01, 3.3443e-02, 1.8813e-01, -6.7903e-02,\n",
" -1.3663e-01, -2.5559e-01, 1.1000e-01, 1.7275e-01, 5.1971e-02,\n",
" -2.3302e-02, 3.8866e-02, -2.4515e-01, -2.1588e-01, 3.5925e-01,\n",
" -8.2526e-02, 1.2176e-01, -2.6775e-01, 1.0072e-01, -1.3639e-01,\n",
" -9.2658e-02, 5.1837e-01, 1.7736e-01, 9.4878e-02, -1.8461e-01,\n",
" -4.2829e-02, 1.4114e-02, 1.6811e-01, -1.8565e-01, 3.4976e-02,\n",
" -1.0293e-01, 1.7954e-01, -5.2766e-02, 7.2047e-02, -4.2704e-01,\n",
" -1.1616e-01, -9.4875e-03, 1.4199e-01, -2.2782e-01, -1.7292e-02,\n",
" 8.2802e-02, -4.4512e-01, -7.5935e-02, -1.4392e-01, -8.2461e-02,\n",
" 2.0123e-01, -9.5344e-02, -1.1042e-01, -4.6817e-01, 2.0362e-01,\n",
" -1.7140e-01, -4.9850e-01, 2.8963e-01, -1.0305e-01, 2.0393e-01,\n",
" 5.2971e-01, -2.5396e-01, -5.1891e-01, 2.9941e-01, 1.7933e-01,\n",
" 3.0683e-01, 2.5828e-01, -1.8168e-01, -1.0225e-01, -1.1435e-01,\n",
" -1.6304e-01, -1.2424e-01, 3.2814e-01, -2.3099e-01, 1.7912e-01,\n",
" 9.9206e-02, 1.8595e-01, 2.7996e-01, 1.8323e-01, -1.7397e-01,\n",
" 2.6633e-01, -1.8151e-02, 2.8386e-01, 1.7328e-01, 2.9131e-01,\n",
" 8.2289e-02, 1.8560e-01, -1.5544e-01, 2.3311e-01, 3.6578e-01,\n",
" -3.0802e-01, -1.5908e-01, 4.0382e-01, 1.5332e-01, -1.1630e-01,\n",
" 1.3978e-01, 6.4237e-02, 2.2087e-01, 8.2723e-02, 1.2785e-01,\n",
" -6.6854e-02, -2.3016e-02, -1.9224e-01, -5.4482e-02, 3.7509e-01,\n",
" 5.1194e-01, -2.3650e-01, -7.1224e-02, 8.1112e-02, -3.2017e-01,\n",
" 5.0264e-02, -3.3223e-01, 2.2167e-02, 9.9936e-02, -2.7215e-01,\n",
" -7.2833e-02, -3.6598e-01, 1.7541e-01, -3.1303e-01, -2.3134e-01,\n",
" -1.5491e-01, 3.2102e-01, 1.2347e-01, 7.3616e-02, 2.0575e-01,\n",
" 6.1732e-01, 7.1909e-02, -3.6930e-01, 4.7641e-01, 1.7456e-01,\n",
" 3.2928e-01, 2.8792e-01, -7.6989e-02, 2.7030e-01, 6.9828e-01,\n",
" 4.6247e-01, 4.1444e-01, -5.3405e-01, 4.4302e-01, 1.1631e-01,\n",
" -2.3425e-01, -1.5030e-01, -6.8092e-02, 3.3537e-01, 2.8618e-01,\n",
" -3.9781e-02, 2.3245e-01, 3.6262e-01, -1.7151e-01, -3.5204e-01,\n",
" 1.9951e-01, 1.1345e-01, -4.5134e-01, -3.9699e-03, -2.0620e-01,\n",
" -4.9251e-02, 1.0825e-01, 1.2571e-01, -2.8134e-01, 1.0355e-01,\n",
" 7.3498e-02, -2.6716e-01, -1.0001e-01, -2.2600e-01, 3.0784e-01,\n",
" 2.5934e-01, -1.8112e-03, -2.0522e-01, -2.5115e-01, -1.5368e-01,\n",
" 5.6060e-02, -6.4802e-02, 9.2786e-03, 2.6150e-01, -9.3972e-02,\n",
" -3.1032e-01, -2.6632e-01, -1.9598e-01, -4.5088e-02, -2.7611e-02,\n",
" -7.7027e-02, 1.5070e-01, 1.7185e-01, -8.5416e-02, -1.4448e-01,\n",
" -2.4800e-03, -3.2881e-01, -1.6913e-01, -1.2778e-01, -2.3352e-01,\n",
" 1.5178e-01, -6.9358e-01, -3.8922e-01, 3.7190e-01, 2.6020e-01,\n",
" -1.0232e-01, -6.0247e-01, -5.4548e-02, 6.6532e-01, -7.3208e-02,\n",
" -2.3644e-01, -2.5550e-01, 1.9755e-02, -4.8908e-01, -7.3706e-02,\n",
" 3.0545e-01, 2.4459e-01, 2.0426e-01, -3.0128e-01, 6.0666e-02,\n",
" 1.8107e-02, -9.6162e-02, -2.0348e-02, -1.9801e-04, 2.9652e-02,\n",
" 5.0787e-01, -2.0225e-01, -6.1565e-02, -2.7330e-01, -3.7789e-01,\n",
" -2.4373e-01, 9.4902e-02, -3.7236e-01, -8.5854e-02, 2.4096e-01,\n",
" -1.7998e-01, 7.3902e-02, -7.8217e-04, -1.8559e-01, -2.6445e-01,\n",
" -2.3306e-02, -1.8644e-01, -1.0638e-01, 8.9330e-02, 4.1039e-01,\n",
" 1.0452e-02, -9.8721e-03, -1.8335e-01, -2.8524e-01, -1.4771e-01,\n",
" -1.9499e-01, -1.0175e-01, 1.2292e-01, 8.3651e-02, -2.1228e-01,\n",
" 3.4773e-02, 6.1831e-02, 2.9237e-01, 1.4371e-01, -9.2354e-02,\n",
" 8.1267e-03, 2.7648e-01, 2.1753e-01, 2.6609e-01, -3.6083e-01,\n",
" 2.8347e-01, -2.9295e-01, -2.6441e-01, 2.1056e-01, 3.2068e-01,\n",
" -1.6156e-01, 1.5298e-01, -1.5577e-01, 2.2035e-01, -1.1888e-01,\n",
" 1.3766e-01, -9.9048e-02, 4.1584e-01, -3.6029e-02, -6.2504e-02,\n",
" 3.3177e-01, -1.3997e-01, 8.7884e-02, -2.1428e-01, -6.2643e-01,\n",
" -3.1293e-01, -3.4895e-01, 5.2294e-01, -1.2635e-01, -1.9371e-01,\n",
" -2.0631e-01, 5.3758e-01, -1.1522e-01, -2.3659e-01, 2.0457e-01,\n",
" 1.9534e-01, 3.3260e-01, -2.2254e-01, 8.1346e-02, -7.2798e-02,\n",
" -8.6357e-04, -1.0199e-01, 3.1601e-01, 2.0040e-01, 1.9014e-01,\n",
" -9.6766e-02, 2.5155e-01, -2.0484e-01, -4.5859e-01, 1.1687e-01,\n",
" -3.3574e-01, -3.3371e-01, 8.6787e-02, 2.4920e-01, 6.5367e-02])"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"hello_vector"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "e8540b4b",
"metadata": {},
"outputs": [],
"source": [
"pretrained_embedding = vectors.get_vecs_by_tokens(vocab.get_itos())"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "9d31228e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"torch.Size([21526, 300])"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pretrained_embedding.shape"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "3a6f4173",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Parameter containing:\n",
"tensor([[-1.1258, -1.1524, -0.2506, ..., 0.8200, -0.6332, 1.2948],\n",
" [ 0.0000, 0.0000, 0.0000, ..., 0.0000, 0.0000, 0.0000],\n",
" [ 0.1483, 2.4187, 1.3279, ..., -1.0328, 1.1305, -0.5703],\n",
" ...,\n",
" [-0.9497, -1.5705, -0.5629, ..., -0.5853, 0.1596, -1.3159],\n",
" [ 0.6322, -0.5610, 0.4423, ..., -0.5541, -0.5787, -0.6026],\n",
" [ 1.1698, 0.1340, 1.5503, ..., 1.5039, -0.6415, 1.1412]],\n",
" requires_grad=True)"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.embedding.weight"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "5c1cbd5c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[ 0.0000, 0.0000, 0.0000, ..., 0.0000, 0.0000, 0.0000],\n",
" [ 0.0000, 0.0000, 0.0000, ..., 0.0000, 0.0000, 0.0000],\n",
" [-0.0653, -0.0930, -0.0176, ..., 0.1664, -0.1308, 0.0354],\n",
" ...,\n",
" [-0.1329, 0.2494, -0.3875, ..., 0.3734, 0.4520, -0.2060],\n",
" [-0.2301, -0.1799, -0.2485, ..., 0.5203, 0.6245, 0.1723],\n",
" [ 0.1161, -0.0390, 0.1120, ..., 0.0925, -0.1058, 0.5641]])"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pretrained_embedding"
]
},
{
"cell_type": "code",
"execution_count": 41,
"id": "6ea34c9b",
"metadata": {},
"outputs": [],
"source": [
"model.embedding.weight.data = pretrained_embedding"
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "1332d9a6",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Parameter containing:\n",
"tensor([[ 0.0000, 0.0000, 0.0000, ..., 0.0000, 0.0000, 0.0000],\n",
" [ 0.0000, 0.0000, 0.0000, ..., 0.0000, 0.0000, 0.0000],\n",
" [-0.0653, -0.0930, -0.0176, ..., 0.1664, -0.1308, 0.0354],\n",
" ...,\n",
" [-0.1329, 0.2494, -0.3875, ..., 0.3734, 0.4520, -0.2060],\n",
" [-0.2301, -0.1799, -0.2485, ..., 0.5203, 0.6245, 0.1723],\n",
" [ 0.1161, -0.0390, 0.1120, ..., 0.0925, -0.1058, 0.5641]],\n",
" requires_grad=True)"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.embedding.weight"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "4fcb95e0",
"metadata": {},
"outputs": [],
"source": [
"optimizer = optim.Adam(model.parameters())"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "f8829cd4",
"metadata": {},
"outputs": [],
"source": [
"criterion = nn.CrossEntropyLoss()"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "7ed273e0",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"device(type='cuda')"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
"\n",
"device"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "3cdaf3b3",
"metadata": {},
"outputs": [],
"source": [
"model = model.to(device)\n",
"criterion = criterion.to(device)"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "729aa9c8",
"metadata": {},
"outputs": [],
"source": [
"def train(dataloader, model, criterion, optimizer, device):\n",
"\n",
" model.train()\n",
" epoch_losses = []\n",
" epoch_accs = []\n",
"\n",
" for batch in tqdm.tqdm(dataloader, desc='training...', file=sys.stdout):\n",
" ids = batch['ids'].to(device)\n",
" label = batch['label'].to(device)\n",
" prediction = model(ids)\n",
" loss = criterion(prediction, label)\n",
" accuracy = get_accuracy(prediction, label)\n",
" optimizer.zero_grad()\n",
" loss.backward()\n",
" optimizer.step()\n",
" epoch_losses.append(loss.item())\n",
" epoch_accs.append(accuracy.item())\n",
"\n",
" return epoch_losses, epoch_accs"
]
},
{
"cell_type": "code",
"execution_count": 48,
"id": "e0a80c30",
"metadata": {},
"outputs": [],
"source": [
"def evaluate(dataloader, model, criterion, device):\n",
" \n",
" model.eval()\n",
" epoch_losses = []\n",
" epoch_accs = []\n",
"\n",
" with torch.no_grad():\n",
" for batch in tqdm.tqdm(dataloader, desc='evaluating...', file=sys.stdout):\n",
" ids = batch['ids'].to(device)\n",
" label = batch['label'].to(device)\n",
" prediction = model(ids)\n",
" loss = criterion(prediction, label)\n",
" accuracy = get_accuracy(prediction, label)\n",
" epoch_losses.append(loss.item())\n",
" epoch_accs.append(accuracy.item())\n",
"\n",
" return epoch_losses, epoch_accs"
]
},
{
"cell_type": "code",
"execution_count": 49,
"id": "703aa1e1",
"metadata": {},
"outputs": [],
"source": [
"def get_accuracy(prediction, label):\n",
" batch_size, _ = prediction.shape\n",
" predicted_classes = prediction.argmax(dim=-1)\n",
" correct_predictions = predicted_classes.eq(label).sum()\n",
" accuracy = correct_predictions / batch_size\n",
" return accuracy"
]
},
{
"cell_type": "code",
"execution_count": 50,
"id": "31343f1b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"training...: 100%|██████████| 37/37 [00:02<00:00, 15.43it/s]\n",
"evaluating...: 100%|██████████| 13/13 [00:00<00:00, 16.76it/s]\n",
"epoch: 1\n",
"train_loss: 0.681, train_acc: 0.625\n",
"valid_loss: 0.666, valid_acc: 0.704\n",
"training...: 100%|██████████| 37/37 [00:02<00:00, 15.49it/s]\n",
"evaluating...: 100%|██████████| 13/13 [00:00<00:00, 17.17it/s]\n",
"epoch: 2\n",
"train_loss: 0.645, train_acc: 0.721\n",
"valid_loss: 0.619, valid_acc: 0.739\n",
"training...: 100%|██████████| 37/37 [00:02<00:00, 15.24it/s]\n",
"evaluating...: 100%|██████████| 13/13 [00:00<00:00, 16.93it/s]\n",
"epoch: 3\n",
"train_loss: 0.586, train_acc: 0.761\n",
"valid_loss: 0.554, valid_acc: 0.777\n",
"training...: 100%|██████████| 37/37 [00:02<00:00, 15.52it/s]\n",
"evaluating...: 100%|██████████| 13/13 [00:00<00:00, 16.60it/s]\n",
"epoch: 4\n",
"train_loss: 0.514, train_acc: 0.810\n",
"valid_loss: 0.487, valid_acc: 0.819\n",
"training...: 100%|██████████| 37/37 [00:02<00:00, 15.56it/s]\n",
"evaluating...: 100%|██████████| 13/13 [00:00<00:00, 16.70it/s]\n",
"epoch: 5\n",
"train_loss: 0.445, train_acc: 0.846\n",
"valid_loss: 0.433, valid_acc: 0.843\n",
"training...: 100%|██████████| 37/37 [00:02<00:00, 15.24it/s]\n",
"evaluating...: 100%|██████████| 13/13 [00:00<00:00, 16.74it/s]\n",
"epoch: 6\n",
"train_loss: 0.389, train_acc: 0.870\n",
"valid_loss: 0.390, valid_acc: 0.857\n",
"training...: 100%|██████████| 37/37 [00:02<00:00, 15.61it/s]\n",
"evaluating...: 100%|██████████| 13/13 [00:00<00:00, 16.95it/s]\n",
"epoch: 7\n",
"train_loss: 0.346, train_acc: 0.884\n",
"valid_loss: 0.361, valid_acc: 0.863\n",
"training...: 100%|██████████| 37/37 [00:02<00:00, 15.37it/s]\n",
"evaluating...: 100%|██████████| 13/13 [00:00<00:00, 16.98it/s]\n",
"epoch: 8\n",
"train_loss: 0.312, train_acc: 0.896\n",
"valid_loss: 0.340, valid_acc: 0.870\n",
"training...: 100%|██████████| 37/37 [00:02<00:00, 15.57it/s]\n",
"evaluating...: 100%|██████████| 13/13 [00:00<00:00, 16.57it/s]\n",
"epoch: 9\n",
"train_loss: 0.286, train_acc: 0.907\n",
"valid_loss: 0.325, valid_acc: 0.875\n",
"training...: 100%|██████████| 37/37 [00:02<00:00, 15.31it/s]\n",
"evaluating...: 100%|██████████| 13/13 [00:00<00:00, 16.36it/s]\n",
"epoch: 10\n",
"train_loss: 0.262, train_acc: 0.915\n",
"valid_loss: 0.315, valid_acc: 0.877\n"
]
}
],
"source": [
"n_epochs = 10\n",
"best_valid_loss = float('inf')\n",
"\n",
"train_losses = []\n",
"train_accs = []\n",
"valid_losses = []\n",
"valid_accs = []\n",
"\n",
"for epoch in range(n_epochs):\n",
"\n",
" train_loss, train_acc = train(train_dataloader, model, criterion, optimizer, device)\n",
" valid_loss, valid_acc = evaluate(valid_dataloader, model, criterion, device)\n",
"\n",
" train_losses.extend(train_loss)\n",
" train_accs.extend(train_acc)\n",
" valid_losses.extend(valid_loss)\n",
" valid_accs.extend(valid_acc)\n",
" \n",
" epoch_train_loss = np.mean(train_loss)\n",
" epoch_train_acc = np.mean(train_acc)\n",
" epoch_valid_loss = np.mean(valid_loss)\n",
" epoch_valid_acc = np.mean(valid_acc)\n",
" \n",
" if epoch_valid_loss < best_valid_loss:\n",
" best_valid_loss = epoch_valid_loss\n",
" torch.save(model.state_dict(), 'nbow.pt')\n",
" \n",
" print(f'epoch: {epoch+1}')\n",
" print(f'train_loss: {epoch_train_loss:.3f}, train_acc: {epoch_train_acc:.3f}')\n",
" print(f'valid_loss: {epoch_valid_loss:.3f}, valid_acc: {epoch_valid_acc:.3f}')"
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "2d791c70",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAmEAAAFzCAYAAAB2A95GAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAACIk0lEQVR4nO3dd5xcdbn48c93et3eS7JppCdAQggdFKkCooIgIHZRuRbUn+j12q5e0Yt6r14bViyAiIigQBTpNSQhvbfNZjfbe5l+fn+cc6bszm52k52dLc/79cprZs+cM/PdyWzy7PN9vs9XaZqGEEIIIYSYWJZsD0AIIYQQYiaSIEwIIYQQIgskCBNCCCGEyAIJwoQQQgghskCCMCGEEEKILJAgTAghhBAiC2zZHsBYFRUVaTU1NdkehhBCCCHEcW3cuLFV07TidI9NuSCspqaGDRs2ZHsYQgghhBDHpZSqHe4xmY4UQgghhMgCCcKEEEIIIbJAgjAhhBBCiCyYcjVhQgghhBg/4XCYo0ePEggEsj2UKc3lclFVVYXdbh/1NRKECSGEEDPY0aNH8fv91NTUoJTK9nCmJE3TaGtr4+jRo8yZM2fU18l0pBBCCDGDBQIBCgsLJQA7CUopCgsLx5xNzGgQppS6TCm1Rym1Xyl1Z5rHv6+U2mz82auU6szkeIQQQggxlARgJ+9E3sOMBWFKKSvwI+ByYAlwo1JqSfI5mqZ9WtO0UzVNOxX4IfBwpsYjhBBCiMmns7OTH//4xyd07RVXXEFnZ+eoz//qV7/K3XfffUKvlQmZzIStAfZrmnZQ07QQ8ABwzQjn3wjcn8HxCCGEEGKSGSkIi0QiI177+OOPk5eXl4FRTYxMBmGVQF3S10eNY0MopWYDc4Cnh3n8w0qpDUqpDS0tLeM+UCGEEEJkx5133smBAwc49dRT+dznPsezzz7Leeedx9VXX82SJfoE2tve9jZWrVrF0qVLueeee+LX1tTU0NrayuHDh1m8eDEf+tCHWLp0KZdccgkDAwMjvu7mzZtZu3YtK1as4Nprr6WjowOAH/zgByxZsoQVK1Zwww03APDcc89x6qmncuqpp3LaaafR09MzLt/7ZFkdeQPwkKZp0XQPapp2D3APwOrVq7WJHJgQQggxU3ztsR3sbOge1+dcUpHDV65aOuzjd911F9u3b2fz5s0APPvss2zatInt27fHVxr+6le/oqCggIGBAc444wze8Y53UFhYmPI8+/bt4/777+fnP/85119/PX/+85+5+eabh33d97znPfzwhz/kggsu4Mtf/jJf+9rX+J//+R/uuusuDh06hNPpjE913n333fzoRz/inHPOobe3F5fLdXJviiGTmbB6oDrp6yrjWDo3MEmmIsPRGI9uaUDTJNYTQgghsmHNmjUprR5+8IMfsHLlStauXUtdXR379u0bcs2cOXM49dRTAVi1ahWHDx8e9vm7urro7OzkggsuAODWW2/l+eefB2DFihXcdNNN/P73v8dm03NV55xzDnfccQc/+MEP6OzsjB8/WZnMhL0OLFBKzUEPvm4A3j34JKXUIiAfeCWDYxm1v25u4LN/2oKmaVxzatrZUyGEEGJaGiljNZG8Xm/8/rPPPstTTz3FK6+8gsfj4cILL0zbCsLpdMbvW63W405HDufvf/87zz//PI899hjf/OY32bZtG3feeSdXXnkljz/+OOeccw7r1q1j0aJFJ/T8yTKWCdM0LQLcDqwDdgEPapq2Qyn1daXU1Umn3gA8oE2S1NO1p1WysiqX//zbTjr7Q9kejhBCCDGt+f3+EWusurq6yM/Px+PxsHv3bl599dWTfs3c3Fzy8/N54YUXAPjd737HBRdcQCwWo66ujosuuohvf/vbdHV10dvby4EDB1i+fDmf//znOeOMM9i9e/dJjwEyXBOmadrjwOODjn150NdfzeQYxspqUfzX25dz9f+9xDt/+gpXLCvjcFs/155WyUWLSgCIxjSsFumpIoQQQpyswsJCzjnnHJYtW8bll1/OlVdemfL4ZZddxk9/+lMWL17MwoULWbt27bi87r333sttt91Gf38/c+fO5de//jXRaJSbb76Zrq4uNE3jE5/4BHl5efzHf/wHzzzzDBaLhaVLl3L55ZePyxjUJElAjdrq1au1DRs2ZPx1/rWriW/+fRcHW/vIddvpGghTle/GbbdyoKWXNXMK+OC5czl3QREuuzXj4xFCCCEyYdeuXSxevDjbw5gW0r2XSqmNmqatTnf+ZFkdOem8eXEpFy4soS8UwWWz8sDrR9hwuIP+UIRzFxTx+LZjfPC3G/A7bbz3nBqOdQU41jXAzWfO5tKlZVgkUyaEEEKIEUgQNgKrRZHj0ndDf89ZNbznrJr4Y3devohXDrRx//oj/PDp/bjtVgp9Dj76h03MLfby/nPmcNXKCnLdQ3dTr+8c4HBrH+fML5qob0UIIYQQk4wEYSfIabNy4cISLlxYQm2bPmXpd9l5YvsxfvLsAb70yHa+9fguvnr1Ut65qiplT6kv/WUbz+9r5clPnseCUn8WvwshhBBCZEtGN/CeKWYXesnzOLBaFG9dUcHf/u1cHr39HJZW5vK5h7Zy3nee4b/X7aYnEKauvZ9n97YQjWnc9cT4rK4QQgghxNQjmbAMUEqxoiqP+z+0lj9vPMqTOxr50TMH+OPrR1lc7kcB7zlrNve+UstTO5u4eElpyvWxmEZPIEKuZ+hUphBCCCGmBwnCMshqUVx/RjXXn1HNlrpOvvrYDl7Y18rFi0v5whWL2VDbwR0PbubOyxfT0hPE7bCw9WgXLx9oo2sgzN/+7VzKc10cae9nRVVetr8dIYQQQowjmY6cICur8/jzbWfz6/eewTevXYbLbuWnN69CKcUX/7KN7z+1l/96fDevH27nwlOKsVoU968/wr/d/wbX/vhlNh3pyPa3IIQQQkwKPp8PgIaGBt75znemPefCCy8kXUur4Y5ng2TCJpDFouINXwGqCzz87d/OpScQYX6Jj4FQlBy3DaUUkZjGH1+vIxiJYbUoPvXAZv7jrUs4e14hXqf8tQkhhBAVFRU89NBD2R7GCZNMWJZVF3hYUpGDw2Yh12OPr6J81xnVBCMx8j12fv3eM2jpCfKh327g5l++RjQ2tRrsCiGEEMO58847+dGPfhT/+qtf/Sp33303vb29vPnNb+b0009n+fLl/PWvfx1y7eHDh1m2bBkAAwMD3HDDDSxevJhrr712VHtH3n///Sxfvpxly5bx+c9/HoBoNMp73/teli1bxvLly/n+978P6JuIL1myhBUrVnDDDTeMx7cumbDJ6qy5hZy3oIhLl5Zx/inFbPjSxfx501G+/Ncd/P7VWt65qordjT0U+RzMLvQSjESxWyzSJFYIIcSJe+JOaNw2vs9Zthwuv2vYh9/1rnfxqU99io9//OMAPPjgg6xbtw6Xy8Vf/vIXcnJyaG1tZe3atVx99dUpLZ+S/eQnP8Hj8bBr1y62bt3K6aefPuKwGhoa+PznP8/GjRvJz8/nkksu4ZFHHqG6upr6+nq2b98OQGdnJwB33XUXhw4dwul0xo+dLMmEZULLXuisO6mnsFgUv/vAmdy8djYAXqeNW9bO5tz5RXzl0R0s/co63vGTl3n3z1+jPxThov9+lv/+x57xGL0QQggxYU477TSam5tpaGhgy5Yt5OfnU11djaZpfPGLX2TFihVcfPHF1NfX09TUNOzzPP/889x8880ArFixghUrVoz4uq+//joXXnghxcXF2Gw2brrpJp5//nnmzp3LwYMH+bd/+zeefPJJcnJy4s9500038fvf/x6bbXxyWJIJG8nm++DQC3DtT0Z/jabBH94JFafB9feO63CUUvzvDafyp41HiWka/cEo//fMfu744xYaugL89uXD3HbBvLRd+oUQQojjGiFjlUnXXXcdDz30EI2NjbzrXe8C4A9/+AMtLS1s3LgRu91OTU0NgUAg42PJz89ny5YtrFu3jp/+9Kc8+OCD/OpXv+Lvf/87zz//PI899hjf/OY32bZt20kHY5IJG07zLnjsU7DlPmg7MPrr2g9CZy0EOjMyrEKfk9sumMfHLpzPJy9eQLHfyZM7GinNcdIXivLA+iMARKIxfvfKYe7442Z6gxEAgpEof3njKA2dx58nF0IIISbKu971Lh544AEeeughrrvuOgC6urooKSnBbrfzzDPPUFtbO+JznH/++dx3330AbN++na1bt454/po1a3juuedobW0lGo1y//33c8EFF9Da2kosFuMd73gH3/jGN9i0aROxWIy6ujouuugivv3tb9PV1UVvb+9Jf9+SCRssGoFdj8LT/wk2F0SDsP8pKJyX5tww7H0SWvfBKZdC6VI4+Kz+WKg/40O1Wy3ccEY1P3x6P3e85RT+urmBnz1/kDlFXn7w9D6213cD0BOM8LObV/GnDUf50iP6HPc3r13GTWfOzvgYhRBCiONZunQpPT09VFZWUl5eDsBNN93EVVddxfLly1m9ejWLFi0a8Tk++tGP8r73vY/FixezePFiVq1aNeL55eXl3HXXXVx00UVomsaVV17JNddcw5YtW3jf+95HLBYD4Fvf+hbRaJSbb76Zrq4uNE3jE5/4BHl5eSf9fStNm1or7VavXq1ltL/H5vvgkY9CwTy4+gfw2CchvwZu/jPsXQf7/gHn3gHuPHjwVtj/T/06Zw7c8gi8/L+w869Qugw++lLmxmno6g/zh/W1fODcOdS1D3Drr9ZT3zmA32Xj2+9YQXN3gK8+tpNvvG0Zz+5pZtcxvZi/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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize=(10,6))\n",
"ax = fig.add_subplot(1,1,1)\n",
"ax.plot(train_losses, label='train loss')\n",
"ax.plot(valid_losses, label='valid loss')\n",
"plt.legend()\n",
"ax.set_xlabel('updates')\n",
"ax.set_ylabel('loss');"
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "bc422190",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize=(10,6))\n",
"ax = fig.add_subplot(1,1,1)\n",
"ax.plot(train_accs, label='train accuracy')\n",
"ax.plot(valid_accs, label='valid accuracy')\n",
"plt.legend()\n",
"ax.set_xlabel('updates')\n",
"ax.set_ylabel('accuracy');"
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "cac26e8e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"evaluating...: 100%|██████████| 49/49 [00:03<00:00, 15.72it/s]\n",
"test_loss: 0.359, test_acc: 0.854\n"
]
}
],
"source": [
"model.load_state_dict(torch.load('nbow.pt'))\n",
"\n",
"test_loss, test_acc = evaluate(test_dataloader, model, criterion, device)\n",
"\n",
"epoch_test_loss = np.mean(test_loss)\n",
"epoch_test_acc = np.mean(test_acc)\n",
"\n",
"print(f'test_loss: {epoch_test_loss:.3f}, test_acc: {epoch_test_acc:.3f}')"
]
},
{
"cell_type": "code",
"execution_count": 54,
"id": "b22e040a",
"metadata": {},
"outputs": [],
"source": [
"def predict_sentiment(text, model, tokenizer, vocab, device):\n",
" tokens = tokenizer(text)\n",
" ids = [vocab[t] for t in tokens]\n",
" tensor = torch.LongTensor(ids).unsqueeze(dim=0).to(device)\n",
" prediction = model(tensor).squeeze(dim=0)\n",
" probability = torch.softmax(prediction, dim=-1)\n",
" predicted_class = prediction.argmax(dim=-1).item()\n",
" predicted_probability = probability[predicted_class].item()\n",
" return predicted_class, predicted_probability"
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "9cfa14eb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0, 0.9999850988388062)"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"text = \"This film is terrible!\"\n",
"\n",
"predict_sentiment(text, model, tokenizer, vocab, device)"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "1da60d90",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1, 0.9999994039535522)"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"text = \"This film is great!\"\n",
"\n",
"predict_sentiment(text, model, tokenizer, vocab, device)"
]
},
{
"cell_type": "code",
"execution_count": 57,
"id": "4bee6190",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1, 0.6572516560554504)"
]
},
"execution_count": 57,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"text = \"This film is not terrible, it's great!\"\n",
"\n",
"predict_sentiment(text, model, tokenizer, vocab, device)"
]
},
{
"cell_type": "code",
"execution_count": 58,
"id": "e3d55c92",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(1, 0.6572516560554504)"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"text = \"This film is not great, it's terrible!\"\n",
"\n",
"predict_sentiment(text, model, tokenizer, vocab, device)"
]
}
],
"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.9.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}