PyTorch学習:2、Autograd(自動派生)

1. Autograd:自動差別化

PyTorchのすべてのニューラルネットワークの中核はautogradパッケージです。最初にこのパッケージを簡単に紹介し、次に最初のニューラルネットワークをトレーニングします。

autogradこのパッケージは、テンサーのすべての操作を自動的に区別します。これは実行時に定義されるフレームワークです。つまり、バックプロパゲーションはコードの実行方法に従って定義され、各反復は異なる場合があります。

次に、いくつかの簡単な例を使用して、このパッケージを確認します。

テンソル

torch.Tensorパッケージのコアクラスです。プロパティ.requires_gradをTrueに設定すると、そのプロパティに対するすべての操作の追跡が開始されます。計算が完了したら、呼び出して.backward()すべての勾配を自動的に計算できますこのテンソルの勾配は.grad属性に累積されます。

テンソルが履歴を追跡しないようにするには、呼び出してテンソルを.detach()計算履歴から分離し、将来の計算が追跡されないようにすることができます

追跡履歴(およびメモリ使用量)を防ぐために、torch.no_grad()を使用してコードブロックをラップすることもできます。これは、モデルにrequires_grad = Trueトレーニング可能なパラメータがある場合があるため、モデルを評価するときに特に役立ちますが、勾配は必要ありません。

autogradの実装にとって非常に重要な別のクラスがあります-Function。

TensorとFunctionは相互に接続され、非周期的なグラフを作成して完全な計算プロセスを作成します。各テンソルには、.grad_fn作成されたテンソルの機能を参照する属性があります(ユーザーが作成したテンソルを除く-それらgrad_fnNone)。

導関数を計算したい場合は、Tensorで呼び出すことができます.backward()テンソルがスカラーの場合(つまり、1つの要素データが含まれている場合)、backward()パラメーター指定する必要はありませんが、要素がさらにある場合は、形状が一致するテンソルである勾配パラメーターを指定する必要があります。

import torch

テンソルを作成し、requires_grad = Trueその計算を追跡するよう設定します

x = torch.ones(2, 2, requires_grad=True)
print(x)

输出:

tensor([[1., 1.],
        [1., 1.]], requires_grad=True)

 

テンサーで操作を実行します。

y = x + 2
print(y)

输出:

tensor([[3., 3.],
        [3., 3.]], grad_fn=<AddBackward0>)

yは操作によって作成されるため、grad_fnがあり、xはユーザーによって作成されるため、そのgrad_fnはNoneです。

print(y.grad_fn)
print(x.grad_fn)

输出:

<AddBackward0 object at 0x000001E020B794A8>
None

yで操作を実行します

z = y * y * 3
out = z.mean()

print(z, out)

输出:

tensor([[27., 27.],
        [27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward1>)

.requires_grad_(...)既存のテンソルのrequires_gradロゴを所定の位置に変更します。指定しない場合、入力フラグはデフォルトでFalseになります。

a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)

输出:

False
True
<SumBackward0 object at 0x000001E020B79FD0>

グラデーション

それでは、逆伝播を実行しましょう。これはout.backward()、実行するの同じです。out.backward(torch.tensor(1.))

out.backward()

outの勾配d(out)/ dxをxに出力します。

print(x.grad)

输出:

tensor([[4.5000, 4.5000],
        [4.5000, 4.5000]])

ここで、Jacobianベクトル製品の例を見てみましょう。

x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
    y = y * 2
print(y)

输出:

tensor([  384.5854,   -13.6405, -1049.2870], grad_fn=<MulBackward0>)

この場合、yはスカラーではなくなります。 torch.autograd完全なJacobian決定子を直接計算することはできませんが、Jacobianベクトル積のみが必要な場合は、ベクトルをパラメーターとして逆方向に渡すだけで済みます。

v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)
print(x.grad)

输出:

tensor([5.1200e+01, 5.1200e+02, 5.1200e-02])

torch.no_grad()コードを使用し、テンソルで.requires_grad = Trueを使用して、トレース履歴の使用を停止することもできます。

print(x.requires_grad)
print((x ** 2).requires_grad)

with torch.no_grad():
    print((x ** 2).requires_grad)


输出:

True
True
False

 

おすすめ

転載: blog.csdn.net/qq_40716944/article/details/107790345