導入
これまでは小さなデータを一度に全部モデルへ渡していました。しかし実際のデータは数万〜数百万件。全部を一度に扱うのは非効率です。そこで バッチ(小分け) で供給する仕組みが Dataset と DataLoader です。
説明
- バッチ学習:データを例えば32件ずつの塊(ミニバッチ)に分け、塊ごとに更新する。メモリに優しく、学習も安定・高速。
- Dataset:データ1件を取り出す方法を定義する入れ物。
- DataLoader:Dataset から自動でバッチを作り、シャッフルもしてくれる供給役。
flowchart LR ds["Dataset<br/>全データ(例: 5万件)"] --> dl["DataLoader<br/>32件ずつのバッチに<br/>分割・シャッフル"] dl --> loop["各バッチで<br/>zero_grad→…→step"]
コードの型はこうです。
from torch.utils.data import TensorDataset, DataLoader
dataset = TensorDataset(X, Y) # 入力と正解を束ねる
loader = DataLoader(dataset, batch_size=32, shuffle=True)
for epoch in range(10):
for batch_x, batch_y in loader: # バッチごとに取り出す
optimizer.zero_grad()
loss = criterion(model(batch_x), batch_y)
loss.backward()
optimizer.step()
「エポック」(データ全体を1周)の中で、「バッチ」ごとに更新が回る二重ループになります。1エポック=バッチ数ぶんの更新、という関係です。
用語の整理
| 用語 | 意味 |
|---|---|
| バッチサイズ | 1回の更新で使うデータ件数(例: 32) |
| イテレーション | バッチ1個ぶんの更新(1回の step) |
| エポック | データ全体を1周(= 全件 ÷ バッチサイズ 回の更新) |
まとめ
- 大きなデータは バッチ(ミニバッチ) に小分けして学習する。安定・高速・省メモリ。
- Dataset がデータの取り出し方、DataLoader がバッチ化・シャッフルを担当。
- ループは「エポック(全周)× バッチ(小分け)」の二重構造になる。