当我使用大神利用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)