どん底から這い上がるまでの記録

どん底から這い上がりたいけど這い上がれない人がいろいろ書くブログ(主にプログラミング)

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

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