PyTorchでクロスバリデーション
はじめに
Pytorch で Dataset を使用するときのクロスバリデーションのやり方を説明します。
Subsetを使用した分割
torch.utils.data.dataset.Subset
を使用するとインデックスを指定してDatasetを分割することが出来ます。これとscikit-learnのsklearn.model_selection
を組み合わせます。
train_test_split
sklearn.model_selection.train_test_split
を使用してインデックスをtrain_index
とvalid_index
に分割し、Subset
を使用してDatasetを分割します。
from torch.utils.data import Dataset, DataLoader
from torch.utils.data.dataset import Subset
from sklearn.model_selection import train_test_split
dataset = get_dataset()
train_index, valid_index = train_test_split(range(len(dataset)), test_size=0.3)
batch_size = 16
train_dataset = Subset(dataset, train_index)
train_dataloader = DataLoader(train_dataset, batch_size, shuffle=True)
valid_dataset = Subset(dataset, valid_index)
valid_dataloader = DataLoader(valid_dataset, batch_size, shuffle=False)
# ここに学習コード
KFoldクロスバリデーション
sklearn.model_selection.KFold
を使用してインデックスをtrain_index
とvalid_index
に分割し、Subset
を使用してDatasetを分割します。
from torch.utils.data import Dataset, DataLoader
from torch.utils.data.dataset import Subset
from sklearn.model_selection import KFold
dataset = get_dataset()
batch_size = 16
kf = KFold(n_splits=3)
cv = 0
for _fold, (train_index, test_index) in enumerate(kf.split(X)):
train_dataset = Subset(dataset, train_index)
train_dataloader = DataLoader(train_dataset, batch_size, shuffle=True)
valid_dataset = Subset(dataset, valid_index)
valid_dataloader = DataLoader(valid_dataset, batch_size, shuffle=False)
for i in range(num_epochs):
# ここに学習コード
cv += valid_loss / kf.n_splits
クラス分類のDatasetであればdataset[:][1]
とすればy
の値を取得することができるはずなので、StratifiedKFold
もできるはずです。
Author And Source
この問題について(PyTorchでクロスバリデーション), 我々は、より多くの情報をここで見つけました https://qiita.com/ground0state/items/ad879a84bf946ef94da8著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .