Image

PyTorchでまずは基本的なニューラルネットワークを構成してみよう

PythonのライブラリであるPyTorchを使用して、基本的なニューラルネットワークを作成します。Pythonのバージョンは3系です。PyTorchでニューラルネットワークを構成するには自作のクラスを使用するかライブラリを利用することで作成が可能です。

PyTorchのニューラルネットワークの定義をするには

今回はニューラルネットワークの定義について触れていきます

ニューラルネットワークの定義を抑えて機械学習をできるようにしていきましょう。

段々と機械学習っぽくなってきました。

どんどんいきましょう。



目次   

01. ニューラルネットワークとは

02. nn.Sequentialを使ったニューラルネットワークの定義

03. 自作のクラスを使用したニューラルネットワークの定義

04. まとめ


01. ニューラルネットワークとは


そもそもニューラルネットワークとはなんでしょうか。

簡単にいうと人間の思考回路、脳神経回路を真似たアルゴリズムのことを指します

中間層を作り活性化関数を使用することで...と言ってもよくわからないですよね。


とりあえず濾過装置イメージしてみて下さい

濾過層がたくさんあるじゃないですか

その濾過層が数学の関数になったイメージです

最終的には綺麗になった水すなわち結果が得られます


PyTorchで機械学習を行うにはニューラルネットワークの定義が必須となってきます。

まずはnnパッケージというものを利用したニューラルネットワークの定義について解説していきます。

PyTorchではニューラルネットワークの定義に自作のクラスを使用する方法と、自作のクラスを使用しない方法があります。

しかしどちらでもnnパッケージが必要になってきます

nn.Sequentialは自作のクラスを使用することなくニューラルネットワークを定義することができるので簡単です


02. nn.Sequentialを使ったニューラルネットワークの定義


早速PyTorchのnn.Sequentialを使用したニューラルネットワークの定義を行います



import torch
from torch import nn
net = torch.nn.Sequential(
nn.Conv2d(1,6,3), #入力チャネル,出力チャネル,カーネルサイズ
nn.MaxPool2d((2,2)),
nn.ReLU(),
nn.Conv2d(6,16,3),
nn.MaxPool2d(2), #nn.MaxPool2d((2,2))と同じ
nn.ReLU()
)
print(net)



>>>Sequential(
(0): Conv2d(1, 6, kernel_size=(3, 3), stride=(1, 1))
(1): MaxPool2d(kernel_size=(2, 2), stride=(2, 2), padding=0, dilation=1, ceil_mode=False)
(2): ReLU()
(3): Conv2d(6, 16, kernel_size=(3, 3), stride=(1, 1))
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(5): ReLU()
)


PyTorchのニューラルネットワークの定義では、入力層から出力層にかけて順に層を積み重ねてニューラルネットワークを構築していきます

nn.Conv2dは画像認識のニューラルネットワークでよく用いられます

入力に対してフィルタリングを行なってから特徴マップを取得します。

引数には、入力チャネル、出力チャネル、カーネル(フィルタ)サイズを渡します

チャネルとは次元を指します

nn.MaxPool2dでは画像のずれに対してニューラルネットワークに頑健性を保つために使われる層です。

入力を任意のサイズに小さくして画像のずれに対応します。

引数にはカーネルサイズを渡します。

nn.ReLUは近年ニューラルネットワークでよく用いられる活性化関数です

ニューラルネットワークについて単純化してイメージすると入力した値をそれぞれの層ごとで加工し、決められた出力量で出力するというものです。


03. 自作のクラスを使用したニューラルネットワークの定義



import torch
from torch import nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1,6,3)
self.conv2 = nn.Conv2d(6,16,3)
def forward(self, x):
x = F.max_pool2d(F.relu(self.conv1(x)), (2,2))
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
return x
net = Net()
print(net)



Net(
(conv1): Conv2d(1, 6, kernel_size=(3, 3), stride=(1, 1))
(conv2): Conv2d(6, 16, kernel_size=(3, 3), stride=(1, 1))
)


自分で複雑なニューラルネットワークを構築するには、nn.Modueを継承したクラスを自分で定義します

ニューラルネットワークの層の定義の初期化のために__init__メソッドによって各層の定義を記述していきます

順伝搬の計算はforwardメソッドに書きます。

forwardに渡すことで自動微分が可能となります

自作のクラスを使って定義したニューラルネットワークをprint(net)すると二層分しか表示されません。

しかし前の章で定義したネットワークと同じ計算をします。


ネットワークロードすることができます

ネットワークをロードすることで定義したネットワークを使用することができます。



net = Net()
## ↓
net = Net().to('cuda')


GPUのcudaを使用する場合はこのようにします。

GPUcudaネットワークの定義を転送する必要があるのでこのようにしてcudaに送ります


04. まとめ


お疲れ様でした。

ここまで読んでいただきありがとうございました。

まだまだわからないことが多くあると思いますが進めていくにつれて慣れていくはずです。

ニューラルネットワークの定義の基本的なやり方なので押さえておくと今後の機械学習がスムーズになります。

機械学習ではニューラルネットワークの定義が必須となるので今回の内容は覚えておくといいと思います。