當我使用大神利用pytorch復現的SSD網絡進行訓練時,遇到如下問題:
1、loss突然變爲NAN
問題分析及解決方案:由於我的顯存只有4G,因此將默認的batch_size由32改爲了2。在batch_size減小的情況下,應適當減小學習率,即可解決問題。比較合適的組合如下:
batch_size=32 lr=1e-3
batch_size=8 lr=1e-4
batch_size=2 lr=1e-5
2、Stop Iteration(自動跳出迭代)
#使用如下代碼代替:images, targets = next(batch_iterator)
try:
images, targets = next(batch_iterator)
except StopIteration:
batch_iterator=iter(data_loader)
images, targets = next(batch_iterator)
3、loss_c[pos] = 0,提示Pos與loss_c形狀不匹配
#在loss_c[pos]=0前添加如下代碼,改變loss_c形狀
loss_c = loss_c.view(pos.size()[0],pos.size()[1])
4、在GPU下執行webcam demo
源碼中live.py文件默認只能在cpu下執行,如果想要在gpu下執行,則需要修改如下幾處代碼:
#1、新增代碼:創建網絡對象net後,將其轉移到gpu上
if args.cuda > 0:
net.cuda()
# 2、修改代碼:將 cv2_demo(net.eval(), transform)改爲如下代碼
with torch.no_grad():
cv2_demo(net.eval(), transform)
#3、新增代碼:在函數predict裏的x = Variable(x.unsqueeze(0))代碼後新增如下代碼,將輸入轉移到gpu上計算
if args.cuda > 0:
x = x.cuda()
#4、ssd.py文件中detect函數的輸入self.priors.type(type(x.data)) 改爲如下代碼
self.priors.type_as(x)