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_lossclass 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.pyimport 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.pyimport 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.)
자기가 사용하는 데이터의 편차가 크기 때문에 RetinaNet처럼 포칼 로스를 가져오면 식별률이 좋아지지 않을까 싶어요.이 때문에'매스카르-CNN에 포칼 로스를 가져오고 싶다'는 생각까지 들었다.
분류된loss함수가 어디 있어요?
찾아봤는데 여기.에 있어요.
PyTroch의MaskR-CNN과FasterR-CNN의 분류에서crossentropy를 사용하고 있는 것 같습니다.
이루어지다
이 논단 구현 참조
코드 자체가 이거야.
focal_lossclass 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.pyimport 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.pyimport 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.)
이 논단 구현 참조
코드 자체가 이거야.
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.)
Reference
이 문제에 관하여(PyTorch의 MaskR-CNN에서 Focal로스 도입), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Kaiya_ppp/items/36638fe30bbb1e87d5fb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)