pytorch-Train-Val-Test劃分(下)

pytorch-Train-Val-Test劃分(下)

2019-11-17閱讀 2860

上半節講到一個數據集正常需要劃分爲train、validation和test三個數據集,那麼具體到代碼中是如何實現的?

需要注意的是正常代碼提供的是兩種劃分,即train和test兩部分,我們在劃分train的數據集中再劃分爲兩部分,即可設定val數據集。

代碼如下

print('train:', len(train_db), 'test:', len(test_db))
# 首先先查看train和test數據集的數量,看看是否滿足預訂的分配目標
train_db, val_db = torch.utils.data.random_split(train_db, [50000, 10000])
# 隨機分配法將數據分爲50k和10k的數量
train_loader = torch.utils.data.DataLoader(
    train_db,
    batch_size = batch_size, shuffle=True)
# 將數據餵給Loader中
val_loader = torch.utils.data.DataLoader(
    val_db,
    batch_size = batch_size, shuffle=True)

那麼這種劃分方式也會有一些問題,如下圖,假設我們得到的總數據量爲70k。

1620uploading.4e448015.gif正在上傳…重新上傳取消

那麼此時test set中的數據是無法使用的,這樣便只有50K+10K的數據集可以供給神經網絡學習,而還有10K的val數據集無法用於backward。因此爲增加數據量,使函數模型更準確,我們使用K-fold cross-validation法,將這60K數據重新隨機劃分出50K的train set和10K的Val set。如下圖所示

1620uploading.4e448015.gif正在上傳…重新上傳取消

這樣白色部分爲新劃分的Val set,兩個黃色部分加一塊爲Train set。

依次類似,每進行一次epoch,便將新的數據餵給了train set。這樣做的好處是使得數據集中的每一個數據都有可能加入到train set中,防止神經網絡對相同的數據產生一個記憶特性。

叫K-fold cross-validation的原因在於

假設有60K的train+val數據集可供使用,分成了N份。

每次取N-1/N份用來做train,另外1/N份用來做validation,

這種方式總的來說對神經網絡的提升不會很大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章