PyTorch 0.4.1 examples (コード解説) : テキスト分類 – IMDB (RNN)

PyTorch 0.4.1 examples (コード解説) : テキスト分類 – IMDB (RNN)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 08/12/2018 (0.4.1)

* 本ページは、github 上の以下の pytorch/examples と keras/examples レポジトリのサンプル・コードを参考にしています:

* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

PyTorch RNN によるセンチメント解析

PyTorch 0.4.x の自作のサンプルをコードの簡単な解説とともに提供しています。
初級チュートリアル程度の知識は仮定しています。

基本的な ConvNet をウォークスルーしたので、次に IMDB を題材にして RNN を扱ってみます。

 

IMDB データセット

手慣れているので Keras からデータセットをロードします :

from keras.datasets import imdb

(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=VOCAB_SIZE)

from keras.preprocessing import sequence

x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)

x_train = x_train.astype('long')
x_test = x_test.astype('long')

次に PyTorch のデータセットとしてラップします :

import torch
import torch.utils.data as data

ds_train = data.TensorDataset(torch.from_numpy(x_train), torch.from_numpy(y_train))
ds_test  = data.TensorDataset(torch.from_numpy(x_test), torch.from_numpy(y_test))

dataloader_train = data.DataLoader(ds_train, batch_size=BATCH_SIZE, shuffle=True)
dataloader_test  = data.DataLoader(ds_test, batch_size=BATCH_SIZE, shuffle=False)

 

RNN モデル

今回は最も単純なモデルを使用します :

class Net(nn.Module):
    def __init__(self):
        super().__init__()

        self.embedding = nn.Embedding(VOCAB_SIZE, EMBEDDING_DIM)
        self.rnn = nn.RNN(input_size=EMBEDDING_DIM,  hidden_size=LSTM_HIDDEN_DIM, batch_first=True)
        self.fc = nn.Linear(LSTM_HIDDEN_DIM, 2)

    def forward(self, x):
        embedded = self.embedding(x)
        output, hidden = self.rnn(embedded)
        return self.fc(hidden.squeeze(0))

 

訓練と評価

CrossEntropyLoss

損失関数として CrossEntropyLoss を使用して 100 エポックの訓練で検証精度 74.47 % が得られました :

BCEWithLogitsLoss

損失関数として BCEWithLogitsLoss を使用した場合でも 74.42 % が得られました :

 

以上