【速習】Pytorch入門②:MLP回帰を実装してPyTorchの基礎を学ぶ
前回はPyTorchのベースとなるtorchの扱い方をおさらいできました。
今回は、PyTorchで多層パーセプトロン(Multilayer perceptron:MLP)回帰を実装するとともに、主要なPyTorchパッケージを確認したいと思います。
全体の流れ
モデル実装の全体的な流れは下のようになります。()内はその際に使用するPyTorchパッケージです。
- 入力データセットの作成、反復処理(Dataset, Dataloader)
- ニューラルネットワークの定義(nn.Module)
- 損失の計算、勾配をネットワークのパラメーターに伝播(nn.Module)
- ネットワークの重みを更新(Optimaizer)
主要なPyTorchパッケージ
PyTorchに関わらず、多くのディープラーニングフレームワークでは実装を簡易化するために様々なパッケージを提供しています。PyTorchでは主に以下のものがあります。
torch.tensor | 多次元配列。PyTorchで使うデータ構造。 |
torch.autograd | 順伝播・逆伝播を実装する。逆伝播(backward())などでのTensorに対する自動微分操作をサポートする。 |
torch.utils.data | 入力するデータとそのラベルをセットにしてまとめる「Dataset」やDatasetからミニバッチでデータを取り出しモデルへ渡す「Dataloader」などのユーティリティを含む。 |
torch.nn.Module | ニューラルネットワークの構築に用いる。モデルの保存や読み込み、GPUへの移動など、パラメーターのカプセル化を担う。 |
torch.optim | SDGやAdamなどのパラメータ最適化アルゴリズムを使えるようにする。 |
モデルの実装
データセットの作成
今回は、練習用データとして sin(5x) に乱数を加えたものをnumpyで用意します。from_numpy()
でtorch.tensorに変換します。
モデルの定義
pytorchでは、nn.Moduleクラスを継承した「pythonのclass」としてモデルを定義します。
class MLP(nn.Module): 定義するMLPというclassは、親クラスnn.Moduleを継承
def init(): 引数を受け取ってインスタンス化する
super(MLP, self).init(): super関数で親クラスを継承する
def forward(self, x): インスタンス化した後、その関数が呼び出されたときに動作する。forward関数を定義するとbackward 関数(勾配計算)も自動的に定義される
.parameters()
でnetworkの構造やパラメータを取得できます。
損失の計算・逆伝播・重みの更新
個々の動作を理解するために、xからデータを1つ取り出してニューラルネットワークに入力し、誤差の計算や重みの更新によるパラメータの変化をみてみます。
学習ループを回してみる
上記の流れをバッチごとに行い、ニューラルネットワークを学習させます。Dataset
はデータとそれに対応するラベルを1組返し、DataLoader
はデータをバッチサイズにまとめて返すクラスです。
計算グラフの可視化
今回作成した3層のMLPの構造はtorchvizというpythonのパッケージを使うことで可視化できます。parameters()
だけでは物足りない時にどうぞ。
以上、MLP回帰の実装を通して、PyTorchとその主要なPyTorchパッケージを確認しました。
ディスカッション
コメント一覧
まだ、コメントがありません