山内セミナーⅠ(2020/07/29)

関連サイトと資料

1.Getting Started with PyTorch for Deep Learning

Loading and processing data

ほとんどの場合、トレーニング、検証、テストの3つのグループでデータを受け取ると想定されています。 トレーニングデータセットを使用してモデルをトレーニングします。 検証データセットは、トレーニング中のモデルのパフォーマンスを追跡するために使用されます。 モデルの最終評価にはテストデータセットを使用します。 テストデータセットのターゲット値は通常、非表示になっています。 モデルを開発してトレーニングするには、少なくとも1つのトレーニングデータセットと1つの検証データセットが必要です。 場合によっては、1つのデータセットのみを受け取ることがあります。 このような場合、次の図に示すように、データセットを2つまたは3つのグループに分割できます。

各データセットは、入力とターゲットで構成されています。 入力をxまたはXで表し、ターゲットをyまたはYで表すのが一般的です。 各データセットを区別するために、train、val、およびtestという接尾辞を追加します。

このレシピでは、PyTorchデータツールについて学習します。 これらのツールを使用して、データを読み込んで処理できます。

How to do it...

次のセクションでは、PyTorchパッケージを使用してデータセットを操作する方法を学習します。

Loading a dataset

PyTorchのtorchvisionパッケージは、人気のある複数のデータセットを提供します。

torchvisionからMNISTデータセットをロードしてみましょう。

  1. まず、MNISTトレーニングデータセットを読み込みます。
  2. 次に、入力データとターゲットラベルを抽出します。
  3. 次に、MNISTテストデータセットを読み込みます。
  4. 次に、入力データとターゲットラベルを抽出します。
  5. その後、テンソルに新しい次元を追加します。

    それでは、いくつかのサンプル画像を表示してみましょう。
  6. 次に、必要なパッケージをインポートします。
  7. 次に、テンソルを画像として表示するヘルパー関数を定義します。
  8. 次に、画像のグリッドを作成して表示します。

結果は次の画像に示されています。

次のセクションでは、データセットとともにデータ変換を使用する方法を示します。

Data transformation

画像変換(オーグメンテーションとも呼ばれる)は、 モデルのパフォーマンスを向上させるために使用される効果的な手法です。 torchvisionパッケージは、変換クラスを通じて一般的な画像変換を提供します。 見てみましょう:

  1. MNISTデータセットにいくつかの画像変換を適用するために、変換クラスを定義してみましょう。
  2. MNISTデータセットの画像に変換を適用してみましょう。


    結果は次の画像に示されています。
  3. 変換関数をデータセットクラスに渡すこともできます。

次のセクションでは、テンソルからデータセットを作成する方法を示します。

Wrapping tensors into a dataset

データがテンソルで利用できる場合は、TensorDatasetクラスを使用してそれらをPyTorchデータセットとしてラップできます。 これにより、トレーニング中にデータを反復することが容易になります。 始めましょう:

  1. x_trainとy_trainをラップしてPyTorchデータセットを作成しましょう:

次のセクションでは、データローダーの定義方法を示します。

Creating data loaders

トレーニング中にデータを簡単に反復処理するために、次のようにDataLoaderクラスを使用してデータローダーを作成できます。

  1. トレーニングおよび検証データセット用の2つのデータローダーを作成してみましょう。

次のセクションでは、各ステップについて詳しく説明します。

How it works...

最初に、データセットパッケージをtorchvisionからインポートしました。 このパッケージには、MNISTを含むいくつかの有名なデータセットが含まれています。 次に、MNISTトレーニングデータセットをローカルフォルダーにダウンロードしました。 ダウンロードしたら、今後の実行でダウンロードフラグをFalseに設定できます。 次に、入力データとターゲットラベルをPyTorchテンソルに抽出し、そのサイズを出力しました。 ここでは、トレーニングデータセットには60,000の入力とターゲットが含まれています。 次に、MNISTテストデータセットに対して同じ手順を繰り返しました。 MNISTテストデータセットをダウンロードするには、trainフラグをFalseに設定します。 ここでは、テストデータセットに10,000の入力とターゲットが含まれています。

次に、テンソルの形状をB * C * H * Wにするため、入力テンソルに新しい次元を追加しました。 ここで、B、C、H、およびWは、それぞれバッチサイズ、チャネル、高さ、および幅です。 これは、PyTorchの入力テンソルの一般的な形状です。 次に、サンプル画像を表示するヘルパー関数を定義しました。 torchvisionのutilsを使用して、5行8列に40画像のグリッドを作成しました。

データ変換サブセクションでは、torchvision.transformsパッケージを紹介しました。 このパッケージは、複数の変換機能を提供します。 データセットを拡張するRandomHorizontalFlipメソッドとRandomVerticalFlipメソッド、 および画像をPyTorchテンソルに変換するToTensorメソッドを構成しました。 水平および垂直反転の確率は、次のステップで反転を強制するためにp = 1に設定されました。 サンプル画像にデータ変換を使用しました。 元の画像と変換された画像を確認してください。 変換された画像は、垂直方向と水平方向の両方に反転されました。

次に、transformer関数をデータセットクラスに渡しました。 このようにして、データ変換はオンザフライで行われます。 これは、一度にメモリにロードできない大きなデータセットの場合に役立つテクニックです。

テンソルのデータセットサブセクションへのラップでは、テンソルからデータセットを作成しました。 たとえば、x_trainとy_trainをラップすることでPyTorchデータセットを作成できます。 この手法は、入力データと出力データがテンソルとして利用できる場合に役立ちます。

データローダーの作成サブセクションでは、DataLoaderクラスを使用してデータローダーを定義しました。 これは、トレーニングまたは評価中にデータセットを簡単に反復するための優れた手法です。 データローダーを作成するとき、バッチサイズを指定する必要があります。 train_dsとval_dsから2つのデータローダーを作成しました。 次に、train_dlからミニバッチを抽出しました。 ミニバッチの形状を確認してください。