torch.utils.data.DatasetとDataLoader

PyTorchにおけるデータ処理と前処理の中核を担う仕組みとして、torch.utils.data.Datasettorch.utils.data.DataLoaderが提供されています。これらは、機械学習モデルに効率的かつ柔軟にデータを供給するための基本構造です。それぞれの役割と使い方について、詳しく説明します。


1. torch.utils.data.Datasetとは

概要

Datasetは、データセット全体を定義するための抽象クラスです。PyTorchの学習・推論で使用するデータ(画像、テキスト、数値など)をカスタムデータセットとして扱うために、これを継承して独自クラスを実装します。

主な目的

  • データの読み込みロジックを定義する

  • データの前処理(例:正規化、リサイズ、トークナイズなど)を行う

  • 各サンプルにアクセスできるようにする

実装すべきメソッド

python
from torch.utils.data import Dataset class MyDataset(Dataset): def __init__(self, data_paths, transform=None): self.data_paths = data_paths self.transform = transform def __len__(self): return len(self.data_paths) def __getitem__(self, idx): data = load_data(self.data_paths[idx]) if self.transform: data = self.transform(data) return data
  • __init__:初期化(パスの保存や前処理の準備)

  • __len__:データセットのサイズを返す

  • __getitem__:インデックスを指定してデータを1件取得する(学習ループ中に自動的に呼ばれる)


2. torch.utils.data.DataLoaderとは

概要

DataLoaderは、Datasetから効率的にデータをバッチ単位で取り出すイテレータです。並列読み込み、シャッフル、バッチ処理などを制御できます。

主な目的

  • バッチ処理の自動化

  • データのシャッフル(ランダムな順序で取得)

  • マルチスレッドによる高速読み込みnum_workers指定)

基本的な使い方

python
from torch.utils.data import DataLoader dataset = MyDataset(data_paths, transform=...) dataloader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4) for batch in dataloader: # バッチごとにモデルに入力 outputs = model(batch)

主な引数

引数 説明
dataset 対象のDatasetインスタンス
batch_size 1回の学習に使うサンプル数
shuffle 各エポックのデータの順序をランダムにする
num_workers データ読み込みに使うプロセス数(CPUを並列活用)
drop_last 最後の不完全なバッチを破棄するか(True/False)

3. 実践的な例(画像分類タスク)

python
from torchvision import transforms from torchvision.datasets import ImageFolder from torch.utils.data import DataLoader # 画像前処理 transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), ]) # データセット dataset = ImageFolder(root='data/train', transform=transform) # データローダー dataloader = DataLoader(dataset, batch_size=64, shuffle=True, num_workers=2) # 学習ループで使用 for images, labels in dataloader: outputs = model(images) loss = criterion(outputs, labels) ...

4. まとめ

要素 機能
Dataset データの取り出し方・前処理を定義する
DataLoader バッチ化、シャッフル、高速読み出しを提供する

この2つを適切に使うことで、大規模データでも効率的かつ柔軟に処理を行うことができ、PyTorchでの学習パイプラインが大幅に最適化されます。特にデータのボトルネックを減らす上でnum_workerspin_memoryの調整も重要なチューニングポイントとなります。

生成日:2025/05/22