Pytorch dataloader在加載最後一個batch時卡死的解決

問題:

自己寫瞭個dataloader,為瞭部署方便,用OpenCV的接口進行數據讀取,而沒有用PIL,代碼大致如下:

    def __getitem__(self, idx):
        sample = self.samples[idx]
 
        img = cv2.imread(sample[0])
        img = cv2.resize(img, tuple(self.input_size))
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        # if not self.val and random.randint(1, 10) < 3:
        #     img = self.img_aug(img)
        img = Image.fromarray(img) 
        img = self.transforms(img)        
        ...

結果在訓練過程中,在第1個epoch的最後一個batch時,程序卡死。

解決方案:

可能是因為OpenCV與Pytorch互鎖的問題,關閉OpenCV的多線程,問題解決。

cv2.setNumThreads(0)
cv2.ocl.setUseOpenCL(False)

補充:pytorch 中一個batch的訓練過程

# 一般情況下
optimizer.zero_grad()             # 梯度清零
preds = model(inputs)             # inference,前向傳播求出預測值
loss = criterion(preds, targets)  # 計算loss
loss.backward()                   # 反向傳播求解梯度
optimizer.step()                  # 更新權重,更新網絡權重參數

此外,反向傳播前,如果不進行梯度清零,則可以實現梯度累加,從而一定程度上解決顯存受限的問題。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: