PyTorchで深層学習の基礎をマスターしよう
目次
🐼 はじめに
🔍 テンソル基礎
🧠 自動微分(オートグラド)
📊 モデル、損失、最適化
🧑🔬 ニューラルネットワークの作成
🖥️ 畳み込みニューラルネットワーク
🔀 データセットと変換
⚙️ GPU活用
🗂️ モデルの保存と読み込み
はじめに
皆さん、ピートッチのクラッシュコースへようこそ。このコースでは、ピートッチの使い方をマスターするためのすべてを学びます。単純なニューラルネットワークの作成だけでなく、フレームワークの基礎にも深く迫っていきます。このチュートリアルに従えば、深層学習プロジェクトに応用できる素晴らしい基礎を身につけられるはずです。
前提条件は、Pythonの基本的なスキルがあれば大丈夫です。ただし、backpropagationやニューラルネットワークの仕組みといった深層学習の概念については説明しません。これらについては別の動画をご覧ください。リンクは動画の説明欄にあります。
それでは、さっそく始めましょう。
🔍 テンソル基礎
ピートッチのすべては、テンソル演算に基づいています。テンソルとは、単一のデータ型を持つ多次元の行列です。NumPyのndarrayに似ていますが、GPUサポートがあるのが特徴です。
まずは、さまざまなテンソルを作成する方法を見ていきましょう。torch.emptyやtorch.randなどの関数を使って、サイズや初期値を指定できます。
サイズの確認やデータ型の取得もできます。また、リストやNumPy配列からテンソルを作ることもできます。重要なのは、requires_gradフラグを設定することです。これを真にすると、この後の最適化の際に勾配を計算できるようになります。
次に、テンソル同士の演算について学びます。足し算、引き算、乗算、除算など、NumPyと同様の演算ができます。また、スライシングやreshapeも可能です。
テンソルとNumPy配列の相互変換も重要です。ただし、メモリ領域を共有するので、変更に注意が必要です。
最後に、GPUサポートについて説明します。デフォルトでCPUに作成されますが、torch.deviceを使ってGPUに移動できます。効率的に計算するには、最初からGPUで作成するのがよいでしょう。
🧠 自動微分(オートグラド)
ピートッチのオートグラドパッケージは、テンソル演算の自動微分を提供します。これは、ニューラルネットワークの最適化に欠かせない機能です。
requires_gradフラグを使って、勾配を計算したいテンソルを指定します。そうすると、演算過程がcomputation graphに記録されます。最後に.backwardを呼び出すと、back propagationによって勾配が計算されます。
この際、勾配が累積されるので、each iterationでgradientをリセットする必要があります。そうしないと、誤った結果になってしまいます。
また、勾配計算を無効化したい場合は、requires_gradフラグの変更やdetach、no_gradコンテキストマネージャなどを使います。
最後に、オートグラドを使ったlinear regressionの例を示しました。
📊 モデル、損失、最適化
ここからは、ピートッチのtypical training pipelineを学びます。
まず、モデルクラスを定義します。nn.Moduleを継承し、init関数とforward関数を実装します。init関数でレイヤーを定義し、forward関数で順伝搬を行います。
次に、loss関数とoptimizerを構築します。loss関数にはnn.MSELossなどを、optimizerにはtorch.optimのクラスを使います。
最後に、training loopを実装します。forward->loss->backward->optimizer.stepの流れを繰り返します。optimizer.zero_gradで勾配をリセットするのを忘れずに。
この一連の流れを理解できれば、様々なタスクにも応用できるはずです。
🧑🔬 ニューラルネットワークの作成
さらに複雑な例として、シンプルなニューラルネットワークを作ってみましょう。
前述のパイプラインに加えて、いくつかの概念を紹介します。
まず、torchvisionのデータセットとデータローダーを使って、MNISTデータセットを読み込みます。transforms.Tensorを使えば、画像をテンソルに変換できます。
次に、2つの全結合層からなるネットワーククラスを定義します。forward関数で順伝搬を実装します。
学習時はdeviceをGPUに移動し、batches.to(device)で tensorsもGPUに載せます。loss計算、backprop、パラメータ更新の流れは前と同様です。
最後に、評価時はno_gradコンテキストで、テストデータに対する正解率を計算します。
🖥️ 畳み込みニューラルネットワーク
最後は、畳み込みニューラルネットワーク(CNN)の例を見ていきましょう。
前の例とほとんど同じ流れですが、conv2d、max_pooling2dといったレイヤーを使って、CNN特有の構造を実装しています。
畳み込み後のサイズ変化を確認するためprint文を入れるのがコツです。
学習・評価の流れは同じで、最後にモデルの保存と読み込みを行います。torch.save(model.state_dict(), 'path')でパラメータを保存し、load_state_dict()で読み込みます。
🔀 データセットと変換
データ前処理の方法も紹介しました。torchvision.transformsを使って、画像をテンソル化したり、正規化したりできます。
transforms.Composeで、複数の変換を組み合わせられます。自分のデータに合わせて、変換を調整するのがよいでしょう。
⚙️ GPU活用
GPUの活用方法も説明しました。torch.deviceを使ってGPUを指定し、.toメソッドでテンソルをGPUに移動します。
モデルもGPUに載せるのを忘れずに。GPU利用により、学習が大幅に高速化されます。
🗂️ モデルの保存と読み込み
最後に、トレーニング済みモデルの保存と読み込みについて学びました。
torch.save(model.state_dict(), 'path')でパラメータを保存し、load_state_dict()で読み込みます。モデル自体ではなくstate_dictを保存するのがポイントです。
また、評価時はmodel.Eval()を忘れずに呼び出しましょう。
以上が、ピートッチクラッシュコースの概要です。深層学習の基礎から実際のコーディングまで、幅広く学べたと思います。
ぜひ、自分のプロジェクトに活かしてみてください。
わからないことがあれば、遠慮なく質問してください。
それでは、次のチュートリアルでお会いしましょう。
よろしくお願いします。