named_parameter vs state_dict

안녕하세요!

named_parameter 와 state_dict 간의 실질적인 차이에 대해서 여쭤보고 싶어서 글 올립니다!

YOLOv5에서 named_parameter를 활용하여 학습시 프리즈할 레이어를 설정해주고 있는데,
named_paratemer가 반환하는 value값들은 Parameter 객체임을 확인했습니다.

또한, state_dict().items()를 활용해서 받아오는 value값들은 텐서이면서 동시에 requires_grad attribute가 False로 설정이 되어 있는것을 확인했습니다. 이 값들을 True로 바꾸어주면 named_parameter를 통해서 가져오는 Parameter value값들의 requires_grad attribute를 수정하는것과 똑같은 결과를 얻을 수 있는것 인가요?

Parameter 객체도 결국 텐서이지만, 혹시나 학습시에 추가적으로 다른점이 있나 궁금해서 여쭤보게 되었습니다!

parameters()는 모듈 매개변수, 즉 가중치와 바이어스만 제공합니다.

모듈 매개변수에 대한 iterator를 반환합니다.

매개변수 목록은 다음과 같이 확인할 수 있습니다:

for name, param in model.named_parameters():
    if param.requires_grad:
        print(name)

반면 state_dict는 모듈의 전체 상태가 포함된 딕셔너리를 반환합니다.

파라미터와 영구 버퍼(예: 실행 중인 평균)가 모두 포함됩니다. 키는 해당 매개변수 및 버퍼 이름입니다.

state_dict에 포함된 모든 키는 다음을 사용하여 확인합니다:

model.state_dict().keys()

예를 들어, state_dict에는 .parameters()에는 없는 bn1.running_mean 및 running_var와 같은 항목이 있습니다.

매개변수만 액세스하려는 경우 .parameters()를 사용하면 되지만, transfer learning과 같이 모델을 저장하고 로드하는 등의 용도로 사용하려면 매개변수뿐만 아니라 state_dict도 저장해야 합니다.

아래 링크를 참조한 내용입니다. 도움이 되셨을지 모르겠네요.

2개의 좋아요