PyTorch의 MaskR-CNN에서 Focal로스 도입
17064 단어 PyTorch손실 함수focal-lossmask-r-cnn
이 보도가 해야 할 일
PyTorch에서MaskR-CNN을 설치할 때에서 "focal loss"를 가져오고 싶습니다.
그래서 나는 이 글을 도입하려고 노력했다.포칼 로스의 해설 기사가 아니라
모티프
자기가 사용하는 데이터의 편차가 크기 때문에 RetinaNet처럼 포칼 로스를 가져오면 식별률이 좋아지지 않을까 싶어요.이 때문에'매스카르-CNN에 포칼 로스를 가져오고 싶다'는 생각까지 들었다.
분류된loss함수가 어디 있어요?
찾아봤는데 여기.에 있어요.
PyTroch의MaskR-CNN과FasterR-CNN의 분류에서crossentropy를 사용하고 있는 것 같습니다.
이루어지다
이 논단 구현 참조
코드 자체가 이거야.
focal_loss
class FocalLoss(nn.Module):
def __init__(self, weight=None,
gamma=2.5, reduction='mean'):
nn.Module.__init__(self)
self.gamma = gamma
self.reduction = reduction
self.weight=weight
def forward(self, input_tensor, target_tensor):
log_prob = F.log_softmax(input_tensor, dim=-1)
prob = torch.exp(log_prob)
return F.nll_loss(
((1 - prob) ** self.gamma) * log_prob,
target_tensor,
weight=self.weight,
reduction = self.reduction
)
가져오십시오fastrcnn_loss.여기에서 파일 이름을 my로 설정합니다fastrcnn_loss_with_focal_loss.py로 저장합니다.my_fastrcnn_loss_with_focal_loss.py
import torch.nn.functional as F
from torch import nn
class FocalLoss(nn.Module):
def __init__(self, weight=None,
gamma=2.5, reduction='mean'):
nn.Module.__init__(self)
self.weight=weight
self.gamma = gamma
self.reduction = reduction
def forward(self, input_tensor, target_tensor):
log_prob = F.log_softmax(input_tensor, dim=-1)
prob = torch.exp(log_prob)
return F.nll_loss(
((1 - prob) ** self.gamma) * log_prob,
target_tensor,
weight=self.weight,
reduction = self.reduction
)
def fastrcnn_loss(class_logits, box_regression, labels, regression_targets):
# type: (Tensor, Tensor, List[Tensor], List[Tensor]) -> Tuple[Tensor, Tensor]
"""
Computes the loss for Faster R-CNN.
Args:
class_logits (Tensor)
box_regression (Tensor)
labels (list[BoxList])
regression_targets (Tensor)
Returns:
classification_loss (Tensor)
box_loss (Tensor)
"""
labels = torch.cat(labels, dim=0)
regression_targets = torch.cat(regression_targets, dim=0)
#この部分をfocal_lossへ変更する
#classification_loss = F.cross_entropy(class_logits, labels)
focal=FocalLoss()
classification_loss = focal(class_logits, labels)
#変更はここまで
# get indices that correspond to the regression targets for
# the corresponding ground truth labels, to be used with
# advanced indexing
sampled_pos_inds_subset = torch.where(labels > 0)[0]
labels_pos = labels[sampled_pos_inds_subset]
N, num_classes = class_logits.shape
box_regression = box_regression.reshape(N, box_regression.size(-1) // 4, 4)
box_loss = F.smooth_l1_loss(
box_regression[sampled_pos_inds_subset, labels_pos],
regression_targets[sampled_pos_inds_subset],
beta=1 / 9,
reduction='sum',
)
box_loss = box_loss / labels.numel()
return classification_loss, box_loss
이후, 저번와 같은 방식으로MaskR-CNN을 실현한 후, 특히model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)
뒤에 코드를 삽입합니다.(중간 코드는 공식 튜토리얼)mask_rcnn_model.py
import torchvision
from torchvision.models.detection.faster_rcnn import FastRCNNPredictor
model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
num_classes = 2
in_features = model.roi_heads.box_predictor.cls_score.in_features
model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)
#ここまででネットワークを作る
#ここから損失関数を変更していく
from my_fastrcnn_loss_with_focal_loss import fastrcnn_loss
torchvision.models.detection.roi_heads.fastrcnn_loss=fastrcnn_loss
.따라서 focal loss를 Mask R-CAN에 설치할 수 있습니다.(다 했을 텐데)잡담
weight 설정 시
class FocalLoss(nn.Module):
def __init__(self,
gamma=2.5, reduction='mean'):
nn.Module.__init__(self)
self.weight=self.weight = torch.tensor([1. ,100. ,2. ,2. ,1.]).cuda()
self.gamma = gamma
self.reduction = reduction
def forward(self, input_tensor, target_tensor):
...
쿠다 코어에 설정하면 잘 될 거예요.끝맺다
실제로 포칼 로스 도입과 관련해 리지온 프로포즈al 네트워크를 사용하는 모델이 별다른 효과가 없을 것이라는 우려가 제기됐는데, 과연 어떻게 될까.
약간의 의문이 있지만 설치 자체는 이미 완성된 것 같다.잘 됐다.
Reference
이 문제에 관하여(PyTorch의 MaskR-CNN에서 Focal로스 도입), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Kaiya_ppp/items/36638fe30bbb1e87d5fb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)