663 lines
19 KiB
Plaintext
663 lines
19 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Deep Learning Models -- A collection of various deep learning architectures, models, and tips for TensorFlow and PyTorch in Jupyter Notebooks.\n",
|
|
"- Author: Sebastian Raschka\n",
|
|
"- GitHub Repository: https://github.com/rasbt/deeplearning-models"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"colab_type": "text",
|
|
"id": "vY4SK0xKAJgm"
|
|
},
|
|
"source": [
|
|
"# Model Zoo -- RNN with LSTM"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"colab_type": "text",
|
|
"id": "sc6xejhY-NzZ"
|
|
},
|
|
"source": [
|
|
"Demo of a simple RNN for sentiment classification (here: a binary classification problem with two labels, positive and negative) using LSTM (Long Short Term Memory) cells."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {
|
|
"colab": {},
|
|
"colab_type": "code",
|
|
"id": "moNmVfuvnImW"
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Sebastian Raschka \n",
|
|
"\n",
|
|
"CPython 3.7.1\n",
|
|
"IPython 7.4.0\n",
|
|
"\n",
|
|
"torch 1.0.1.post2\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"%load_ext watermark\n",
|
|
"%watermark -a 'Sebastian Raschka' -v -p torch\n",
|
|
"\n",
|
|
"import torch\n",
|
|
"import torch.nn.functional as F\n",
|
|
"from torchtext import data\n",
|
|
"from torchtext import datasets\n",
|
|
"import time\n",
|
|
"import random\n",
|
|
"\n",
|
|
"torch.backends.cudnn.deterministic = True"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"colab_type": "text",
|
|
"id": "GSRL42Qgy8I8"
|
|
},
|
|
"source": [
|
|
"## General Settings"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {
|
|
"colab": {},
|
|
"colab_type": "code",
|
|
"id": "OvW1RgfepCBq"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"RANDOM_SEED = 123\n",
|
|
"torch.manual_seed(RANDOM_SEED)\n",
|
|
"\n",
|
|
"VOCABULARY_SIZE = 20000\n",
|
|
"LEARNING_RATE = 1e-4\n",
|
|
"BATCH_SIZE = 128\n",
|
|
"NUM_EPOCHS = 15\n",
|
|
"DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
|
|
"\n",
|
|
"EMBEDDING_DIM = 128\n",
|
|
"HIDDEN_DIM = 256\n",
|
|
"OUTPUT_DIM = 1"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"colab_type": "text",
|
|
"id": "mQMmKUEisW4W"
|
|
},
|
|
"source": [
|
|
"## Dataset"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"colab_type": "text",
|
|
"id": "4GnH64XvsV8n"
|
|
},
|
|
"source": [
|
|
"Load the IMDB Movie Review dataset:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 68
|
|
},
|
|
"colab_type": "code",
|
|
"id": "WZ_4jiHVnMxN",
|
|
"outputId": "dfa51c04-4845-44c3-f50b-d36d41f132b8"
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Num Train: 20000\n",
|
|
"Num Valid: 5000\n",
|
|
"Num Test: 25000\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"TEXT = data.Field(tokenize='spacy',\n",
|
|
" include_lengths=True) # necessary for packed_padded_sequence\n",
|
|
"LABEL = data.LabelField(dtype=torch.float)\n",
|
|
"train_data, test_data = datasets.IMDB.splits(TEXT, LABEL)\n",
|
|
"train_data, valid_data = train_data.split(random_state=random.seed(RANDOM_SEED),\n",
|
|
" split_ratio=0.8)\n",
|
|
"\n",
|
|
"print(f'Num Train: {len(train_data)}')\n",
|
|
"print(f'Num Valid: {len(valid_data)}')\n",
|
|
"print(f'Num Test: {len(test_data)}')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"colab_type": "text",
|
|
"id": "L-TBwKWPslPa"
|
|
},
|
|
"source": [
|
|
"Build the vocabulary based on the top \"VOCABULARY_SIZE\" words:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 51
|
|
},
|
|
"colab_type": "code",
|
|
"id": "e8uNrjdtn4A8",
|
|
"outputId": "6cf499d7-7722-4da0-8576-ee0f218cc6e3"
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Vocabulary size: 20002\n",
|
|
"Number of classes: 2\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"TEXT.build_vocab(train_data, max_size=VOCABULARY_SIZE)\n",
|
|
"LABEL.build_vocab(train_data)\n",
|
|
"\n",
|
|
"print(f'Vocabulary size: {len(TEXT.vocab)}')\n",
|
|
"print(f'Number of classes: {len(LABEL.vocab)}')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"colab_type": "text",
|
|
"id": "JpEMNInXtZsb"
|
|
},
|
|
"source": [
|
|
"The TEXT.vocab dictionary will contain the word counts and indices. The reason why the number of words is VOCABULARY_SIZE + 2 is that it contains to special tokens for padding and unknown words: `<unk>` and `<pad>`."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"colab_type": "text",
|
|
"id": "eIQ_zfKLwjKm"
|
|
},
|
|
"source": [
|
|
"Make dataset iterators:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"colab": {},
|
|
"colab_type": "code",
|
|
"id": "i7JiHR1stHNF"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"train_loader, valid_loader, test_loader = data.BucketIterator.splits(\n",
|
|
" (train_data, valid_data, test_data), \n",
|
|
" batch_size=BATCH_SIZE,\n",
|
|
" sort_within_batch=True, # necessary for packed_padded_sequence\n",
|
|
" device=DEVICE)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"colab_type": "text",
|
|
"id": "R0pT_dMRvicQ"
|
|
},
|
|
"source": [
|
|
"Testing the iterators (note that the number of rows depends on the longest document in the respective batch):"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 204
|
|
},
|
|
"colab_type": "code",
|
|
"id": "y8SP_FccutT0",
|
|
"outputId": "fe33763a-4560-4dee-adee-31cc6c48b0b2"
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Train\n",
|
|
"Text matrix size: torch.Size([132, 128])\n",
|
|
"Target vector size: torch.Size([128])\n",
|
|
"\n",
|
|
"Valid:\n",
|
|
"Text matrix size: torch.Size([61, 128])\n",
|
|
"Target vector size: torch.Size([128])\n",
|
|
"\n",
|
|
"Test:\n",
|
|
"Text matrix size: torch.Size([42, 128])\n",
|
|
"Target vector size: torch.Size([128])\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print('Train')\n",
|
|
"for batch in train_loader:\n",
|
|
" print(f'Text matrix size: {batch.text[0].size()}')\n",
|
|
" print(f'Target vector size: {batch.label.size()}')\n",
|
|
" break\n",
|
|
" \n",
|
|
"print('\\nValid:')\n",
|
|
"for batch in valid_loader:\n",
|
|
" print(f'Text matrix size: {batch.text[0].size()}')\n",
|
|
" print(f'Target vector size: {batch.label.size()}')\n",
|
|
" break\n",
|
|
" \n",
|
|
"print('\\nTest:')\n",
|
|
"for batch in test_loader:\n",
|
|
" print(f'Text matrix size: {batch.text[0].size()}')\n",
|
|
" print(f'Target vector size: {batch.label.size()}')\n",
|
|
" break"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"colab_type": "text",
|
|
"id": "G_grdW3pxCzz"
|
|
},
|
|
"source": [
|
|
"## Model"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"colab": {},
|
|
"colab_type": "code",
|
|
"id": "nQIUm5EjxFNa"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"import torch.nn as nn\n",
|
|
"\n",
|
|
"class RNN(nn.Module):\n",
|
|
" def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim):\n",
|
|
" \n",
|
|
" super().__init__()\n",
|
|
" \n",
|
|
" self.embedding = nn.Embedding(input_dim, embedding_dim)\n",
|
|
" self.rnn = nn.LSTM(embedding_dim, hidden_dim)\n",
|
|
" self.fc = nn.Linear(hidden_dim, output_dim)\n",
|
|
" \n",
|
|
" def forward(self, text, text_length):\n",
|
|
"\n",
|
|
" #[sentence len, batch size] => [sentence len, batch size, embedding size]\n",
|
|
" embedded = self.embedding(text)\n",
|
|
" \n",
|
|
" packed = torch.nn.utils.rnn.pack_padded_sequence(embedded, text_length)\n",
|
|
" \n",
|
|
" #[sentence len, batch size, embedding size] => \n",
|
|
" # output: [sentence len, batch size, hidden size]\n",
|
|
" # hidden: [1, batch size, hidden size]\n",
|
|
" packed_output, (hidden, cell) = self.rnn(packed)\n",
|
|
" \n",
|
|
" return self.fc(hidden.squeeze(0)).view(-1)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"colab": {},
|
|
"colab_type": "code",
|
|
"id": "Ik3NF3faxFmZ"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"INPUT_DIM = len(TEXT.vocab)\n",
|
|
"\n",
|
|
"torch.manual_seed(RANDOM_SEED)\n",
|
|
"model = RNN(INPUT_DIM, EMBEDDING_DIM, HIDDEN_DIM, OUTPUT_DIM)\n",
|
|
"model = model.to(DEVICE)\n",
|
|
"optimizer = torch.optim.Adam(model.parameters(), lr=LEARNING_RATE)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"colab_type": "text",
|
|
"id": "Lv9Ny9di6VcI"
|
|
},
|
|
"source": [
|
|
"## Training"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"colab": {},
|
|
"colab_type": "code",
|
|
"id": "T5t1Afn4xO11"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def compute_binary_accuracy(model, data_loader, device):\n",
|
|
" model.eval()\n",
|
|
" correct_pred, num_examples = 0, 0\n",
|
|
" with torch.no_grad():\n",
|
|
" for batch_idx, batch_data in enumerate(data_loader):\n",
|
|
" text, text_lengths = batch_data.text\n",
|
|
" logits = model(text, text_lengths)\n",
|
|
" predicted_labels = (torch.sigmoid(logits) > 0.5).long()\n",
|
|
" num_examples += batch_data.label.size(0)\n",
|
|
" correct_pred += (predicted_labels == batch_data.label.long()).sum()\n",
|
|
" return correct_pred.float()/num_examples * 100"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 1836
|
|
},
|
|
"colab_type": "code",
|
|
"id": "EABZM8Vo0ilB",
|
|
"outputId": "5d45e293-9909-4588-e793-8dfaf72e5c67"
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Epoch: 001/015 | Batch 000/157 | Cost: 0.6972\n",
|
|
"Epoch: 001/015 | Batch 050/157 | Cost: 0.6909\n",
|
|
"Epoch: 001/015 | Batch 100/157 | Cost: 0.6553\n",
|
|
"Epoch: 001/015 | Batch 150/157 | Cost: 0.6864\n",
|
|
"training accuracy: 56.65%\n",
|
|
"valid accuracy: 55.64%\n",
|
|
"Time elapsed: 0.20 min\n",
|
|
"Epoch: 002/015 | Batch 000/157 | Cost: 0.6789\n",
|
|
"Epoch: 002/015 | Batch 050/157 | Cost: 0.6697\n",
|
|
"Epoch: 002/015 | Batch 100/157 | Cost: 0.6930\n",
|
|
"Epoch: 002/015 | Batch 150/157 | Cost: 0.5950\n",
|
|
"training accuracy: 70.94%\n",
|
|
"valid accuracy: 68.86%\n",
|
|
"Time elapsed: 0.40 min\n",
|
|
"Epoch: 003/015 | Batch 000/157 | Cost: 0.5875\n",
|
|
"Epoch: 003/015 | Batch 050/157 | Cost: 0.5534\n",
|
|
"Epoch: 003/015 | Batch 100/157 | Cost: 0.5670\n",
|
|
"Epoch: 003/015 | Batch 150/157 | Cost: 0.5401\n",
|
|
"training accuracy: 76.60%\n",
|
|
"valid accuracy: 74.20%\n",
|
|
"Time elapsed: 0.61 min\n",
|
|
"Epoch: 004/015 | Batch 000/157 | Cost: 0.5148\n",
|
|
"Epoch: 004/015 | Batch 050/157 | Cost: 0.4547\n",
|
|
"Epoch: 004/015 | Batch 100/157 | Cost: 0.3845\n",
|
|
"Epoch: 004/015 | Batch 150/157 | Cost: 0.5098\n",
|
|
"training accuracy: 77.66%\n",
|
|
"valid accuracy: 75.26%\n",
|
|
"Time elapsed: 0.81 min\n",
|
|
"Epoch: 005/015 | Batch 000/157 | Cost: 0.5615\n",
|
|
"Epoch: 005/015 | Batch 050/157 | Cost: 0.5186\n",
|
|
"Epoch: 005/015 | Batch 100/157 | Cost: 0.4011\n",
|
|
"Epoch: 005/015 | Batch 150/157 | Cost: 0.4483\n",
|
|
"training accuracy: 81.81%\n",
|
|
"valid accuracy: 78.86%\n",
|
|
"Time elapsed: 1.01 min\n",
|
|
"Epoch: 006/015 | Batch 000/157 | Cost: 0.4537\n",
|
|
"Epoch: 006/015 | Batch 050/157 | Cost: 0.3716\n",
|
|
"Epoch: 006/015 | Batch 100/157 | Cost: 0.4334\n",
|
|
"Epoch: 006/015 | Batch 150/157 | Cost: 0.4001\n",
|
|
"training accuracy: 84.19%\n",
|
|
"valid accuracy: 80.74%\n",
|
|
"Time elapsed: 1.21 min\n",
|
|
"Epoch: 007/015 | Batch 000/157 | Cost: 0.4492\n",
|
|
"Epoch: 007/015 | Batch 050/157 | Cost: 0.3247\n",
|
|
"Epoch: 007/015 | Batch 100/157 | Cost: 0.3440\n",
|
|
"Epoch: 007/015 | Batch 150/157 | Cost: 0.3697\n",
|
|
"training accuracy: 83.55%\n",
|
|
"valid accuracy: 79.66%\n",
|
|
"Time elapsed: 1.42 min\n",
|
|
"Epoch: 008/015 | Batch 000/157 | Cost: 0.2940\n",
|
|
"Epoch: 008/015 | Batch 050/157 | Cost: 0.3265\n",
|
|
"Epoch: 008/015 | Batch 100/157 | Cost: 0.3049\n",
|
|
"Epoch: 008/015 | Batch 150/157 | Cost: 0.3400\n",
|
|
"training accuracy: 86.76%\n",
|
|
"valid accuracy: 82.12%\n",
|
|
"Time elapsed: 1.62 min\n",
|
|
"Epoch: 009/015 | Batch 000/157 | Cost: 0.2958\n",
|
|
"Epoch: 009/015 | Batch 050/157 | Cost: 0.3533\n",
|
|
"Epoch: 009/015 | Batch 100/157 | Cost: 0.2699\n",
|
|
"Epoch: 009/015 | Batch 150/157 | Cost: 0.2683\n",
|
|
"training accuracy: 87.47%\n",
|
|
"valid accuracy: 82.54%\n",
|
|
"Time elapsed: 1.83 min\n",
|
|
"Epoch: 010/015 | Batch 000/157 | Cost: 0.2973\n",
|
|
"Epoch: 010/015 | Batch 050/157 | Cost: 0.3219\n",
|
|
"Epoch: 010/015 | Batch 100/157 | Cost: 0.3581\n",
|
|
"Epoch: 010/015 | Batch 150/157 | Cost: 0.3248\n",
|
|
"training accuracy: 88.67%\n",
|
|
"valid accuracy: 83.74%\n",
|
|
"Time elapsed: 2.03 min\n",
|
|
"Epoch: 011/015 | Batch 000/157 | Cost: 0.2911\n",
|
|
"Epoch: 011/015 | Batch 050/157 | Cost: 0.2136\n",
|
|
"Epoch: 011/015 | Batch 100/157 | Cost: 0.2336\n",
|
|
"Epoch: 011/015 | Batch 150/157 | Cost: 0.3212\n",
|
|
"training accuracy: 89.18%\n",
|
|
"valid accuracy: 83.18%\n",
|
|
"Time elapsed: 2.24 min\n",
|
|
"Epoch: 012/015 | Batch 000/157 | Cost: 0.2286\n",
|
|
"Epoch: 012/015 | Batch 050/157 | Cost: 0.3090\n",
|
|
"Epoch: 012/015 | Batch 100/157 | Cost: 0.2554\n",
|
|
"Epoch: 012/015 | Batch 150/157 | Cost: 0.4428\n",
|
|
"training accuracy: 79.32%\n",
|
|
"valid accuracy: 74.56%\n",
|
|
"Time elapsed: 2.44 min\n",
|
|
"Epoch: 013/015 | Batch 000/157 | Cost: 0.5185\n",
|
|
"Epoch: 013/015 | Batch 050/157 | Cost: 0.3759\n",
|
|
"Epoch: 013/015 | Batch 100/157 | Cost: 0.1717\n",
|
|
"Epoch: 013/015 | Batch 150/157 | Cost: 0.3041\n",
|
|
"training accuracy: 89.85%\n",
|
|
"valid accuracy: 83.68%\n",
|
|
"Time elapsed: 2.65 min\n",
|
|
"Epoch: 014/015 | Batch 000/157 | Cost: 0.2959\n",
|
|
"Epoch: 014/015 | Batch 050/157 | Cost: 0.3061\n",
|
|
"Epoch: 014/015 | Batch 100/157 | Cost: 0.2205\n",
|
|
"Epoch: 014/015 | Batch 150/157 | Cost: 0.2831\n",
|
|
"training accuracy: 90.34%\n",
|
|
"valid accuracy: 84.36%\n",
|
|
"Time elapsed: 2.86 min\n",
|
|
"Epoch: 015/015 | Batch 000/157 | Cost: 0.2300\n",
|
|
"Epoch: 015/015 | Batch 050/157 | Cost: 0.1979\n",
|
|
"Epoch: 015/015 | Batch 100/157 | Cost: 0.2255\n",
|
|
"Epoch: 015/015 | Batch 150/157 | Cost: 0.3355\n",
|
|
"training accuracy: 91.80%\n",
|
|
"valid accuracy: 84.16%\n",
|
|
"Time elapsed: 3.07 min\n",
|
|
"Total Training Time: 3.07 min\n",
|
|
"Test accuracy: 85.08%\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"start_time = time.time()\n",
|
|
"\n",
|
|
"for epoch in range(NUM_EPOCHS):\n",
|
|
" model.train()\n",
|
|
" for batch_idx, batch_data in enumerate(train_loader):\n",
|
|
" \n",
|
|
" text, text_lengths = batch_data.text\n",
|
|
" \n",
|
|
" ### FORWARD AND BACK PROP\n",
|
|
" logits = model(text, text_lengths)\n",
|
|
" cost = F.binary_cross_entropy_with_logits(logits, batch_data.label)\n",
|
|
" optimizer.zero_grad()\n",
|
|
" \n",
|
|
" cost.backward()\n",
|
|
" \n",
|
|
" ### UPDATE MODEL PARAMETERS\n",
|
|
" optimizer.step()\n",
|
|
" \n",
|
|
" ### LOGGING\n",
|
|
" if not batch_idx % 50:\n",
|
|
" print (f'Epoch: {epoch+1:03d}/{NUM_EPOCHS:03d} | '\n",
|
|
" f'Batch {batch_idx:03d}/{len(train_loader):03d} | '\n",
|
|
" f'Cost: {cost:.4f}')\n",
|
|
"\n",
|
|
" with torch.set_grad_enabled(False):\n",
|
|
" print(f'training accuracy: '\n",
|
|
" f'{compute_binary_accuracy(model, train_loader, DEVICE):.2f}%'\n",
|
|
" f'\\nvalid accuracy: '\n",
|
|
" f'{compute_binary_accuracy(model, valid_loader, DEVICE):.2f}%')\n",
|
|
" \n",
|
|
" print(f'Time elapsed: {(time.time() - start_time)/60:.2f} min')\n",
|
|
" \n",
|
|
"print(f'Total Training Time: {(time.time() - start_time)/60:.2f} min')\n",
|
|
"print(f'Test accuracy: {compute_binary_accuracy(model, test_loader, DEVICE):.2f}%')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"colab": {},
|
|
"colab_type": "code",
|
|
"id": "jt55pscgFdKZ"
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"import spacy\n",
|
|
"nlp = spacy.load('en')\n",
|
|
"\n",
|
|
"def predict_sentiment(model, sentence):\n",
|
|
" # based on:\n",
|
|
" # https://github.com/bentrevett/pytorch-sentiment-analysis/blob/\n",
|
|
" # master/2%20-%20Upgraded%20Sentiment%20Analysis.ipynb\n",
|
|
" model.eval()\n",
|
|
" tokenized = [tok.text for tok in nlp.tokenizer(sentence)]\n",
|
|
" indexed = [TEXT.vocab.stoi[t] for t in tokenized]\n",
|
|
" length = [len(indexed)]\n",
|
|
" tensor = torch.LongTensor(indexed).to(DEVICE)\n",
|
|
" tensor = tensor.unsqueeze(1)\n",
|
|
" length_tensor = torch.LongTensor(length)\n",
|
|
" prediction = torch.sigmoid(model(tensor, length_tensor))\n",
|
|
" return prediction.item()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/",
|
|
"height": 51
|
|
},
|
|
"colab_type": "code",
|
|
"id": "O4__q0coFJyw",
|
|
"outputId": "1a7f84ba-a977-455e-e248-3b7036d496d0"
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Probability positive:\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"0.8133572340011597"
|
|
]
|
|
},
|
|
"execution_count": 12,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"print('Probability positive:')\n",
|
|
"predict_sentiment(model, \"I really love this movie. This movie is so great!\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"colab": {},
|
|
"colab_type": "code",
|
|
"id": "7lRusB3dF80X"
|
|
},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"metadata": {
|
|
"colab": {
|
|
"collapsed_sections": [],
|
|
"name": "rnn_lstm_packed_imdb.ipynb",
|
|
"provenance": [],
|
|
"version": "0.3.2"
|
|
},
|
|
"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.1"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|