「Pytorch:data」の版間の差分

提供:classwiki
ナビゲーションに移動 検索に移動
44行目: 44行目:
独自のデータセットを扱う場合には,通常はデータは画像ファイルとして保存されていると思います.その場合,ImageFolder というクラスを使えます(識別タスクの場合).これについては,後ほど演習で扱います.
独自のデータセットを扱う場合には,通常はデータは画像ファイルとして保存されていると思います.その場合,ImageFolder というクラスを使えます(識別タスクの場合).これについては,後ほど演習で扱います.


== transforms ==
=== transforms ===
前処理の機能を集めたクラスです.
前処理の機能を集めたクラスです.



2025年2月22日 (土) 15:42時点における版

データセットの扱い

Pytorch でデータセットを扱う練習と,データ拡張(data augmentation)機能の実装方法について学びます.

Pytorch におけるデータローダーとは

PyTorchにおける DataLoader は、大規模なデータセットを効率的にミニバッチに分割し、前処理やシャッフルを行いながら,モデルに供給するための機能です。

前処理には,Pytorchでの用いた学習・推論のために最低限必要な処理と,

  1. 縦横のサイズ(解像度)調整
  2. 型キャスト

学習後の精度をより良くするためのデータ拡張があります.

  1. ランダムな左右反転
  2. ランダムな並進
  3. ランダムな回転
  4. ランダムな色変更
  5. ランダムなマスク処理

など.

データローダーの基本

以下は,最もシンプルな例.

# ライブラリのインポート
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

# 前処理
transform = transforms.Compose([
    transforms.ToTensor(),
])

# データローダーの作成
ds = datasets.STL10(root='./data', split='train', download=False, transform=transform)
tl = DataLoader(ds, batch_size=batch_size, shuffle=True)

ここで,torchvision とは,Pytorch で画像データを扱うときに使える便利なライブラリです.Torchvision に含まれる datasets というモジュールはデータのファイルの読み込みやデータセットの分割(学習用・検証用・テスト用に分割)などに,transforms というモジュールはデータの前処理に,それぞれ使われます.また,torch.utils.data (torch の中の utils の中の data というモジュール)に含まれる DataLoader というモジュールは,その名の通りデータローダーを作成するために使われます.

ちなみに,音声データを扱いたい場合には,torchaudio というライブラリもあります.(私は使ったことはありませんが.)

datasets

この datasets というモジュールでは,CIFAR-10 や STL-10 のように,ベンチマークによく使われるデータセットを扱うためのクラスが用意されています.上記の例では,datasets.STL10 というクラスが使われていますね.このようなデータセットは,大抵の場合,画像が .png や .jpeg のような標準の画像ファイルではなく,バイナリ形式で保存されています.試しに STL-10 のデータセットが保存されているディレクトリを見てみると,以下のようになっています.

$ ls ./data/stl10_binary
class_names.txt  fold_indices.txt  test_X.bin  test_y.bin  train_X.bin  train_y.bin  unlabeled_X.bin

独自のデータセットを扱う場合には,通常はデータは画像ファイルとして保存されていると思います.その場合,ImageFolder というクラスを使えます(識別タスクの場合).これについては,後ほど演習で扱います.

transforms

前処理の機能を集めたクラスです.

以下のように処理を並べてやると,書いた順序で実行してくれます.

transform = transforms.Compose([
    処理1,
    処理2,
    処理3,
    ...
])

ここで使われる処理のほとんどは transforms の中に用意されており,自分で実装する必要はありません.もちろん,独自の処理を実装することも可能ですが,そのような機会はあまりないと思います.

必ず必要なのは,transforms.ToTensor() です.これは,読み込んだデータの型をキャストして torch.Tensor 型にします.ちなみに,transforms.ToTensor 自体はクラスであるため,以下のようには書けません.

transform = transforms.Compose([
    transforms.ToTensor,
    ...
])

以下のように,transforms.ToTensor() として生成したインスタンスを並べるのが,正しい書き方です.これは,ToTensor 以外のクラスでも同様です.

transform = transforms.Compose([
    transforms.ToTensor(),
    ...
])