1. ホーム
  2. python

[解決済み] PyTorchの "view "メソッドはどのように動作するのですか?

2022-02-16 16:04:10

質問

メソッドについて混乱しています。 view() を、以下のコードに追加してください。

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool  = nn.MaxPool2d(2,2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1   = nn.Linear(16*5*5, 120)
        self.fc2   = nn.Linear(120, 84)
        self.fc3   = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16*5*5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

net = Net()

私が混乱しているのは、次の行についてです。

x = x.view(-1, 16*5*5)

とは何ですか? tensor.view() 関数は何をするのですか?いろいろなところでその使い方を見かけますが、パラメータをどう解釈しているのかがわかりません。

にパラメータとして負の値を与えるとどうなるか? view() 関数を使うことができますか?例えば、私が呼び出したらどうなるのでしょう。 tensor_variable.view(1, 1, -1) ?

の主な原理を説明できる人はいますか? view() 関数の例を挙げてください。

どのように解決するのですか?

ビュー関数はテンソルの形状を変更するためのものである。

テンソルがあるとします

import torch
a = torch.range(1, 16)

a は1から16(含む)までの16個の要素を持つテンソルである。もし、このテンソルを整形して 4 x 4 テンソルを使用します。

a = a.view(4, 4)

現在 a4 x 4 テンソルです。 なお、再形成後も要素の総数は同じである必要がある。テンソルのリシェイプ a から 3 x 5 テンソルは適切ではありません。

パラメータ -1 の意味を教えてください。

行数は分からないが、列数は間違いない、という状況があれば、-1で指定することができます( なお、これをより多くの次元のテンソルに拡張することができます。軸の値のうち1つだけが-1であることができる ). これはライブラリに次のように伝える方法である: "これらの多くの列を持つテンソルを与え、あなたはこれを実現するために必要な適切な行の数を計算する"。

これは、上にあげたニューラルネットワークのコードを見ればわかることです。行の後 x = self.pool(F.relu(self.conv2(x))) は、16 個の深度特徴マップを生成します。これを全結合層に渡すには、平坦化する必要があります。そこで、pytorchに、得られたテンソルを特定の列数になるように整形し、行数を自分で決めるように指示します。

numpyとpytorchの類似性を描画する。 view は、numpyの リシェイプ という関数があります。