2
2

More than 3 years have passed since last update.

PyTorch の Define by Run を可視化

Posted at

Deep Learningフレームワークにおける計算グラフ

TensorFlow, PyTorchなどのDeep Learningフレームワークにおける計算グラフの構築方法が,大きく分けて2パターンに分類される。1つ目は Define by Run 型で,2つ目は Define and Run 型である。

それぞれの特徴

Define by Run型

  • Chainer, PyTorchがこちらの方式を採用している
  • データを流すときに,計算グラフの構造を決定
  • 動的な計算グラフを定義することが可能

Define and Run型

  • TensorFlow(v1)がこの方式を採用している
  • 計算グラフの構造を予め定義しておき,そこにデータを流す

Define by Run が動的な計算グラフを構築できることを確認

概要

  • 入力データによって計算グラフが変化することを確認
  • 本稿では,Recurrent Neural Net (RNN) を可視化
  • torch_vizのmake_dot()を用いて,系列長が2と3の場合の計算グラフを出力

結果

  • 系列長2の場合 (左)
    • ループに対する重みとバイアス(fc_h.weight と hc_h.bias)が1度しか使用されない
  • 系列長3の場合 (右)
    • ループする回数が増えたため,2度使用されていることがわかる

スクリーンショット 2021-09-13 21.08.58.png

ソースコード

可視化
visualize_RNN.py
import torch

from torchviz import make_dot
from RNN import RNN

INPUT_SIZE = 1
TIME_LENGTH = 3
# TIME_LENGTH = 2

model = RNN()
data = torch.randn(1, TIME_LENGTH, INPUT_SIZE)

y = model(data)

image = make_dot(y, params=dict(model.named_parameters()))
image.format = "png"
image.render(f"RNN_{TIME_LENGTH}s")

ネットワークの定義
RNN.py
import torch
import torch.nn as nn

class RNN(nn.Module):
    def __init__(self):
        super(RNN, self).__init__()
        # 入力に対する全結合層
        self.fc_in = nn.Linear(1, 64)
        # ループに対する全結合層
        self.fc_h = nn.Linear(64,64)
        # 出力用の全結合層
        self.fc = nn.Linear(64, 10)

    def forward(self, x):
        _, length, _ = x.size()
        h = self.fc_in(x)
        h = torch.tanh(h)

        # 入力データの系列長に合わせてループする
        for i in range(1, length):
            h = self.fc_in(x[:, i, :]) + self.fc_h(h)
            h = torch.tanh(h)

        h = self.fc(h)

        return h
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2