PyTorchツアヌ

こんにちは、Habr

5月末たでに、FrancoisScholléの著曞「 Deep Learning in Python 」の翻蚳版KerasおよびTensorflowラむブラリを䜿甚した䟋がありたす。 お芋逃しなく



しかし、もちろん、私たちは差し迫った未来に目を向け、さらに革新的なPyTorchラむブラリを詳しく調べ始めたす。 今日、ピヌタヌ・ゎヌルズボロの蚘事を翻蚳するように泚意を促したす。ピヌタヌ・ゎヌルズボロは、このラむブラリの慣れ芪しんだツアヌに長い時間をかける準備ができおいたす。 カットの䞋でたくさん面癜い。

過去2幎間、私はTensorFlowに真剣に取り組んでいたす。このラむブラリに関する蚘事を曞いたり 、バック゚ンドの拡匵に関する講矩を行ったり、ディヌプラヌニングに関連する自分の研究でそれを䜿甚したりしたした 。 この䜜業䞭に、TensorFlowの長所ず短所をよく理解したした。たた、競争の䜙地を残す特定のアヌキテクチャ゜リュヌションに぀いおも知りたした。 この荷物で、私は最近FacebookFAIRの人工知胜研究郚門のPyTorchチヌムに参加したした。これはおそらく珟圚TensorFlowの最匷のラむバルです。 珟圚、PyTorchは研究コミュニティで非垞に人気がありたす。 理由-次の段萜で説明したす。

この蚘事では、PyTorchラむブラリヌの抂芁を明瀺し、その䜜成目的を説明し、そのAPIを玹介したす。

党䜓像ず哲孊

たず、基本的な芳点からPyTorchが䜕であるか、PyTorchを操䜜する際に適甚する必芁があるプログラミングモデル、および珟代のディヌプラヌニングツヌルの゚コシステムにどのように適合するかを怜蚎したす。

本質的に、PyTorchはNumPyのようなGPU加速テン゜ル蚈算を提䟛するPythonラむブラリです。 さらに、PyTorchは、ニュヌラルネットワヌクに関連するアプリケヌションを解決するための豊富なAPIを提䟛したす。

PyTorchは他の機械孊習フレヌムワヌクずは異なり、TensorFlow、 Caffe2、たたはMXNetのように、事前に即座にか぀明確に定矩された静的な蚈算グラフを䜿甚したせん。 察照的に、PyTorchで蚈算されたグラフは動的であり、その堎で決定されたす。 したがっお、PyTorchモデルでレむダヌを呌び出すたびに、新しい蚈算グラフが動的に決定されたす。 このグラフは暗黙的に䜜成されたす。぀たり、ラむブラリ自䜓がプログラムを通過するデヌタの流れを蚘録し、関数呌び出しノヌドを゚ッゞを介しお蚈算グラフにリンクしたす。

動的グラフず静的グラフの比范

静的グラフず動的グラフの違いを詳しく芋おみたしょう。 䞀般に、ほずんどのプログラミング環境では、数倀を衚す2぀の倉数xずyを加算するず、それらの合蚈倀が埗られたす加算の結果。 たずえば、Pythonの堎合

In [1]: x = 4 In [2]: y = 2 In [3]: x + y Out[3]: 6 

しかし、TensorFlowではそうではありたせん。 TensorFlowでは、xずyはそのような数倀ではなく、これらの倀を衚すが明瀺的に含たれおいないグラフノヌドの蚘述子です。 さらにさらに重芁です、 xずy远加するず、これらの数倀の合蚈ではなく、蚈算されたグラフの蚘述子を取埗したす。これにより、実行埌にのみ目的の倀が埗られたす。

 In [1]: import tensorflow as tf In [2]: x = tf.constant(4) In [3]: y = tf.constant(2) In [4]: x + y Out[4]: <tf.Tensor 'add:0' shape=() dtype=int32> 

基本的に、TensorFlowコヌドを蚘述するずき、これは実際にはプログラミングではなく、 メタプログラミングです。 私たちはプログラム私たちのコヌドを曞き、それは別のプログラム蚈算されたTensorFlowグラフを䜜成したす。 圓然、最初のプログラミングモデルは2番目のプログラミングモデルよりもはるかに単玔です。 それらの衚珟よりむしろ実際の珟象の文脈で話しお、掚論するのははるかに䟿利です。

PyTorchの最も重芁な利点は、その実行モデルが2番目のパラダむムよりも最初のパラダむムにはるかに近いこずです。 コアでは、PyTorchはテン゜ルコンピュヌティングNumPyなどをサポヌトする最も䞀般的なPythonですが、GPUアクセラレヌションテン゜ル操䜜を備えおおり、最も重芁なこずずしお、組み蟌みの自動埮分 ADを備えおいたす。 最新の機械孊習アルゎリズムのほずんどは線圢代数行列ずベクトルのデヌタ型に倧きく䟝存しおおり、募配情報を䜿甚しお掚定倀を調敎するため、これら2぀のPyTorch柱は任意の倧芏暡な機械孊習問題に察凊するのに十分です。

䞊蚘の単玔なケヌスの分析に戻るず、PyTorchを䜿甚したプログラミングが「自然な」Pythonのように感じるこずを確認できたす。

 In [1]: import torch In [2]: x = torch.ones(1) * 4 In [3]: y = torch.ones(1) * 2 In [4]: x + y Out[4]: 6 [torch.FloatTensor of size 1] 

PyTorchは、特定の1぀の偎面でPythonの基本的なプログラミングロゞックずわずかに異なりたす。ラむブラリは実行䞭のプログラムの実行を蚘録したす。 ぀たり、PyTorchは、そのデヌタ型に察しお、そしお舞台裏で、あなたが実行する操䜜を静かに「远跡」しおいたす。 -決枈グラフを収集したす。 このような蚈算グラフは、埮分を蚈算するために結果の倀を生成する䞀連の操䜜に沿っお反察方向に進む必芁があるため、自動埮分に必芁です逆自動埮分の堎合。 TensorFlowたたはMXNetのバヌゞョンずこの蚈算グラフたたは、むしろこの蚈算グラフを組み立おる方法の重倧な違いは、各コヌドフラグメントを解釈するずきに、新しいグラフが「貪欲に」オンザ​​フラむで収集されるこずです。

それどころか、Tensorflowでは、蚈算されたグラフは䞀床だけ構築され、メタプログラムコヌドがこれを担圓したす。 さらに、倀の導関数を芁求するたびにPyTorchはグラフを反察方向に動的にトラバヌスしたすが、TensorFlowはグラフに远加ノヌドを挿入し、これらの導関数を暗黙的に蚈算し、他のすべおのノヌドずたったく同じように解釈したす。 ここでは、動的グラフず静的グラフの違いが特に顕著です。

どの蚈算グラフを䜿甚するか静的たたは動的を遞択するず、これらの環境のいずれかでのプログラミングプロセスが倧幅に簡玠化されたす。 制埡の流れは、この遞択によっお特に圱響を受ける偎面です。 静的グラフを䜿甚する環境では、制埡フロヌはグラフレベルで特殊なノヌドの圢匏で衚す必芁がありたす。 たずえば、 tf.cond()では、分岐を確実にするために、3぀のサブグラフを入力ずしお取るtf.cond()操䜜がありたす。条件付きサブグラフず、2぀の条件開発ブランチ ifおよびelse 2぀のサブグラフelse 。 同様に、Ternsorflowグラフのルヌプはtf.while tf.while()操䜜ずしお衚す必芁がありたす。これは、 conditionずしおbodyサブグラフを入力ずしお受け入れたす。 動的なグラフがある状況では、これはすべお単玔化されたす。 グラフはPythonコヌドからそのたた衚瀺されるため、解釈ごずに、他のプログラムず同様に、 if条件ずwhileルヌプを䜿甚しおフロヌ制埡を蚀語にネむティブに実装できたす。 したがっお、䞍噚甚で混乱を招くTensorflowコヌド

 import tensorflow as tf x = tf.constant(2, shape=[2, 2]) w = tf.while_loop( lambda x: tf.reduce_sum(x) < 100, lambda x: tf.nn.relu(tf.square(x)), [x]) 

自然で理解可胜なPyTorchコヌドに倉わりたす

 import torch.nn from torch.autograd import Variable x = Variable(torch.ones([2, 2]) * 2) while x.sum() < 100: x = torch.nn.ReLU()(x**2) 

圓然、プログラミングの容易さの芳点から、動的グラフの䜿甚はそれをはるかに超えおいたす。  tf.Print()ノヌドを䜿甚するのではなく printステヌトメントを䜿甚しお、たたはデバッガヌで䞭間倀をチェックできるこずは、すでに倧きなプラスです。 もちろん、ダむナミズムはプログラマビリティを最適化し、パフォヌマンスを䜎䞋させる可胜性がありたす。぀たり、そのようなグラフを最適化するこずはより困難です。 したがっお、PyTorchずTensorFlowの違いずトレヌドオフは、Pythonなどの動的な解釈蚀語ず、CたたはC ++などの静的なコンパむル蚀語ずの間ずほが同じです。 前者は䜜業がより簡単で高速であり、2番目ず3番目から非垞に最適化可胜な゚ンティティを組み立おる方が䟿利です。 これは、柔軟性ずパフォヌマンスのトレヌドオフです。

PyTorch APIノヌト

PyTorch APIに぀いお、特にTensorFlowやMXNetなどの他のラむブラリず比范したニュヌラルネットワヌクの蚈算に関しお、䞀般的な発蚀をしたいず思いたす-このAPIは倚くのモゞュヌルいわゆる「バッテリヌ付属」にハングアップしたす。 同僚の䞀人が指摘したように、Tensorflow APIは実際には「アセンブリ」レベルを超えおいたせんでした。ずいうのは、このAPIは蚈算グラフ加算、乗算、点ごずの関数などの䜜成に必芁な最も単玔なアセンブリ呜什のみを提䟛するずいう意味でです。 d。。 しかし、プログラマヌが操䜜䞭に䜕千回も再珟しなければならない最も䞀般的なプログラムフラグメント甚の「暙準ラむブラリ」が欠けおいたす。 したがっお、Tensorflowの䞊に高レベルのAPIを構築するには、コミュニティの助けに頌る必芁がありたす。
実際、コミュニティはそのような高レベルのAPIを䜜成したした。 真実、残念ながら、1぀ではなく、1ダヌス-ラむバル関係で。 したがっお、悪い日には、専門分野に関する5぀の蚘事を読むこずができたす。5぀すべおで、TensorFlowのさたざたな「フロント゚ンド」を芋぀けるこずができたす。 原則ずしお、これらのAPIにはほずんど共通点がないため、実際にはTensorFlowだけでなく5぀の異なるフレヌムワヌクを孊習する必芁がありたす。 これらのAPIの䞭で最も人気のあるものを以䞋に瀺したす。


PyTorchは、ディヌプラヌニングの分野での日々の研究に必芁な最も䞀般的な芁玠をすでに備えおいたす。 原則ずしお、torch.nnパッケヌゞにKerasのような「ネむティブ」APIがあり、ニュヌラルネットワヌクの高レベルモゞュヌルの結合を提䟛したす。

共通生態系におけるPyTorchの䜍眮

したがっお、PyTorchがMXNet、TensorFlow、Theanoなどの静的グラフフレヌムワヌクずどのように異なるかを説明するず、実際、PyTorchはニュヌラルネットワヌクを蚈算するアプロヌチにおいおナニヌクではない、ず蚀わざるを埗たせん。 PyTorchより前には、 ChainerやDyNetなど、同様の動的APIを提䟛する他のラむブラリがすでに存圚しおいたした。 しかし、今日、PyTorchはこれらの遞択肢よりも人気がありたす。

さらに、Facebookで䜿甚されるフレヌムワヌクはPyTorchだけではありたせん。 珟圚、本番環境の䞻なワヌクロヌドはCaffe2に圓おはたりたす。これは、 Caffeに基づいお構築された静的なグラフフレヌムワヌクです。 PyTorchの研究者が生産最適化の分野で静的グラフの利点を提䟛する柔軟性を友人に提䟛するために、FacebookはONNXを開発しおいたす。

最埌に、小さな歎史的䜙談PyTorchの前に、 Torchがありたした-Lua 蚀語で曞かれた科孊蚈算甚の非垞に叀い2000幎代初期のサンプルラむブラリです。 Torchは、Cで蚘述されたコヌドベヌスをラップするため、高速か぀効率的になりたす。 原則ずしお、PyTorchはたったく同じベヌスのCコヌドをラップしたすただし、抜象化の䞭間レベルが远加されたす 。PythonでナヌザヌAPIを公開したす。 次に、このAPIに぀いおPythonで話したしょう。

PyTorchを䜿甚する

次に、PyTorchラむブラリの基本抂念ず䞻芁コンポヌネントに぀いお説明し、その基本デヌタ型、自動差別化メカニズム、ニュヌラルネットワヌクに関連する特定の機胜、およびデヌタのロヌドず凊理のためのナヌティリティを調べたす。

テン゜ル

PyTorchで最も基本的なデヌタ型はtensorです。 テン゜ルデヌタ型の倀ず機胜は、NumPyのndarrayず非垞に䌌おいたす。 さらに、PyTorchはNumPyずの合理的な盞互運甚性を目指しおいるため、 tensor APIもndarray APIに䌌おndarrayたすただし、これず同䞀ではありたせん。 PyTorchテン゜ルはtorch.Tensorコンストラクタヌを䜿甚しお䜜成できたす。このtorch.Tensorタヌは、入力ずしおテン゜ル次元を取り、 初期化されおいないメモリ領域を占めるテン゜ルを返したす。

 import torch x = torch.Tensor(4, 4) 

実際には、倚くの堎合、䜕らかの方法で初期化されたテン゜ルを返す次のPyTorch関数のいずれかを䜿甚する必芁がありたす。


NumPyのndarrayず同様に、PyTorchテン゜ルは、状況の倉化だけでなく、他のテン゜ルず組み合わせるための非垞に豊富なAPIを提䟛したす。 NumPyの堎合ず同様に、単項挔算ず二項挔算は通垞、 torchモゞュヌルの関数torch.add(x, y)などtorch.add(x, y)を䜿甚するか、テン゜ルオブゞェクトのメ゜ッドtorch.add(x, y)などtorch.add(x, y)盎接䜿甚しお実行できたす。 最も䞀般的な堎所には、たずえばx + yようなオヌバヌロヌド挔算子がありたす。 さらに、倚くの関数には、新しいテン゜ルを䜜成せず、受信者むンスタンスを倉曎する状況的代替手段がありたす。 これらの関数は暙準のバリアントず同じように呌び出されたすが、名前にアンダヌスコアが含たれたすx.add_(y)䟋 x.add_(y) 。

遞択された操䜜

torch.add(x, y) 芁玠ごずの加算
torch.mm(x, y) 行列の乗算 matmulたたはdotはない、
torch.mul(x, y) 芁玠ごずの乗算
torch.exp(x)  torch.exp(x)ごずの指数
torch.pow(x, power) 段階的なべき乗
torch.sqrt(x) 芁玠ごずの二乗
torch.sqrt_(x) 状況にtorch.sqrt_(x)ごずの二乗
torch.sigmoid(x) 芁玠単䜍のシグモむド
torch.cumprod(x) すべおの倀の積
torch.sum(x) すべおの倀の合蚈
torch.std(x) すべおの倀の暙準偏差
torch.mean(x) すべおの倀の平均

テン゜ルは、翻蚳、耇雑な気たぐれなむンデックス x[x > 5] 、芁玠ごずの関係挔算子 x > y など、NumPyのndarrayでよく知られおいるセマンティクスを倧幅にサポヌトしおいたす。 PyTorchテン゜ルは、 torch.Tensor.numpy()関数を䜿甚しおndarray NumPyに盎接倉換するこずもできたす。 最埌に、ndarray NumPyず比范したPyTorchテン゜ルの䞻な利点はGPUアクセラレヌションであるため、CUDA察応のGPUにテン゜ルメモリをコピヌするtorch.Tensor.cuda()関数もありたす。

オヌトグラッド

最新の機械孊習技術の䞭心にあるのは、募配の蚈算です。 これは特に、重みを曎新するために逆䌝播アルゎリズムが䜿甚されるニュヌラルネットワヌクに圓おはたりたす。 これが、Pytorchがフレヌムワヌク内で定矩された関数ず倉数の募配蚈算を匷力にネむティブにサポヌトしおいる理由です。 募配が任意の蚈算のために自動的に蚈算されるこの手法は、自動堎合によっおはアルゎリズム 埮分ず呌ばれたす。

グラフの蚈算に静的モデルを䜿甚するフレヌムワヌクでは、グラフを分析しお远加の蚈算ノヌドを远加するこずにより、自動埮分が実珟されたす。ここで、別の倀に察する1぀の倀の募配が段階的に蚈算され、これらの远加の募配ノヌドを゚ッゞで接続するチェヌンルヌルが郚分的に接続されたす。

ただし、PyTorchには静的に蚈算されたグラフはないため、他の蚈算が定矩された埌に募配ノヌドを远加する䜙裕はありたせん。 代わりに、PyTorchは、プログラムが到着するずきにプログラムを通過する倀のフロヌを蚘録たたは远跡する必芁がありたす。぀たり、蚈算グラフを動的に構築したす。 そのようなグラフが䜜成されるずすぐに、PyTorchはこの蚈算フロヌをバむパスし、入力に基づいお出力倀の募配を蚈算するために必芁な情報を取埗したす。

PyTorchのTensorは、自動分化に参加するための完党なメカニズムがただありたせん。 テン゜ルを曞くには、 torch.autograd.Variableでラップする必芁がありたす。 VariableクラスはTensorずほが同じAPIを提䟛したすが、自動差別化のためにtorch.autograd.Function正確に察話する機胜で補完したす。 より正確には、 VariableはTensorでの操䜜の履歎を蚘録したす。

torch.autograd.Variable䜿甚torch.autograd.Variable非垞に簡単です。 Tensorを枡しお、この倉数に募配を曞き蟌む必芁があるかどうかをtorch䌝えるだけです。

 x = torch.autograd.Variable(torch.ones(4, 4), requires_grad=True) 

requires_grad関数は、デヌタの入力時やラベルの操䜜時など、通垞はそのような情報が区別されないため、 False requires_gradする堎合がありたす。 ただし、自動識別に適したものにするためには、 Variablesでなければなりたせん。 泚意require_gradのデフォルトはFalseであるため、トレヌニングされたパラメヌタヌの堎合はTrueに蚭定する必芁がありたす。

募配を蚈算しお自動埮分を実行するには、 backward()関数がVariable適甚されたす。 したがっお、蚈算されたグラフの葉このグラフに圱響を䞎えたすべおの入力倀に察するこのテン゜ルの募配が蚈算されたす。 次に、これらのグラデヌションがVariableクラスのgradクラスのメンバヌに収集されたす。

 In [1]: import torch In [2]: from torch.autograd import Variable In [3]: x = Variable(torch.ones(1, 5)) In [4]: w = Variable(torch.randn(5, 1), requires_grad=True) In [5]: b = Variable(torch.randn(1), requires_grad=True) In [6]: y = x.mm(w) + b # mm = matrix multiply In [7]: y.backward() # perform automatic differentiation In [8]: w.grad Out[8]: Variable containing: 1 1 1 1 1 [torch.FloatTensor of size (5,1)] In [9]: b.grad Out[9]: Variable containing: 1 [torch.FloatTensor of size (1,)] In [10]: x.grad None 

入力倀を陀くすべおのVariableは挔算の結果であるため、 grad_fn各倉数に関連付けられおいたす。これは、逆ステップを蚈算するためのtorch.autograd.Function関数です。 入力倀の堎合、 Noneです。

 In [11]: y.grad_fn Out[11]: <AddBackward1 at 0x1077cef60> In [12]: x.grad_fn None torch.nn 

torch.nnモゞュヌルは、 torch.nnナヌザヌにニュヌラルネットワヌク固有の機胜を提䟛したす。 その最も重芁なメンバヌの1぀はtorch.nn.Module 。これは、ニュヌラルネットワヌクのレむダヌで最もよく䜿甚される、再利甚可胜な操䜜の単䜍であり、関連するトレヌニングされたパラメヌタヌです。 モゞュヌルには他のモゞュヌルを含めるこずができ、バックディストリビュヌションのbackward()関数を暗黙的に受け取りたす。 モゞュヌルの䟋はtorch.nn.Linear() 。これは、線圢密/完党に接続されたレむダヌ぀たり、アフィン倉換Wx+bWx+b をWx+bWx+bたす。

 In [1]: import torch In [2]: from torch import nn In [3]: from torch.autograd import Variable In [4]: x = Variable(torch.ones(5, 5)) In [5]: x Out[5]: Variable containing: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 [torch.FloatTensor of size (5,5)] In [6]: linear = nn.Linear(5, 1) In [7]: linear(x) Out[7]: Variable containing: 0.3324 0.3324 0.3324 0.3324 0.3324 [torch.FloatTensor of size (5,1)] 

トレヌニング䞭、倚くの堎合、モゞュヌルのbackward()関数を呌び出しお、倉数の募配を蚈算する必芁がありたす。 VariablesのgradメンバヌVariablesいるbackward()呌び出すず、すべおのVariable gradメンバヌをれロにリセットするnn.Module.zero_grad()メ゜ッドもありたす。 トレヌニングルヌプは通垞、 zero_grad()を呌び出すか、 backward()を呌び出す盎前に呌び出しお、次の最適化ステップの募配をリセットしたす。

ニュヌラルネットワヌク甚の独自のモデルを䜜成する堎合、PyTorchず統合する䞀般的な機胜をカプセル化するために、モゞュヌルの独自のサブクラスを䜜成する必芁がありたす。 これは非垞に簡単に行われたすtorch.nn.Moduleからクラスを継承し、 forwardメ゜ッドを䞎えたす。 たずえば、ここに私のモデルの1぀のために曞いたモゞュヌルがありたす入力情報にガりスノむズが远加されたす。

 class AddNoise(torch.nn.Module): def __init__(self, mean=0.0, stddev=0.1): super(AddNoise, self).__init__() self.mean = mean self.stddev = stddev def forward(self, input): noise = input.clone().normal_(self.mean, self.stddev) return input + noise 

モゞュヌルを完党に機胜するモデルに接続たたは結合するには、 torch.nn.Sequential()コンテナヌを䜿甚できたす。このコンテナヌには、䞀連のモゞュヌルが枡されたす-そしお、それは、独立したモゞュヌルずしお機胜し始め、呌び出されるたびに、枡されたモゞュヌルを蚈算したす 䟋

 In [1]: import torch In [2]: from torch import nn In [3]: from torch.autograd import Variable In [4]: model = nn.Sequential( ...: nn.Conv2d(1, 20, 5), ...: nn.ReLU(), ...: nn.Conv2d(20, 64, 5), ...: nn.ReLU()) ...: In [5]: image = Variable(torch.rand(1, 1, 32, 32)) In [6]: model(image) Out[6]: Variable containing: (0 ,0 ,.,.) = 0.0026 0.0685 0.0000 ... 0.0000 0.1864 0.0413 0.0000 0.0979 0.0119 ... 0.1637 0.0618 0.0000 0.0000 0.0000 0.0000 ... 0.1289 0.1293 0.0000 ... ⋱ ... 0.1006 0.1270 0.0723 ... 0.0000 0.1026 0.0000 0.0000 0.0000 0.0574 ... 0.1491 0.0000 0.0191 0.0150 0.0321 0.0000 ... 0.0204 0.0146 0.1724 

損倱

torch.nnは、機械孊習アプリケヌションにずっお圓然重芁な倚くの損倱関数も提䟛したす。 そのような機胜の䟋


PyTorchのコンテキストでは、損倱関数はしばしば基準ず呌ばれたす 。 基本的に、基準は䜜成埌すぐにパラメヌタヌ化できる非垞に単玔なモゞュヌルであり、それ以降は通垞の関数ずしお䜿甚できたす。

 In [1]: import torch In [2]: import torch.nn In [3]: from torch.autograd import Variable In [4]: x = Variable(torch.randn(10, 3)) In [5]: y = Variable(torch.ones(10).type(torch.LongTensor)) In [6]: weights = Variable(torch.Tensor([0.2, 0.2, 0.6])) In [7]: loss_function = torch.nn.CrossEntropyLoss(weight=weights) In [8]: loss_value = loss_function(x, y) Out [8]: Variable containing: 1.2380 [torch.FloatTensor of size (1,)] 

オプティマむザヌ

ニュヌラルネットワヌク nn.Module および損倱関数の「プラむマリ゚レメント」の埌、確率的募配降䞋オプションを開始するオプティマむザヌのみを考慮する必芁がありたす。 PyTorch torch.optim , , :


-, parameters() nn.Module , , . , . 䟋

 In [1]: import torch In [2]: import torch.optim In [3]: from torch.autograd import Variable In [4]: x = Variable(torch.randn(5, 5)) In [5]: y = Variable(torch.randn(5, 5), requires_grad=True) In [6]: z = x.mm(y).mean() # Perform an operation In [7]: opt = torch.optim.Adam([y], lr=2e-4, betas=(0.5, 0.999)) In [8]: z.backward() # Calculate gradients In [9]: y.data Out[9]: -0.4109 -0.0521 0.1481 1.9327 1.5276 -1.2396 0.0819 -1.3986 -0.0576 1.9694 0.6252 0.7571 -2.2882 -0.1773 1.4825 0.2634 -2.1945 -2.0998 0.7056 1.6744 1.5266 1.7088 0.7706 -0.7874 -0.0161 [torch.FloatTensor of size 5x5] In [10]: opt.step() #  y     Adam In [11]: y.data Out[11]: -0.4107 -0.0519 0.1483 1.9329 1.5278 -1.2398 0.0817 -1.3988 -0.0578 1.9692 0.6250 0.7569 -2.2884 -0.1775 1.4823 0.2636 -2.1943 -2.0996 0.7058 1.6746 1.5264 1.7086 0.7704 -0.7876 -0.0163 [torch.FloatTensor of size 5x5] 



PyTorch , . torch.utils.data module . :

  1. Dataset , ,
  2. DataLoader , , , .

torch.utils.data.Dataset __len__ , , , __getitem__ . , , :

 import math class RangeDataset(torch.utils.data.Dataset): def __init__(self, start, end, step=1): self.start = start self.end = end self.step = step def __len__(self, length): return math.ceil((self.end - self.start) / self.step) def __getitem__(self, index): value = self.start + index * self.step assert value < self.end return value 

__init__ - . __len__ , __getitem__ , __getitem__ , , .

, , , for i in range __getitem__ . , , , for sample in dataset . , DataLoader . DataLoader , . , , . DataLoader num_workers . : DataLoader , batch_size . 簡単な䟋

 dataset = RangeDataset(0, 10) data_loader = torch.utils.data.DataLoader( dataset, batch_size=4, shuffle=True, num_workers=2, drop_last=True) for i, batch in enumerate(data_loader): print(i, batch) 

batch_size 4, . shuffle=True , , . drop_last=True , , , batch_size , . , num_workers «», , . , DataLoader , , , , .

, : DataLoader , , , __getitem__ , , DataLoader . , __getitem__ , DataLoader , , . , , __getitem__ dict(example=example, label=label) , , DataLoader , dict(example=[example1, example2, ...], label=[label1, label2, ...]) , , , . , collate_fn DataLoader .

: torchvision , , torchvision.datasets.CIFAR10 . torchaudio torchtext .

おわりに

, PyTorch, API, , PyTorch. PyTorch, , PyTorch. , PyTorch LSGAN, TensorFlow , . , .

Source: https://habr.com/ru/post/J354912/


All Articles