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。
那麼此時test set中的數據是無法使用的,這樣便只有50K+10K的數據集可以供給神經網絡學習,而還有10K的val數據集無法用於backward。因此爲增加數據量,使函數模型更準確,我們使用K-fold cross-validation法,將這60K數據重新隨機劃分出50K的train set和10K的Val set。如下圖所示
這樣白色部分爲新劃分的Val set,兩個黃色部分加一塊爲Train set。
依次類似,每進行一次epoch,便將新的數據餵給了train set。這樣做的好處是使得數據集中的每一個數據都有可能加入到train set中,防止神經網絡對相同的數據產生一個記憶特性。
叫K-fold cross-validation的原因在於
假設有60K的train+val數據集可供使用,分成了N份。
每次取N-1/N份用來做train,另外1/N份用來做validation,
這種方式總的來說對神經網絡的提升不會很大。