Pytorch實戰學習(四):加載數據集
《PyTorch深度學習實踐》完結合集_嗶哩嗶哩_bilibili
Dataset & Dataloader
1、Dataset & Dataloader作用
※Dataset—加載數據集,用索引的方式取數
※DataLoader—Mini-Batch
通過獲得DataSet的索引以及數據集大小,來自動得生成小批量訓練集
DataLoader先對數據集進行Shuffle,再將數據集按照Batch_Size的長度劃分為小的Batch,并按照Iterations進行加載,以方便通過循環對每個Batch進行操作
Shuffle=True:隨機打亂順序

2、Mini-Batch:
利用Mini-Batch均衡訓練性能和時間
在外層循環中,每一層是一個epoch(訓練周期),在內層循環中,每一次是一個Mini-Batch(Batch的迭代)
for epoch in range(training_epochs): for i in range(total_batch):
3、相關術語
※Epoch:所有樣本都參與了一次訓練
※Batch-size:進行一次訓練(前饋、反饋、更新)的樣本數
※Iteration:有多少個Batch,每次
Epoch = Batch-size * Iteration

4、代碼部分
在構造數據集時,兩種對數據加載到內存中的處理方式如下:
①加載所有數據到dataset,每次使用getitem()讀索引,適用于數據量小的情況
②只對dataset進行初始化,僅存文件名到列表,每次使用時再通過索引到內存中去讀取,適用于數據量大(圖像、語音…)的情況
import torch import numpy as np ## Dataset為抽象類,不能被實例化,只能被其他子類繼承 from torch.utils.data import Dataset ## 實例化DataLoader,用于加載數據 from torch.utils.data import DataLoader ## Prepare Data class DiabetesDataset(Dataset): def __init__(self, filepath): xy = np.loadtxt(filepath, delimiter=',', dtype=np.float32) ## 獲取數據集長度 self.len = xy.shape[0] self.x_data = torch.from_numpy(xy[:, :-1]) self.y_data = torch.from_numpy(xy[:, [-1]]) ## 索引:下標操作 def __getitem__(self, index): return self.x_data[index], self.y_data[index] ## 返回數據量 def __len__(self): return self.len dataset = DiabetesDataset('diabetes.csv.gz') ##num_workers多線程 train_loader = DataLoader(dataset = dataset, batch_size = 32, shuffle = True, num_workers = 0) ##Design Model ##構造類,繼承torch.nn.Module類 class Model(torch.nn.Module): ## 構造函數,初始化對象 def __init__(self): ##super調用父類 super(Model, self).__init__() ##構造三層神經網絡 self.linear1 = torch.nn.Linear(8, 6) self.linear2 = torch.nn.Linear(6, 4) self.linear3 = torch.nn.Linear(4, 1) ##激活函數,進行非線性變換 self.sigmoid = torch.nn.Sigmoid() ## 構造函數,前饋運算 def forward(self, x): x = self.sigmoid(self.linear1(x)) x = self.sigmoid(self.linear2(x)) x = self.sigmoid(self.linear3(x)) return x model = Model() ##Construct Loss and Optimizer ##損失函數,傳入y和y_pred,size_average--是否取平均 criterion = torch.nn.BCELoss(size_average = True) ##優化器,model.parameters()找出模型所有的參數,Lr--學習率 optimizer = torch.optim.SGD(model.parameters(), lr=0.01) ## Training cycle ## windows環境下DataLoader的num_workers設置為多線程,需要將主程序(對數據操作的程序)封裝到函數中 if __name__ =='__main__': for epoch in range(100): #enumerate:可獲得當前迭代的次數 for i, data in enumerate(train_loader, 0): ## 準備數據 inputs, lables = data ##前向傳播 y_pred = model(inputs) loss = criterion(y_pred, lables) print(epoch, i, loss.item()) ##梯度歸零 optimizer.zero_grad() ##反向傳播 loss.backward() ##更新 optimizer.step()
!!兩個問題??!
①DataLoader的參數num_workers設置 >0
在windows中利用多線程讀取,需要將主程序(對數據操作的程序)封裝到函數中
## Training cycle ## windows環境下DataLoader的num_workers設置為多線程,需要將主程序(對數據操作的程序)封裝到函數中 if __name__ =='__main__': for epoch in range(100): #enumerate:可獲得當前迭代的次數 for i, data in enumerate(train_loader, 0):
但是運行還是報錯,只能把num_workers = 0
②運行結果:損失不會一直下降,改小了學習率也不行


浙公網安備 33010602011771號