Pytorch チュートリアル: 初心者向けクイックガイド

Pytorch チュートリアル: 初心者向けクイックガイド

Python は、オープンソースの ML ライブラリ Pytorch のおかげで、データ サイエンスと機械学習の主力言語として確立されました。

Pytorch の強力なディープ ニューラル ネットワーク構築ツールと使いやすさにより、データ サイエンティストの間で人気を博しています。人気が高まるにつれて、Tensorflow から Pytorch に移行する企業が増えており、今こそ Pytorch を使い始めるのに最適な時期です。

今日は、Pytorch がなぜ人気なのか、Pytorch の基本的な使い方を理解し、最初の計算モデルを作成するお手伝いをします。

[[385724]]

PyTorch とは何ですか?

PyTorch は、コンピューター ビジョン (武器を使用) や自然言語処理などのディープラーニング実装用のオープン ソースの機械学習 Python ライブラリです。これは2016年にFacebookのAI研究所(FAIR)によって開発され、それ以来データサイエンスやMLの分野で採用されてきました。

Pytorch は、Python にすでに精通しているユーザー向けに直感的なマシンを提供し、OOP サポートや動的計算グラフなどの優れた機能を備えています。

Pytorch は、ディープ ニューラル ネットワークの構築に加えて、GPU アクセラレーションにより複雑な数学計算にも適しています。この機能により、Pytorch はコンピューターの GPU を使用して計算を大幅に高速化できます。

このユニークな機能と PyTorch の比類のないシンプルさの組み合わせにより、PyTorch は Tensorflow に匹敵する最も人気のあるディープラーニング ライブラリの 1 つになりました。

PyTorch を使用する理由は何ですか?

Pytorch が登場する前は、開発者は高度な計算を使用して、バックプロパゲーション エラーとノードの重みの関係を調べていました。より深いニューラル ネットワークでは、ますます複雑な操作が必要となり、機械学習の規模と容易さが制限されます。

今では、ML ライブラリを使用してすべての計算を自動的に実行できます。ML ライブラリは、あらゆるサイズや形状のネットワークを数秒で計算できるため、より多くの開発者がより大規模で優れたネットワークを構築できます。

Pytorch は、標準の Python と同様に動作することで、このアクセスをさらに一歩進めます。新しい構文を学習する代わりに、既存の Python の知識を使用して Python をすぐに使い始めることができます。さらに、Pycharm デバッガーなどの一般的なデバッガーなど、追加の Python ライブラリを Pytorch で使用することもできます。

PyTorch と TensorFlow。

Pytorch と Tensorflow の主な違いは、シンプルさとパフォーマンスのトレードオフです。Pytorch は学習が簡単です (特に Python プログラマーの場合)。一方、Tensorflow は学習曲線がありますが、パフォーマンスが優れており、より広く使用されています。

  • 人気: Tensorflow は Pytorch より 1 年前にリリースされたため、現在、業界の専門家や研究者の間で人気のツールとなっています。ただし、Pytorch ユーザーの増加率は Tensorflow の増加率よりも速いため、Pytorch がすぐに最も人気が出る可能性があることが示唆されています。
  • データ並列処理: Pytorch には宣言的なデータ並列処理が含まれています。つまり、データ処理のワークロードを異なる GPU 間で自動的に分散して、パフォーマンスを高速化します。 Tensorflow には並列処理機能がありますが、作業を手動で分散する必要があり、通常は時間がかかり、効率も悪くなります。
  • 動的グラフと静的グラフ: Pytorch には、新しいデータに即座に応答する動的グラフがデフォルトで用意されています。 Tensorflow は、TensoRFlow Fold を使用した動的グラフのサポートが限定的ですが、主に静的グラフで動作します。
  • 統合: アームを介した密接な接続により、Pytorch は AWS 上のプロジェクトに適しています。 Tensorflow は Google Cloud と統合されており、SWIFT API を使用しているためモバイル アプリケーションに最適です。
  • 視覚化: Tensorflow にはより強力な視覚化ツールがあり、グラフ設定をより細かく制御できます。 Pytorch の wish 視覚化ツールや Matplotlib などの他の標準プロット ライブラリは、Tensorflow ほど機能が充実していませんが、習得ははるかに簡単です。

PyTorch の基礎

1. テンソル

Pytorch テンソルは、すべての高レベル操作の基礎となる多次元配列変数です。標準の数値型とは異なり、テンソルは CPU または GPU アクセラレーション操作を使用するように割り当てることができます。

これらは N 次元の量に似ており、たった 1 行で Numpy 配列に変換することもできます。

テンソルには 5 つの種類があります。

  • 浮動小数点テンソル: 32 ビット浮動小数点
  • Doubletensor: 64 ビット浮動小数点数
  • HalfTensor: 16 ビット浮動小数点数
  • IntsTensor: 32 ビット int
  • longTensor: 64 ビット int

すべての数値型と同様に、保存する必要があるメモリに適合する最小の型を使用する必要があります。 PyTorchはすべてのテンソルのデフォルト型としてFloatTensorを使用しますが、これを次のように使用することもできます。

  1. トーチのデフォルトテンソル型を設定します。

2 つの FloatTensor を初期化します。

  1. 輸入トーチ
  2. # テンソルの初期化
  3. a =トーチテンソル(2)
  4. b =トーチテンソル(1)

テンソルは、他の数値型と同様に、単純な数学演算で使用できます。

  1. # 追加
  2. 印刷(a+b)
  3. # 減算
  4. 印刷(ba)
  5. # 掛け算
  6. 印刷(a*b)
  7. # 分割
  8. 印刷(a/b)

モバイル GPU の CUDA を使用してテンソルを処理することもできます。

  1. torch.cuda.is_available() の場合:
  2. x x = x.cuda()
  3. y y = y.cuda()
  4. x + y

Pytorch ではテンソルは行列なので、テンソルを設定して数値の表を表すことができます。

  1. ones_tensor = torch.ones ((2, 2)) # すべて1を含むテンソル
  2. rand_tensor = torch.rand ((2, 2)) # ランダムな値を含むテンソル

ここでは、テンソルが 2x2 の正方形になるように指定します。 vone() 関数を使用すると正方形が塗りつぶされ、 rand() 関数を使用すると乱数が塗りつぶされます。

2. ニューラルネットワーク

Pytorch は、画像分類や畳み込みニューラル ネットワーク (CNN) などの分類モデルに優れているため、ニューラル ネットワークの構築によく使用されます。

ニューラル ネットワークは、接続され重み付けされたデータ ノードの層です。各レイヤーにより、モデルは入力データを最も一致するカテゴリに分類できます。

ニューラル ネットワークの性能はトレーニングによってのみ決まるため、モデルがすでに習得しているデータに基づいて、より難しいトレーニング データを生成する大規模なデータセットと GAN フレームワークが必要になります。

Pytorch は Torch.NN パッケージを使用してニューラル ネットワークを定義します。このパッケージには、ネットワークの各層を表すモジュールのセットが含まれています。

各モジュールは入力テンソルを受け取り、出力テンソルを計算し、それらを組み合わせてネットワークを作成します。 torch.nn パッケージは、ニューラル ネットワークのトレーニングに使用する損失関数も定義します。ニューラル ネットワークを構築する手順は次のとおりです。

  • アーキテクチャ: ニューラル ネットワーク レイヤーを作成し、パラメーターを設定し、重みとバイアスを確立します。
  • 順方向伝播: パラメータを使用して予測出力を計算します。誤差は予測出力と実際の出力を比較することによって測定されます。
  • バックプロパゲーション: エラーを見つけた後、ニューラル ネットワークのパラメータに関してエラー関数の導関数を取得します。後方伝播により、重みパラメータを更新できます。
  • 反復最適化: 勾配降下法を使用してパラメータを反復的に更新するオプティマイザーを使用してエラーを最小化します。

以下は Pytorch のニューラル ネットワークの例です。

  1. 輸入トーチ
  2. torch.nnをnnとしてインポートする
  3. torch.nn.function を F としてインポートします。
  4. クラスNet(nn.Module):
  5. __init__(self)を定義します。
  6. super(Net, self).__init__()
  7. # 入力画像チャネル 1 つ、出力チャネル 6 つ、3x3 正方畳み込み
  8. # カーネル
  9. 自己.conv1 = nn.Conv2d (1, 6, 3)
  10. 自己.conv2 = nn.Conv2d (6, 16, 3)
  11. # アフィン演算: y = Wx + b
  12. self.fc1 = nn.Linear (16 * 6 * 6, 120) # 画像の寸法から6*6
  13. 自己.fc2 = nn.線形 (120, 84)
  14. 自己.fc3 = nn.線形(84, 10)
  15. def forward(self, x):
  16. # (2, 2) ウィンドウ上の最大プーリング
  17. x = F .max_pool2d(F.relu(self.conv1(x)), (2, 2))
  18. # サイズが正方形の場合は、1つの数字のみ指定できます
  19. x = F .max_pool2d(F.relu(self.conv2(x)), 2)
  20. x x = x.view(-1, self.num_flat_features(x))
  21. x = F .relu(self.fc1(x))
  22. x = F .relu(self.fc2(x))
  23. x =自分.fc3(x)
  24. xを返す
  25. num_flat_featuresを定義します(self, x):
  26. size = x .size()[1:] # バッチディメンション以外のすべてのディメンション
  27. 特徴数= 1  
  28. サイズがsの場合:
  29. num_features *= s
  30. num_featuresを返す
  31. ネット=ネット()
  32. 印刷(ネット)

NN.Module は、これがニューラル ネットワークになることを指定し、2D 畳み込みを実行する 2 つの Conv2D レイヤーと、線形変換を実行する 3 つの Linear レイヤーでこれを定義します。

次に、前方伝播を前方に要約する forward メソッドを定義します。 Pytorch にはデフォルトで backward() 機能が含まれているため、逆伝播メソッドを定義する必要はありません。

今はわかりにくいかもしれませんが心配しないでください。このチュートリアルの後半で、よりシンプルな Pytorch 実装について説明します。

3. オートグラッド

Autograd は、ニューラル ネットワークの動作に必要な導関数を計算するための Pytorch パッケージです。これらの導関数は勾配と呼ばれます。フォワードパス中、Autograd は勾配テンソルに対するすべての操作を記録し、テンソルとすべての操作の関係を見つけるために非巡回グラフを作成します。この一連の操作は自動微分と呼ばれます。

このグラフの葉は入力テンソルであり、根は出力テンソルです。 Autograd は、グラフをルートからリーフまでトレースし、連鎖律を使用して各勾配を乗算して勾配を計算します。

勾配を計算した後、導関数の値はテンソルの grad 属性として自動的に設定されます。

  1. 輸入トーチ
  2. #pytorch テンソル
  3. x = torch.tensor (3.5、 requires_grad = True )
  4. # yはxの関数として定義される
  5. y = (x-1) * (x-2) * (x-3)
  6. # 勾配を計算する
  7. y.後方()

デフォルトでは、RESCEL_GRAD は FALSE に設定されており、PyTorch は勾配を追跡しません。初期化中に RESECT_GRAD を TRUE に指定すると、PyTorch は特定の操作を実行するときにその特定のテンソルの勾配を追跡するようになります。

このコードはYを見て、それが(x-1)(x-2)(x-3)から来ていることを知り、勾配dy/dx、3x^2 - 12x + 11を自動的に作成します。

この命令は、勾配の数値も解き、それを x の実際の値 3.5 とともにテンソル x に配置します。

勾配は3 (3.5 3.5) - 12 * (3.5) + 11 = 5.75になります。

> 画像出典: 著者

グラデーションはデフォルトで累積されるため、リセットしないと結果に影響する可能性があります。各勾配の後にグラフをゼロに戻すには、Model.zero_grad() を使用します。

4. オプティマイザー

オプティマイザーを使用すると、モデル内の重みとバイアスを更新してエラーを減らすことができます。これにより、全体を再構築することなく、モデルの動作を編集できます。

すべての Pytorch オプティマイザーは Torch.optim パッケージに含まれており、各最適化スキームは特定の状況に合わせて設計されています。 torch.optim モジュールを使用すると、引数のリストを渡すだけで抽象的な最適化スキームを構築できます。 Pytorch には選択できるオプティマイザーが多数あるため、ほとんどの場合、ニーズに最適なオプティマイザーが見つかります。

たとえば、一般的な最適化アルゴリズムである SGD (確率的勾配降下法) を実装して、データを平滑化することができます。

  1. torch.optim を optim としてインポートします
  2. パラメータ= torch.tensor ([1.0, 0.0], requires_grad = True )
  3. 学習率= 1e -3
  4. シンガポールドル
  5. optimオプティマイザー= optim.SGD([params], lr =学習率)

モデルを更新した後、optimizer.step() を使用して Pytorch にモデルを再計算するように指示します。オプティマイザーを使用する場合、ループを使用してモデル パラメータを手動で更新する必要があります。

  1. model.parameters() 内のパラメータの場合:
  2. パラメータ- = params.grad * 学習率

全体として、オプティマイザーは、データの重み付けを最適化し、必要に応じて再定式化することなくモデルを変更できるようにすることで、多くの時間を節約します。

5. PyTorch 計算グラフの使用

Pytorch とニューラル ネットワークをより深く理解するには、計算グラフを使用して練習することができます。これらのグラフは、本質的にはニューラル ネットワークの簡略化されたバージョンであり、システムの出力が入力によってどのように影響を受けるかを理解するために使用する一連の操作です。

つまり、入力 x は y を見つけるために使用され、次に y は出力 z を見つけるために使用されます。

> 画像出典: 著者

Y と Z が次のように計算されるとします。

  • y = x ^ 2
  • 2Y + 3 の倍数

しかし、出力 Z が入力 X によってどのように変化するかに興味があるので、いくつかの計算を実行する必要があります。

  • dz / dx = (dz / dy) * (dy / dx)
  • dz / dx = 2.2倍
  • dz / dx = 4倍

これを使用すると、x = 3.5 を入力すると z = 14 になることがわかります。

各テンソルが他のテンソルに関してどのように定義されているか (y に関して x、z に関して、他のテンソルに関して z、y に関してなど) を知ることで、pytorch はこれらのテンソルがどのように接続されているかを示す図を作成できます。

> 画像出典: 著者

この図は計算グラフと呼ばれ、Pytorch が舞台裏でどのように動作するかを理解するのに役立ちます。

このグラフを使用すると、各テンソルが他のテンソルの変化によってどのように影響を受けるかを確認できます。これらの関係は勾配であり、トレーニング中にニューラル ネットワークを更新するために使用されます。

これらのグラフは、手作業よりも Pytorch を使ってプロットする方がはるかに簡単です。舞台裏で何が起こっているのかがわかったところで、試してみましょう。

  1. 輸入トーチ
  2. # x、y、z を関連付ける簡単なグラフを設定します
  3. x = torch.tensor (3.5、 requires_grad = True )
  4. y = x * x
  5. z = 2 * y + 3
  6. print("x: ", x)
  7. print(" y = x *x: ", y)
  8. print(" z = 2 *y + 3: ", z)
  9. # 勾配を計算する
  10. z.後方()
  11. print("グラデーション dz/dx を計算しています")
  12. # x = 3.5の勾配はいくらですか
  13. print(" x = 3.5での勾配: ", x.grad)

これにより、手作業で見つけたのと同じように Z = 14 が見つかります。

6. Pytorch を使った練習: マルチパス計算グラフ

単一の関係を持つ計算グラフを確認したので、より複雑な例を試してみましょう。

まず、入力として使用する 2 つのテンソル a と b を定義します。グラデーションを下の線まで縮小できるように、必ず RESECT_GRAD = TRUE を設定してください。

  1. 輸入トーチ
  2. # x、y、z を関連付ける簡単なグラフを設定します
  3. a = torch.tensor (3.0、 requires_grad = True )
  4. b = torch.tensor (2.0、 requires_grad = True )

次に、入力とニューラル ネットワークの各層 (x、y、z) との関係を設定します。 z は x と y によって定義され、x と y は入力値 a と b を使用して定義されることに注意してください。

  1. 輸入トーチ
  2. # x、y、z を関連付ける簡単なグラフを設定します
  3. a = torch.tensor (3.0、 requires_grad = True )
  4. b = torch.tensor (2.0、 requires_grad = True )
  5. x = 2 *a + 3*b
  6. y = 5 *a*a + 3*b*b*b
  7. z = 2 * x + 3 * y

これにより、Pytorch がデータ間のすべての関係を理解するために追跡できる関係のチェーンが構築されます。

これで、z から a へのパスをたどることで、勾配 Dz/da を解くことができます。

パスは 2 つあり、1 つは x を経由し、もう 1 つは y を経由します。これらに従って、両方のパスの表現を加算する必要があります。これは、a から z への両方のパスが z の値に寄与するため、理にかなっています。

Chain の規則の計算を使用して DZ/DA を解くと、同じ結果が得られます。

> 画像出典: 著者

最初のパス X では 2*2 が得られ、2 番目のパス Y では 3*10A が得られます。したがって、Z が 4+30A で変化する速度です。

A が 22 の場合、DZ/DA は 4 + 30 * 2 = 64 になります。

z からの逆伝播を追加し、a の勾配 (または導関数) を求めることで、これを確認できます。

  1. 輸入トーチ
  2. # x、y、z を関連付ける簡単なグラフを設定します
  3. a = torch.tensor (2.0、 requires_grad = True )
  4. b = torch.tensor (1.0、 requires_grad = True )
  5. x = 2 *a + 3*b
  6. y = 5 *a*a + 3*b*b*b
  7. z = 2 * x + 3 * y
  8. print("a: ", a)
  9. 印刷("b: ", b)
  10. print("x: ", x)
  11. print("y: ", y)
  12. print("z: ", z)
  13. # 勾配を計算する
  14. z.後方()
  15. print("勾配 dz/da を計算しています")
  16. # a = 2.0での勾配はいくらですか
  17. print(" a = 2.0での勾配:", a.grad)

学習の次のステップ

おめでとうございます。これでクイックスタートが完了し、Pytorch とニューラル ネットワークの初心者になりました。計算グラフを完成させることは、ディープラーニング ネットワークを理解する上で重要な部分です。

高度なディープラーニングのスキルとアプリケーションについて学習する際には、次の点について検討する必要があります。

  • 最適化された複雑なニューラルネットワーク
  • ビジュアルデザイン
  • GANを使ったトレーニング

楽しい学習を!

オリジナルリンク: https://ai.plainenglish.io/pytorch-tutorial-a-quick-guide-for-new-learners-180957cb7214

<<:  企業向けローコードAI開発プラットフォーム

>>:  再ハッシュ: ブルームフィルタアルゴリズムの実装原理を理解する

ブログ    
ブログ    
ブログ    

推薦する

音声合成のためのディープフィードフォワードシーケンシャルメモリネットワーク

まとめディープフィードフォワードシーケンスメモリネットワークに基づく音声合成システムを提案します。こ...

2021年、AIは小売業者が失われた顧客ロイヤルティを「救う」のに役立つだろう

2020 年は混乱と混乱が共存しましたが、騒動は落ち着き、小売業者は新年に再編成し、新たな常態に向か...

クラウドとSaaSのセキュリティには包括的なアプローチが必要

米国国土安全保障省および米国国税庁の元最高情報責任者であり、現在は Learning Tree In...

ガートナー: データサイエンスと機械学習の未来に影響を与える 5 つのトレンド

Gartner, Inc. は、人工知能のデータ需要を満たすために急速に進化している分野であるデータ...

...

...

Googleは視覚障害者の走行を支援するAIシステムをテストしている

[[353439]]この記事はLeiphone.comから転載したものです。転載する場合は、Leip...

早く見て!無料の機械学習コーストップ10

この記事では機械学習入門、ディープラーニング、自然言語処理などを網羅した関連講座10選を紹介します。...

なんて想像力豊かなんでしょう! AIは実際にこのようにプレイできます! 同意できない場合は、比較してみてください。

「まあまあ、今のところ需要はないんですが、ありがとうございます。」今週、子供向け番組を「販売」する...

2019 年に知っておくべき機械学習向け Python ライブラリ トップ 10

この記事では、開発者がデータを解析、クリーンアップ、表現し、既存のアプリケーションに機械学習を実装す...

繊毛もチップにできる!コーネル大学の中国人博士課程学生の初の論文がネイチャーの表紙に掲載

チップを作る上で最も重要な部分は何ですか? より高度な製造プロセスを使用してトランジスタ密度と計算能...

Keras または TensorFlow?プログラマーはディープラーニングフレームワークをどのように選択すべきでしょうか?

ディープラーニングは急速に発展していますが、過去 2 年間に登場した多くのディープラーニング フレー...

...

2021年に最も役立つ顔認識ソフトウェア9選をチェック

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

深度に関するあらゆる情報: 大規模なラベルなしデータから深度推定を解き放つ

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...