PyTorch v0.4 導入

f:id:pytry3g:20180427231123j:plain

最近、PyTorchのversionが0.4になったみたい。

さらにWindowsも公式からインストールできるようになったらしい。

なので、今回インストールから簡単なプログラムを動かすまでをやってみようと思います。

インストール

インストールはここからー> http://pytorch.org/

自分の環境にあわせてインストール。

簡単なプログラム

今回はシンプルにアイリスの分類をやってみます。

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as O
from sklearn import datasets
from sklearn.utils import shuffle
from sklearn.model_selection import train_test_split

# データの用意
iris = datasets.load_iris()
data = iris.data
target = iris.target
train_x, test_x, train_t, test_t = train_test_split(data, target, test_size=0.1)

class NN(nn.Module):
    def __init__(self):
        super(NN, self).__init__()
        self.layer = nn.Linear(4, 3)

    def forward(self, x):
        return self.layer(x)


model = NN()
optimizer = O.Adam(model.parameters(), lr=0.1)
criterion = nn.CrossEntropyLoss()

for _ in range(40):
    train_x, train_t = shuffle(train_x, train_t)
    for i in range(0, len(train_x), 30):
        x = torch.tensor(train_x[i:i+30], dtype=torch.float)
        t = torch.tensor(train_t[i:i+30], dtype=torch.long)
        optimizer.zero_grad()
        y = model(x)
        loss = criterion(y, t)
        loss.backward()
        optimizer.step()

tensor = torch.tensor(test_x, dtype=torch.float, requires_grad=False)
result = model(tensor)
# モデルがテストデータを予測した結果
predicted = torch.max(result, 1)[1]
# 正解データ
label = torch.tensor(test_t, dtype=torch.long)
print("Accuray: {:.2f}".format((predicted == label).sum().item() / len(label)))

変わったところ

tensorとVariableの統合

今までだと

x = Variable(torch.FloatTensor(train_x[i:i+30]))
t = Variable(torch.LongTensor(train_x[i:i+30])

これが、こんな感じに。

x = torch.tensor(train_x[i:i+30], dtype=torch.float)
t = torch.tensor(train_t[i:i+30], dtype=torch.long)

item()

今まではlossの中身を取り出すのはloss.data[0]みたいにしていたが、

v0.4からはloss.item()で取り出せる。

他の例

tensor = torch.tensor([1, 2, 3])
print(tensor.sum())
# tensor(6)
print(tensor.sum().item())
# 6

とりあえず、今はここまで。