FPN_Pytorch实现(pytorch 0.2.0版本,0.2.0迁移到0.4.0版本)

参考源码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()

在这里插入图片描述

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: segmentation_models_pytorch 是一个基于 PyTorch 的图像分割库,可以用来训练语义分割模型。下面是使用 segmentation_models_pytorch 实现单模型训练的基本步骤: 1. 安装 segmentation_models_pytorch 和其依赖项: ``` pip install segmentation-models-pytorch ``` 2. 加载数据集并进行预处理。可以使用 torchvision 或者其他图像处理库加载数据集,并对数据进行预处理,如裁剪、缩放、归一化等操作。 3. 定义模型。使用 segmentation_models_pytorch 中提供的模型类(如 UNet、FPN、PSPNet 等)来定义模型。 ```python import segmentation_models_pytorch as smp model = smp.Unet( encoder_name="resnet34", # 使用 ResNet34 作为编码器 encoder_weights="imagenet", # 加载预训练权重 in_channels=3, # 输入通道数 classes=2, # 分类数 ) ``` 4. 定义损失函数和优化器。可以选择使用交叉熵损失函数和 Adam 优化器。 ```python import torch.nn as nn import torch.optim as optim criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) ``` 5. 训练模型。使用 DataLoader 加载数据集,并对模型进行训练。 ```python from torch.utils.data import DataLoader train_loader = DataLoader(dataset, batch_size=4, shuffle=True) for epoch in range(num_epochs): running_loss = 0.0 for i, data in enumerate(train_loader, 0): inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print(f"Epoch {epoch+1}, Loss: {running_loss/len(train_loader)}") ``` 6. 保存模型。训练完毕后,可以使用 torch.save() 方法将模型保存到本地。 ```python torch.save(model.state_dict(), "model.pth") ``` ### 回答2: segmentation_models_pytorch是一个基于PyTorch实现的语义分割模型库。使用segmentation_models_pytorch实现单模型训练可以通过以下步骤完成。 首先,安装segmentation_models_pytorch库。可以通过pip install segmentation_models_pytorch命令来安装。 导入所需的库和模型。常用的库包括torch,torchvision和segmentation_models_pytorch。可以使用以下命令导入库: ```python import torch import torchvision.transforms as transforms import segmentation_models_pytorch as smp ``` 加载和预处理训练数据。可以使用torchvision中的transforms来定义一系列的数据预处理操作,例如裁剪、缩放和标准化等。之后,使用torch.utils.data.DataLoader来加载和批量处理数据。 定义模型架构。可以选择使用segmentation_models_pytorch中预定义的模型架构,例如UNet、PSPNet和DeepLab等。根据任务需求选择合适的模型,并初始化相关参数。 定义优化器和损失函数。常见的优化器有Adam和SGD等,损失函数常选择交叉熵损失函数。可以使用torch.optim中的函数来定义优化器,使用torch.nn中的损失函数来定义损失函数。 进行模型训练。使用torch.utils.data.DataLoader加载训练数据集,并迭代训练数据集中的每个批次。将批次数据输入模型中进行前向传播,获取模型的输出。计算损失,并进行反向传播更新模型的参数。重复以上步骤直到达到预定的训练轮数或达到设定的训练目标。 保存和加载训练好的模型。可以使用torch.save函数将训练好的模型保存到指定的文件路径,使用torch.load函数加载保存的模型文件。 以上是使用segmentation_models_pytorch实现单模型训练的基本步骤。根据具体任务和数据的不同,可能还需要进行一些细节操作,例如数据增强、学习率调整和模型评估等。 ### 回答3: segmentation_models_pytorch是一个基于PyTorch的分割模型训练库,可以应用于图像分割任务。下面我将介绍如何使用segmentation_models_pytorch实现单模型训练。 首先,我们需要安装segmentation_models_pytorch库。可以使用pip命令进行安装: ``` pip install segmentation-models-pytorch ``` 在训练之前,我们需要准备好训练数据和标签。通常情况下,训练数据是一些图像,标签则是对应每个像素点的分类或分割结果。 接下来,我们需要导入所需的库: ``` import segmentation_models_pytorch as smp import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, Dataset ``` 然后,我们需要创建一个自定义的数据集类,该类继承自torch.utils.data.Dataset类,并实现__len__和__getitem__方法,用于加载和处理数据。 接着,我们可以选择一个合适的分割模型,比如Unet、FPN等。这些模型可以通过调用smp库中的函数进行初始化,比如: ``` model = smp.Unet( encoder_name="resnet34", encoder_weights="imagenet", classes=1, activation='sigmoid' ) ``` 在这里,我们选择了一个使用ResNet-34作为编码器、预训练权重为ImageNet数据集、分类数为1(二分类问题)的Unet模型。 然后,我们可以定义损失函数和优化器: ``` criterion = nn.BCELoss() optimizer = optim.Adam(model.parameters(), lr=0.001) ``` 接着,我们可以进行训练循环,依次迭代数据进行训练和优化: ``` for epoch in range(num_epochs): for batch in dataloader: inputs, labels = batch optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() ``` 最后,我们可以保存模型并在需要预测时加载模型进行测试: ``` torch.save(model.state_dict(), "segmentation_model.pt") model.load_state_dict(torch.load("segmentation_model.pt")) ``` 以上就是使用segmentation_models_pytorch实现单模型训练的过程。根据具体任务需求,你也可以调整模型、损失函数、优化器等参数来进行更灵活的训练。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值