【講義8】深層学習ソフトウェア(深層学習ソフトウェア)

クラスQ&A

序文

ディープラーニングフレームワークの開発が速すぎます(この記事のコードの一部が少し変更されています)。この記事では、主にPytorch、Caffe、TensorFlowに関する講義を記録しています。ポイントはピトーチです。

前の理論のクラスでは、ニューラルネットワークのトレーニングを完了するには、ネットワークの計算グラフを描画してから、その前方伝播と後方伝播のプロセスを明確にすることが最善であることを知っています。同時に、データの並列読み込み、ネットワークの並列トレーニング、GPUの並列計算など、基盤となる実装の最適化を検討する必要があります。この作業を行うために、ニューラルネットワークのフレームワークはずっと簡単になり:
ここに画像の説明を挿入
基本的な枠組みは今その目標を達成するためにしながら、:numpyの同じような普及、および元による書き込みの能力に計算チャートを自動的に計算勾配バックプロパゲーション。たとえば、次の例:
ここに画像の説明を挿入
ここに画像の説明を挿入

1. TensorFlow(静的グラフ)

メインプロセスは次の部分に分かれています。

  • 順方向伝搬の計算グラフを定義します(現時点では計算なし)。
  • 計算グラフの例を実行して、損失と勾配を取得します。
  • グラデーションを使用して、プロセスを更新して繰り返します。

ここに画像の説明を挿入
次に、トレーニングコードを追加します。
ここに画像の説明を挿入
ただし、上記の操作には問題があります。つまり、トレーニングデータと重みを毎回CPUからGPUに転送する必要があります。1回の反復の後、勾配と損失を渡してパラメーターを更新する必要もあります。多くの場合、上記の操作には非常に時間がかかります。
したがって、計算グラフにパラメータ更新操作を追加するときに、計算期間全体にわたって存在し、渡す必要のない計算グラフの内部変数として重みを追加できます。
ここに画像の説明を挿入
ただし、上記の操作にはまだ問題があります。つまり、重量が更新される前に損失が計算され、最終的には損失のみが返されます。現時点では、TensorFlowは必要な位置までインテリジェントに実行され、重みは更新されません。
1つの解決策は、新しいウェイト明示的に返すことですが、これらのウェイトは非常に大きなテンソル(テンソル)であることが多く、CPUとGPUの間で大きなデータが移動します。少しトリックは:計算グラフにいくつかのダミーノードを追加します。これらのノードは重みで動作しますが、ビッグデータを返さず、最後に損失とこの偽ノードを同時に計算する限りクリックするだけです。
ここに画像の説明を挿入
もちろん、我々はまた、TensorFlowの内部を呼び出すことができオプティマイザオプティマイザは、自動的に上記の操作を実行するために私たちを助けるために。
ここに画像の説明を挿入
もちろん、TensorFlowは多くのネットワークレイヤーと損失関数をカプセル化する多くの高度なAPIも定義します。しかし、また、高レベルAPI - Kerasその後端部に基づいて、およびカプセル化は、多くの操作をTensorFlow。

TensorBoard
呼ばれるビジュアル TFには、トレーニングプロセスとネットワーク構造を視覚化するためのツールがあります。

2.ピトーチ(動的計算図)

Pytorchは、動的計算グラフを使用するという点でTensorFlowとは異なります。また、内部で定義された抽象化の3つのレイヤーがあります。
ここに画像の説明を挿入
最初にTFのような定義済みの計算グラフを表示し、次にトレーニング用のトレーニングデータを入力する必要がないため、動的グラフと呼ばれます。代わりに、計算が再度実行されると、計算グラフが動的に作成されます。
たとえば、Pytorchを使用して、トレーニング用の2層ニューラルネットワークを定義します。
ここに画像の説明を挿入
自動派生(Autograd)
ここに画像の説明を挿入
ここで、

  • PyTorch 変数計算グラフのノードです
  • x.dataはテンソルです
  • x.gradはグラデーションの変数です(x.dataと同じ形状)
  • x.grad.dataは勾配のテンソルです

もちろん、独自の逆伝播関数を定義することもできます。これは、グラフでゲートを計算することと同等であり、順方向と逆伝播を完了するだけで済みます。その後、PyTorchは自動的に派生できます。
ここに画像の説明を挿入
高度なパッケージングnnは
、KerasのTFのパッケージングに似ています。Pytorchには、一般的に使用されるネットワークレイヤーと関数の多くを定義するnnモジュールという高度なAPIもあります。
ここに画像の説明を挿入
オプティマイザー
ここに画像の説明を挿入
は独自のネットワーク層を定義しますが、nnによって提供されるAPIのように、
継承を通じてnn.Module独自のネットワーク構造定義することもできます。
ここに画像の説明を挿入
データローダー(DataLoader)

もちろん、Pytorchには比較的使いやすいインターフェイスデータローダーもあります。最初に独自のデータクラス(DataSet)を定義している限り、データを並列に読み込むことができます。

事前研修のモデル
では、torchvision一般的なネットワークアーキテクチャおよびコンピュータビジョンにおける事前研修モデルの多くが含まれています。

可視化

TFのTensorBoardと同様に、Pytorchにも可視化ツールVidomがありますが、計算グラフの可視化もサポートしています。

3.動的グラフと静的グラフ

先ほど、TFは静的グラフに基づいており、計算グラフを最初に表示して宣言する必要があると述べましたが、Pytorchは静的グラフに基づいていますが、計算中にグラフを構築します。

  • 対照的に、静的グラフはグラフ構造を事前に知っているため、最適化を行うことができます。
    ここに画像の説明を挿入
  • もう1つの利点は、静的グラフが定義されると、ほとんど変化しないため、それをシリアル化してディスクに保存できることです。
    その後、前のコードを見なくても、直接ロードして再利用できます。(つまり、リリースされたら、グラフを計算するだけで、トレーニングコードは不要です)
  • 動的グラフは、計算グラフを定義するための面倒な手順がないため、多くのシナリオで単純に見えます。そしてPytorchはよりPythonicです。同時に、ネットワークの制御フローもPythonやNumpyを書くようなものです。ただし、TFに制御フローを追加する場合は、TFのAPIのいくつかを使用して、それを静的グラフに追加する必要があります。
    ここに画像の説明を挿入

4. Caffe / Caffe2

以前のフレームワークとは異なり、Caffeの最下層はC ++で記述されており、製品の展開に適しています。
ここに画像の説明を挿入
そしてめったにコードを書かず、すべて編集設定ファイル:
ここに画像の説明を挿入

提案と要約

ここに画像の説明を挿入

19件のオリジナル記事を公開しました いいね1 訪問数493

おすすめ

転載: blog.csdn.net/qq_41341454/article/details/105627915