メモ。
以下のurlにて、自身の環境に応じたインストール方法を、コマンドライン・レベルで示されます。
今回は、ソースからインストールですので、以下のようになります。
$ git clone --recursive https://github.com/pytorch/pytorch $ cd pytorch $ git submodule sync $ git submodule update --init --recursive $ curl -kL https://bootstrap.pypa.io/get-pip.py | sudo /usr/local/python3/bin/python3 $ sudo /usr/local/python3/bin/pip install pyyaml # 私の手元環境では、3-4h程、要しました $ sudo /usr/local/python3/bin/python3 setup.py install # 追加でtorchvisionも $ sudo /usr/local/python3/bin/pip install torchvision
#!/usr/local/python3/bin/python3 # -*- coding: utf-8 -*- from __future__ import print_function import getopt import sys import torch def main(): x = torch.rand(5, 3) print(x) if __name__ == '__main__': main()
↑こう書くと、↓こう出力されます
[end0tknr@cent80 tmp]$ ./foo.py
tensor([[0.0855, 0.8716, 0.3512],
[0.7714, 0.7623, 0.8344],
[0.8667, 0.1638, 0.0306],
[0.8024, 0.4010, 0.4024],
[0.9326, 0.5903, 0.6700]])
更にネットワーク定義(nn)は、次のように複数の書き方があります
#!/usr/local/python3/bin/python3
# -*- coding: utf-8 -*-
import torch
import torchvision
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import torchvision.transforms as transforms
import numpy as np
from matplotlib import pyplot as plt
def main():
print(make_nn_model_1())
print(make_nn_model_2())
print(make_nn_model_3())
print(make_nn_model_4())
print(make_nn_model_5())
print(make_nn_model_6())
def make_nn_model_1():
model = nn.Sequential(
nn.Conv2d(1,20,5),
nn.ReLU(),
nn.Conv2d(20,64,5),
nn.ReLU()
)
return model
def make_nn_model_2():
model = torch.nn.Sequential()
model.add_module("conv1", nn.Conv2d(1,20,5))
model.add_module("relu1", nn.ReLU())
model.add_module("conv2", nn.Conv2d(20,64,5))
model.add_module("relu2", nn.ReLU())
model
return model
def make_nn_model_3():
from collections import OrderedDict
model = nn.Sequential(OrderedDict([
('conv1', nn.Conv2d(1,20,5)),
('relu1', nn.ReLU()),
('conv2', nn.Conv2d(20,64,5)),
('relu2', nn.ReLU())
]))
return model
def make_nn_model_4():
import torch.nn as nn
import torch.nn.functional as F
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.conv1 = nn.Conv2d(1, 20, 5)
self.conv2 = nn.Conv2d(20, 64, 5)
def forward(self, x):
x = F.relu(self.conv1(x))
return F.relu(self.conv2(x))
model = Model()
return model
def make_nn_model_5():
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.convs = nn.ModuleList([nn.Conv2d(1, 20, 5), nn.Conv2d(20, 64, 5)])
def forward(self, x):
for i, l in enumerate(self.convs):
x = l(x)
return x
model = Model()
return model
def make_nn_model_6():
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.convs = nn.ModuleDict({'conv1' : nn.Conv2d(1, 20, 5),
'conv2' : nn.Conv2d(20, 64, 5)})
def forward(self, x):
for l in self.convs.values():
x = l(x)
return x
model = Model()
return model
if __name__ == '__main__':
main()
↑こう書くと、↓こう出力されます
Sequential(
(0): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
(1): ReLU()
(2): Conv2d(20, 64, kernel_size=(5, 5), stride=(1, 1))
(3): ReLU()
)
Sequential(
(conv1): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
(relu1): ReLU()
(conv2): Conv2d(20, 64, kernel_size=(5, 5), stride=(1, 1))
(relu2): ReLU()
)
Sequential(
(conv1): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
(relu1): ReLU()
(conv2): Conv2d(20, 64, kernel_size=(5, 5), stride=(1, 1))
(relu2): ReLU()
)
Model(
(conv1): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
(conv2): Conv2d(20, 64, kernel_size=(5, 5), stride=(1, 1))
)
Model(
(convs): ModuleList(
(0): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
(1): Conv2d(20, 64, kernel_size=(5, 5), stride=(1, 1))
)
)
Model(
(convs): ModuleDict(
(conv1): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
(conv2): Conv2d(20, 64, kernel_size=(5, 5), stride=(1, 1))
)
)