Pytochはtensorの特定条件を使ってインデックスを判断します。


touch.where()は二つのbroadcastableのtenssorを新しいtenssorに結合するために用いられて、c+の中の3元の操作符に類似しています。
python numpyのwhere()とは異なり、直接に特定の条件要素のindexを見つけることができます。

numpyのwhere()の機能を実現するには、nonzero()を借りることができます。

numpy中のwhere()の操作効果に対応します。

補足:Pytouch.Tensor.detach()方法の使い方と指定モジュールの重みを変更する方法
detach
detachの中国語の意味は分離で、公式解釈は新しいTensorを返して、現在の計算図から分離します。

戻るTensorと元Tensorは同じ記憶空間を共有していますが、戻ってくるTensorは常に勾配が必要ではありません。

import torch as t
a = t.ones(10,)
b = a.detach()
print(b)
tensor([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
この関数は何の効果がありますか?
CもしAネットワークがTensorタイプの変数aを出力したら、aは入力としてBネットワークに入るべきです。損失関数を通してBネットワークのパラメータを逆伝搬したいですが、Aネットワークのパラメータを変更したくないです。この時はdetcah()方法を使えます。

a = A(input)
a = detach()
b = B(a)
loss = criterion(b, target)
loss.backward()
実際の例を見てみます。

import torch as t
x = t.ones(1, requires_grad=True)
x.requires_grad   #True
y = t.ones(1, requires_grad=True)
y.requires_grad   #True
x = x.detach()   #    
x.requires_grad   #False
y = x+y         #tensor([2.])
y.requires_grad   #   True
y.retain_grad()   #y      ,      
z = t.pow(y, 2)
z.backward()    #    
y.grad        #tensor([4.])
x.grad        #None
以上のコードは、yに逆方向に伝播して終了し、xに到達していないと説明したので、xのgrad属性はNoneである。
修正モデルの重みについて言及した以上、もう一つの状況は:
CもしAネットワークがTensorタイプの変数aを出力したら、aは入力としてBネットワークに入るべきです。もし私は損失関数を通してAネットワークのパラメータを逆伝搬したいですが、Bネットワークのパラメータを変更したくないです。この時はどうすればいいですか?
この時はTensor.requires_が使えます。grad属性は、requires_のみとなります。gradをFalseに変更すればいいです。

for param in B.parameters():
 param.requires_grad = False
a = A(input)
b = B(a)
loss = criterion(b, target)
loss.backward()
以上は個人の経験ですので、参考にしていただければと思います。間違いがあったり、完全に考えていないところがあれば、教えてください。