57

計算の要素を勾配計算から除外する 2 つの方法を知っていますbackward

方法 1:使用with torch.no_grad()

with torch.no_grad():
    y = reward + gamma * torch.max(net.forward(x))
loss = criterion(net.forward(torch.from_numpy(o)), y)
loss.backward();

方法 2:使用.detach()

y = reward + gamma * torch.max(net.forward(x))
loss = criterion(net.forward(torch.from_numpy(o)), y.detach())
loss.backward();

これら2つに違いはありますか?どちらにもメリット/デメリットはありますか?

4

3 に答える 3

7

簡単で深遠な説明は、 の使用はwith torch.no_grad()ループのように動作し、そこに記述されたすべてのものが一時的であるかのようにrequires_grad引数が設定されるということです。Falseしたがって、特定の変数または関数の勾配から逆伝播を停止する必要がある場合は、これ以上何も指定する必要はありません。

ただし、torch.detach()名前が示すように、勾配計算グラフから変数を切り離すだけです。ただし、これは、この仕様を限られた数の変数または関数に提供する必要がある場合に使用されます。一般に、エポックがニューラル ネットワーク トレーニングで終了した後に損失と精度の出力を表示している間は、結果の表示中にその勾配が問題にならないため、その時点ではリソースのみが消費されるためです。

于 2020-07-06T08:34:16.373 に答える