PyTorchでNumpy配列からカスタムデータセットを作成して使用する方法
説明
>>> import numpy as np
>>> import torch
>>> from torch.utils.data import TensorDataset, DataLoader
$32\times 32$のサイズの「モノクロ」写真100枚を積み重ねたnumpy配列$X$と、それに対するラベル$Y$が用意されているとしよう。以下のコードで読み込んだとする。
>>> X = np.load("X.npy")
>>> X.shape
(100, 32, 32)
>>> Y = np.load("Y.npy")
>>> Y.shape
(100)
学習用のデータセットを作るために、次のようにnumpy配列をテンソルに変換する。
>>> X = torch.from_numpy(X)
>>> Y = torch.from_numpy(Y)
TensorDataset
で学習データをまとめる。もちろん、3種類以上のデータをまとめてデータセットを作ることも可能だ。
>>> train_data = TensorDataset(X, Y)
DataLoader
を使用して、データの順序をランダムにシャッフルし、望むバッチサイズで作成できる。例えば、バッチサイズを25に設定した場合、合計100であるため、$25 \times 32 \times 32$のサイズのデータが4つできることになる。
>> train_loader = DataLoader(train_data, batch_size=BATCH_SIZE, shuffle=True)
次のように学習関数を定義して使用できる。
def train(model):
model.train()
for batch_idx, (X, Y) in enumerate(Data_set):
optimizer.zero_grad()
output = model(X)
loss = criterion(output, Y)
loss.backward()
optimizer.step()
return loss
全コード
適切なモデルが定義されているとする。
#필요한 라이브러리 import
import numpy as np
import torch
from torch.utils.data import TensorDataset, DataLoader
#numpy 배열 불러오기
X = np.load("X.npy")
Y = np.load("Y.npy")
#tensor로 데이터 타입 변환
X = torch.from_numpy(X)
Y = torch.from_numpy(Y)
#데이터셋으로 변환
train_data = TensorDataset(X, Y)
#셔플, 배치사이즈 적용
train_loader = DataLoader(train_data, batch_size=BATCH_SIZE, shuffle=True)
#학습 함수 정의
def train():
model.train()
for batch_idx, (X, Y) in enumerate(Data_set):
optimizer.zero_grad()
output = model(X)
loss = criterion(output, Y)
loss.backward()
optimizer.step()
return loss
#학습
for epoch in range(1, EPOCHS):
loss = train()
print(loss)
環境
- OS: Windows10
- バージョン: Python 3.9.2, torch 1.8.1+cu111