詳細Pytorch相関関数

A、逆方向()

pytorch 自動派生関数を。MクラスにN個のサンプルにこのネットワークを介してN個のサンプルを有するニューラルネットワークは、次いで、時間パラメータは、下位次元[N * M]であるべきです。後方()関数は、関数に渡され、通常必要とされていない、そして時にはまた、現在後方(パラメータに特定の意味を渡す必要)を理解するためのパラメータを渡す必要があります。

例としては、パラメータを渡す必要はありません

out.backward()はスカラー中である場合、(サンプルに対応するニューラルネットワーク、サンプルが2つの特性を有し、ニューラルネットワークの出力がある)を時間関数Iは、後方に任意のパラメータを入力する必要はありません。

import torch
from torch.autograd import Variable
a=Variable(torch.Tensor([2,3]),requires_grad=True)
b=a+3
c=b*3
out=c.mean()
out.backward()
print('input:{}'.format(a.data))
print('output:{}'.format(out.data.item()))
print('input grads are:{}'.format(a.grad))

输出:input:tensor([2., 3.])
output:16.5
input grads are:tensor([1.5000, 1.5000])

参照することは困難ではない、我々はそのような機能を内蔵しました:

     

したがって、導出を見ることも容易です。

    

これは、スカラーのその自動導出の結果です。

復路のパラメータを必要とします()

out.backward()した場合には、ベクトルのベクトルである(または1xNの行列として理解)、我々は自動的に派生出ている、と何が起こるか見て?

そのようなモデルを構築する(サンプルに対応するニューラルネットワークを、サンプルが2つの特性を有し、ニューラルネットワークは、2つの出力を有します)。

 

import torch
from torch.autograd import Variable
a=Variable(torch.FloatTensor([[2.,4.]]),requires_grad=True)
b=torch.zeros(1,2)
b[0,0]=a[0,0]**2+a[0,1]
b[0,1]=a[0,1]**2+a[0,0]
out=2*b
#其参数要传入和out维度一样的矩阵
out.backward(torch.FloatTensor([[1.,1.]]))
print('input:{}'.format(a.data))
print('output:{}'.format(out.data))
print('input gradients are:{}'.format(a.grad))

输出:input:tensor([[2., 4.]])
output:tensor([[16., 36.]])
input gradients are:tensor([[10., 18.]])

なぜ出力が上記a.gradである[10、18]、それを?実際には、逆方向と入力パラメータtorch.FloatTensor [1、1、 ] 関連します。k.backward(parameters)指定可能なパラメータは、parametersでなければならず、k正確に同じ大きさで、その後、としてkそれはどういう意味係数パスバック、あなたが知っている、上記のは、一例でこれを説明しましょう。

我々はすでに我々は=(OUT1、OUT2)kは=(K1、K2)を取得する知っているだけでなく、受信したパラメータは、1と1で、2つの結果の10と18にそれを取得する方法ですか?

実際には、最初の結果をすることによって得られる1 * \ FRAC {\ mathrm {DK1}} {\ mathrm {D} X1} + 1 * \ FRAC {\ mathrm {DK2}} {\ mathrm {D} X1} = 2 *(2 * X1 + 1)= 10ようにして得られた、2アウト= 2 * B 2。それは少し私たちは、第二の結果を見て、この操作が完了する方法を理解していない1 * \ FRAC {\ mathrm {DK1}} {\ mathrm {D} X2} + 1 * \ FRAC {\ mathrm {DK2}} {\ mathrm {D}×2} = 2 *(1 + 2 * X2)= 18私たちは二つの結果を得るように、私たちの着信パラメータは、各要因の誘導体であることを、。

二、torch.gather()

機能torch.gather(input, dim, index, out=None) → Tensor。薄暗い、指定された場所の重合のための入力インデックステンソル指標値軸に沿って所定の
3次元テンソルの、出力は以下のように定義することができます。

out[i][j][k] = input[index[i][j][k]][j][k]  # if dim == 0
out[i][j][k] = input[i][index[i][j][k]][k]  # if dim == 1
out[i][j][k] = input[i][j][index[i][j][k]]  # if dim == 2

 

三、nn.functional()

:NN共通モジュールがあるnn.functional NNのほとんど、レイヤ、機能的にそれに対応する機能を有しています。例えば層max_poll2d等、conv2d。nn.Module層で達成したことnn.functional機能とnn.Moduleの主な違いは、特別なクラスの抽出されたパラメータを自動的に学習することによって定義されたクラス層(nn.Module)です。そして純粋な関数等nn.functionalより、(入力)の機能は、DEF関数によって定義されます。

4つのビュー()

ビュー機能の役割は、再構成されたテンソル寸法、サイズ変更()関数でnumpyのと同等であるが、使用量が同じでなくてもよいです。次の例に示すように

import torch
tt1=torch.tensor([-0.3623, -0.6115,  0.7283,  0.4699,  2.3261,  0.1599])
result=tt1.view(3,2)
print(result)

tensor([[-0.3623, -0.6115],
        [ 0.7283,  0.4699],
        [ 2.3261,  0.1599]])

 1、torch.view(パラメータa、パラメータb、...)

パラメータ= 3、B = 2のパラメータは、上記の例では1次元再構成TT1の3×2の寸法のシートの量を決定します。

図2は、時々(-1)torch.viewれるかtorch.view(パラメータ、-1)このような状況。

import torch
tt2=torch.tensor([[-0.3623, -0.6115],
            [ 0.7283,  0.4699],
            [ 2.3261,  0.1599]])
result=tt2.view(-1)
>>> result
tensor([-0.3623, -0.6115,  0.7283,  0.4699,  2.3261,  0.1599])

 torch.view場合には、上記のコードから分かるように(-1)、元の構造テンソルは、一次元となります。

import torch
>>> tt3=torch.tensor([[-0.3623, -0.6115],
            [ 0.7283,  0.4699],
            [ 2.3261,  0.1599]])
result=tt3.view(2,-1)
>>> result
tensor([[-0.3623, -0.6115,  0.7283],
        [ 0.4699,  2.3261,  0.1599]])

上記のコードからわかるように、(パラメータ、-1)、bは未知パラメータ、自動的に充填した列ベクトルの長さが既知である場合を示しtorch.viewかの場合この場合は、A = 2のパラメータ、次いで、6つの要素、B = 6/2 = 3の合計のTT3。 

五、scatter_()

インデックスindexの方向に応じSRC入力データ中scatter_(入力、DIM、インデックス、SRC)をDIMに充填します。

>>> x = torch.rand(2, 5)
>>> x

 0.4319  0.6500  0.4080  0.8760  0.2355
 0.2609  0.4711  0.8486  0.8573  0.1029
[torch.FloatTensor of size 2x5]

LongTensor形状は、正確にxの形状、すなわち充填位置LongTensor指定されたデータにおける各インデックスxに対応します。DIM = 0、ライン充填で表されます。行0列2 LongTensorインデックス= 2の例では、ライン(0から始まる)2を表し、充填してゼロ(3,5)に対応して充填位置(2,2)であり、第0 LongTensor行に示さ0行インデックス= 0は、充填を開始します。したがって、列の数は、ここでは同じ列番号xにゼロ(3,5)を必要とLongTensorの最大インデックスは、行ゼロ(3,5)の数と一致しなければなりません。次のコードに示すように:

>>> torch.zeros(3, 5).scatter_(0, torch.LongTensor([[0, 1, 2, 0, 0], [2, 0, 0, 1, 2]]), x)

 0.4319  0.4711  0.8486  0.8760  0.2355
 0.0000  0.6500  0.0000  0.8573  0.0000
 0.2609  0.0000  0.4080  0.0000  0.1029
[torch.FloatTensor of size 3x5]

六、torch.clamp()

torch.clamp(入力、MIN、MAX、アウト=なし)

各入力テンソル要素の入力は、間隔の範囲[最小、最大]は、新たなテンソルの結果を返す制限します。

入力(テンソル) -テンソル入力
分(数) -下限リミット
上限値-最大値(数値)
アウト(任意テンソル) -出力テンソルを

入力値がminよりも小さい場合、minは出力され、入力値が最大値よりも大きい場合、maxが出力され、入力値、入力の出力値との間に介在します。

a=torch.randint(low=0,high=10,size=(10,1))
print(a)
a=torch.clamp(a,3,9)
print(a)

出力は次のようになります。

公開された139元の記事 ウォン称賛49 ビュー40000 +

おすすめ

転載: blog.csdn.net/xiewenrui1996/article/details/104325260