参考源码github地址:
https://github.com/guoruoqian/FPN_Pytorch/
不知道原作者是否能够跑通,在自己的环境中,基于pytorch 0.2.0(python2.7)和pytorch 0.4.0(python3.5)都有些许bug。
下面记录两种环境中,出现的问题和pytorch 0.2版本迁移到0.4版本时,应该注意的地方。
另一篇ssd.pytorch,记录了ssd算法中pytorch 0.2迁移到0.4时,出现的问题。
准备:
1) 下载预训练模型
2) 数据集
3)编译
cd FPN_Pytorch
cd lib
说明:lib里面的make.sh的脚本,我这里根据python的版本来修改,python默认是python2.7, python3指代python3.5
./make.sh
Pytorch(0.2.0) + python(2.7)
python trainval_net.py exp_name --dataset pascal_voc --net res101 --bs 2 --nw 4 --lr 1e-3 --epochs 12 --save_dir weights --cuda
问题1:RuntimeError: reciprocal is not implemented for type torch.cuda.LongTensor
解决方法:
在lib/model/rpn/anchor_target_layer_fpn.py中,line 141:
num_examples = torch.sum(labels[i] >=0
positive_weights = 1.0 / num_examples
negative_weights = 1.0 / num_examples
改为:(添加一行)
num_examples = torch.sum(labels[i] >=0
num_examples = num_examples.type(torch.cuda.FloatTensor)
positive_weights = 1.0 / num_examples
negative_weights = 1.0 / num_examples
问题2:TypeError: index(): argument ‘indices’ (position 1) must be tuple of Tensors, not Tensor
解决方法:
在lib/model/rpn/proposal_target_layer.py , line 133
labels = gt_boxes[:,:,4].contiguous().view(-1).index(offset.view(-1))\
.view(batch_size, -1)
改为:
labels = gt_boxes[:,:,4].contiguous().view(-1).index((offset.view(-1),))\
.view(batch_size, -1)
问题3:torch.FatalError: invalid argument 2: out of range at /pytorch/aten/src/THC/generic/THCTensor.c:23
解决方法:
在lib/model/roi_align/functions/roi_align.py line 27
if features.is_cuda:
roi_align.roi_align_forward_cuda(self.aligned_height,
self.aligned_width,
self.spatial_scale, feature,
rois, output)
这里提示错误line 27 in forward rois, output)处。
在下面0.2迁移0.4版本的环境中,详细说明这个问题。
整个forward(self, feature, rois)的实现过程如下
def forward(self, features, rois):
self.rois = rois
self.feature_size = features.size()
batch_size, num_channels, data_height, data_width = features.size()
num_rois = rois.size(0)
output = features.new(num_rois, num_channels, self.aligned_height, self.aligned_width).zero_()
if features.is_cuda:
roi_align.roi_align_forward_cuda(self.aligned_height,
self.aligned_width,
self.spatial_scale, feature,
rois, output)
添加 rois 的判断条件
def forward(self, features, rois):
########## add by ndtt #######
if len(rois.size()) == 1:
rois = rois.resize_((1,) + rois.size())
self.rois = rois
self.feature_size = features.size()
batch_size, num_channels, data_height, data_width = features.size()
num_rois = rois.size(0)
output = features.new(num_rois, num_channels, self.aligned_height, self.aligned_width).zero_()
if features.is_cuda:
roi_align.roi_align_forward_cuda(self.aligned_height,
self.aligned_width,
self.spatial_scale, feature,
rois, output)
**
问题4:RuntimeError: zero-dimensional tensor(at position 3) cannot be concatenated
**
解决方法:
在lib/model/fpn/fpn.py, line 141
添加打印信息:
roi_pool_feat = torch.cat(roi_pooling_feats, 0)
for t in box_to_levels:
print(t)
print(t.size())
box_to_level = torch.cat(box_to_levels, 0)
输出信息如上图所示:(176,) (53,) (26,) (),当只有一个元素时,tensor(54, device=‘cuda:0’),这里应该是一个元素的元祖,tensor([54], device=‘cuda:0’)
添加判断条件,添加代码
box_to_levels = []
for i, l in enumerate(range(2, 6)):
if (roi_level == l).sum() == 0:
continue
idx_l = (roi_level == l).nonzero().squeeze()
box_to_levels.append(idx_l)
改变为:
box_to_levels = []
for i, l in enumerate(range(2, 6)):
if (roi_level ==l).sum() == 0:
continue
idx_l = (roi_level == l).nonzero().squeeze()
if len(idx_l.size()) == 0:
idx_l = idx_l.expand(1)
box_to_levels.append(idx_l)
Pytorch(0.4.0) + Python(3.5),(pytorch 0.2迁移到0.4)
问题1:RuntimeError: reciprocal is not implemented for type torch.cuda.LongTensor
解决方法同上面问题1
问题2: TypeError: index(): argument ‘indices’ (position 1) must be tuple of Tensors, not Tensor
解决方法同上面问题2
问题3:torch.FataleError: invalid argument 2: out of range at /pytorch/aten/src/THC/generic/THCTensor.c:23
问题原因:
def forward(self, features, rois):
self.rois = rois
self.feature_size = features.size()
batch_size, num_channels, data_height, data_width = features.size()
num_rois = rois.size(0)
print(num_rois)
print(self.rois)
print(self.rois.size())
打印信息:
添加判断条件和代码实现,由于版本的不同,处理方式也不一样
def forward(self, features, rois):
if torch.numel(rois) == 5:
rois = rois.view(-1, 5)
self.rois = rois
self.feature_size = features.size()
batch_size, num_channels, data_height, data_width = features.size()
num_rois = rois.size(0)
torch.numel(),获取tensor类型数据中元素的个数
问题4:RuntimeError: zero-dimensional tensor (at position 3) cannot be concatenated
解决方法同上面问题4
问题5:由于版本问题,出现的警告信息,例如:
1) UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument
2) UserWarning: invalid index of a 0-dim tensor. This will be an error in Pytorch 0.5. Use tensor.ietm() to convert a 0-dim tensor to a Python number
loss_rcnn_cls = RCNN_loss_cls.data[0]
变为:
loss_rcnn_cls = RCNN_loss_cls.data.item()