Variable-Pytorchのデータ型


1.Variableの紹介
実際、VariableはTorchのデータ型で、tensorと大きな違いはありませんが、
別のデータ型に属しており、Variableオブジェクトにはより多くの属性があります.主な違いは以下の通りです.
①、Variableタイプの変数は自動導出機能がある
②、Variableタイプの変数は1つの計算図に置かれ、Variableタイプの変数は3つの属性を持つ:data、grad、grad_fn:
data:Variableのtensor値を取り出す
grad:variableの逆伝搬勾配,すなわち導出結果
grad_fn:このVariableを得るための操作であり、例えば加減乗除により、以下に具体的な例がある.もしそうなら
Variableはtorchです.Autogradでは、Variableを参照するときにインポートすることに注意
import torch
from torch.autograd import Variable #  torch.autograd  Variable

まずTensorとVariableの違いを見てみましょう.
a = torch.Tensor([1]) #     Tensor  
b = Variable(a) #    Tensor  Variable   ,    Variable     
print(a)
print(b)
tensor([1.])
tensor([1.])

Variable()の3つのプロパティとその使い方を見てみましょう.requires_grad=Trueは、この変数を導くかどうか、デフォルトではFalse
# create Variable
x = Variable(torch.Tensor([1]),requires_grad = True)
w = Variable(torch.Tensor([2]),requires_grad = True)
b = Variable(torch.Tensor([3]),requires_grad = True)
print(x)
print(w)
print(b)
tensor([1.], requires_grad=True)
tensor([2.], requires_grad=True)
tensor([3.], requires_grad=True)
# built a computational graph -        ,            
y = w * x + b

Variableは自動的に導く機能を持っていることを知っています.backward()はyのすべての変数を導出し,導出した結果を実現する.
y.backward()  # same as y.backward(torch.FloatTensor([1]))

属性1、その導関数を出力
print(x.grad) #    x、w、b       
print(w.grad)
print(b.grad)
tensor([2.])
tensor([1.])
tensor([1.])

求めた導関数はやはりTensorタイプで,これはスカラーに対する導出であり,以下に行列に対する導出がある.
属性2、そのdataを出力
print(x.data) #    x、w、b    data, x、w、b        
print(w.data)
print(b.data)
tensor([1.])
tensor([2.])
tensor([3.])

属性3は、得られたこのVariableの操作を出力し、注意!!Variable(Tensor)を直接通過する場合はnonを出力します
print(x.grad_fn) #      Variable     x、w、b,y      
print(w.grad_fn)
print(b.grad_fn)
print(y.grad_fn)
None
None
None


y.backward()#same as y.backward(torch.FloatTensor([1]))の解釈:
自動導出とは、その関数がその関数を導出することを明確に説明する必要はありません.この行のコードで
ある**は勾配(導関数)**の変数を求めて導き、彼らの勾配を得る必要があります.
y.backward(torch.FloatTensor([1]))実はy.backward()にはパラメータが入っていて、スカラーの導出には書いていません
行列の導出:
x = torch.randn(3)
x
tensor([ 2.7666, -1.5363,  0.4382])
x = Variable(x,requires_grad =True)
x
tensor([ 2.7666, -1.5363,  0.4382], requires_grad=True)
y = x * 2
print(y)
tensor([ 5.5331, -3.0726,  0.8765], grad_fn=)
y.backward(torch.FloatTensor([1,0.1,0.01]))
print(x.grad)
tensor([2.0000, 0.2000, 0.0200])

y自動導出後、変数xの導関数は[2,2,2]であり、1,0.1,0.01に乗算される.これは、3次元ベクトルを与えて演算することに相当する.この場合、y.backward()と直接書くことはできない.y.backward(torch.FloatTensor([1,1]))は、各成分の勾配を得ることであり、y.backward(torch.FloatTensor([1,0.1,0.01])は、各成分の勾配をそれぞれ1,0.1,0.01に乗算する.