안녕하세요. Mask-RCNN 전이학습 모델 hook 관련 질문있습니다ㅠㅠ

안녕하세요. 졸업 논문 프로젝트에 torch제공 Mask-RCNN을 활용하고 있는 중에 잘 안되는 부분이 있어서 질문 남기는 파이토치 초보입니다.

제 데이터셋에 맞추어서 roi_heads의 cls_score와 bbox_pred 출력층을 바꾸어주어 학습 후 .eval() 과정에서 hook을 통해 해당 출력층의 결과를 따로 뽑아내려 하는데요, 해당 과정에서 출력결과가 계속 전이학습 전의 기본 세팅값인 91과 364로 나오네요ㅠㅠ

모델 수정 후에 그에 맞는 출력층 결과를 추출하려면 따로 설정이 필요한지, 해결법은 무엇인지 궁금합니다.

사용한 코드는 다음과 같습니다.

  • hook 코드
    activation = {}
    def get_activation(name):
    def hook(models, input, output):
    activation[name] = output.detach()
    return hook

  • 모델 구동 (학습된 모델 로드 후)
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    models.to(device)
    with torch.no_grad():
    models.eval()
    models.roi_heads.box_predictor.bbox_pred.register_forward_hook(get_activation("box"))
    test_img = test_img.to(device)
    test_losses = models(test_img)

  • activation1["box"].shape 결과
    torch.Size([1000, 364])

  • 아래 답변은 OpenAI의 ChatGPT로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요! 질문 주셔서 감사합니다. 우선, 전이학습 과정에서 모델 구조의 일부를 수정하시고 해당 모델 구조로부터 출력값을 뽑아내시는 것은 올바른 접근입니다. 그리고 출력층 결과를 추출하는 과정에서 forward hook을 사용하셨는데, 이 과정에서 모델의 출력값이 예상과 다르게 나오는 것으로 이해하였습니다.

register_forward_hook을 사용하면 특정 레이어의 출력값을 가져올 수 있습니다. 그러나 이 때, 먼저 모델의 forward pass를 실행해야 해당 레이어의 출력값이 생성됩니다. 다른 말로 하면, test_img를 모델에 입력하고 모델이 출력한 test_losses가 생성된 이후에 forward hook을 호출하여 해당 레이어의 출력값을 가져와야 합니다.

현재 코드에서는 forward hook을 등록한 이후에 test_losses를 생성하고 있기 때문에, forward hook이 호출되기 전에 생성된 출력값이 결과로 나오는 것입니다. 이를 수정하기 위해서는 forward hook 등록 코드 바로 다음에 models(test_img)를 호출하시면 됩니다. 예를 들어, 다음과 같은 코드를 사용하시면 forward hook이 등록된 출력값이 얻어집니다:

models.roi_heads.box_predictor.bbox_pred.register_forward_hook(get_activation('box'))
test_img = test_img.to(device)
with torch.no_grad():
    models.eval()
    models(test_img)
activation1['box'].shape

하지만, 현재 코드에서는 forward hook 결과의 shape이 (1000, 364)로 나와있습니다. 이는 모델의 출력층에서 364차원의 bounding box 좌표를 예측하고 있음을 의미합니다. 그리고 1000은 이미지 당 RoI(region of interest)의 개수입니다. 예를 들어, 입력 이미지가 1000개 RoI를 가지고 있다면, 출력값은 (1000, 364) 형태가 됩니다.

따라서, 출력값이 예상과 일치하는지 확인하려면 해당 모델의 출력층에 대한 이해가 필요합니다. 좀 더 자세한 내용은 여기에서 확인하실 수 있습니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주세요!