• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

register_forward_hook을 활용한 피쳐맵 추출에서 문제가 발생합니다ㅠㅠ

23.03.09 12:23 작성 23.03.09 12:23 수정 조회수 401

0

안녕하세요. 현재 코랩환경에서 파이토치 제공 Mask-RCNN을 활용하고 있습니다. 강의에서 알려주신 Hook를 활용하여 중간 레이어의 피쳐맵을 추출하고자 진행하던 과정에서 문제가 발생하여 질문드립니다ㅠㅠ

모델은 제가 가진 데이터셋에 맞춰 출력층을 바꾸어준 후에 학습을 완료한 상태입니다. 이후 for문을 통해 모델에 여러 입력 이미지들을 넣어주어 이미지별 중간 레이어의 피쳐맵을 얻으려고 하였으나, 출력결과 하나의 이미지에 대한 피쳐맵만 반복적으로 출력되는 문제가 발생합니다...

모델 학습 및 가중치 로드 후 코드는 다음과 같습니다.

Hook 함수

def get_activation(name):
 def hook(models, input, output):
  activation[name] = output
 return hook

입력 이미지별 피쳐맵 저장

activation = {}
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
models.to(device)

for i in range(1, 5):
 test_img = Image.open("입력 이미지 루프").convert('RGB')
 test_img = test_img.resize((800, 800))
 test_img = tr.functional.to_tensor(test_img)
 test_img = test_img.reshape(1, 3, 800, 800)
 with torch.no_grad():
  models.eval()
  models.backbone.fpn.extra_blocks.register_forward_hook(get_activation("fm{}".format(i)))     
  test_img = test_img.to(device)    
  models(test_img)

출력 결과

activation["fm1"] 부터 ["fm4"] 까지 동일한 값이 들어가 있음

아무리 찾아보고 여러 시도를 해보아도 해결이 되지않아 답답하네요ㅠㅠ

추가로 위의 코드를 한번 돌리면 런타임을 다시 시작하지 않는 이상 이후에 코드를 수정하여 hook 함수부터 다시 돌려도 적용이 되지 않는 문제도 발생합니다...

답변 1

답변을 작성해보세요.

0

안녕하세요.

해당 부분만 보고 판단하기 어렵습니다만 개인적으로는 두가지 부분을 확인해 볼 것 같습니다.

(1) 실제로 다른 이미지가 들어가고 있는지 확인합니다.

(2) 우리가 강의에서 배운 코드는 이미지당 model이 재정의 되는데 위 코드는 그렇지 않은 것 같습니다.

코드 비교해 보시고 수정해보시겠어요?

 

감사합니다.