PyTorch에서 가중치 저장에 대해 알아야 할 모든 것

모델 훈련을 마치면 딥 러닝 실무자들은 무엇을할까요?

우리는 진정해 !!!

Hahhhaha Just Kidding…

학습 된 가중치 또는 전체 모델을 저장하여 모델을 추가로 훈련하거나 추론을 위해 훈련 된 모델을 사용할 수 있습니다!

다음으로 여러분이 알고 싶은 것은 학습 된 가중치 만 저장하는시기와 전체 모델을 저장하는시기입니다.

이 블로그에서는 이러한 질문에 대한 답을 찾으려고 노력할 것입니다.

모델의 아키텍처를 저장하는 기술과 PyTorch의 가중치를 설명하는 동안 매우 간단하고 간단하게 설명하겠습니다.

또한 특정 PyTorch 모델에서 정확히 다른 모듈 인 nn.Modules 에 액세스하는 방법을 배웁니다 .

그래서이 kaggle 커널을 포크와 함께 연주 주시기 코드 :)

시작하자 !!!

우리는 PyTorch를 사용하여 코딩의 필수 요소 를 가져 오는 것으로 시작합니다 .

다음으로 CNN 기반 모델을 정의합니다.

모델을 초기화하고 인쇄 하고 그 안에 무엇이 있는지 살펴 보겠습니다 .

모델을 인쇄하면 아키텍처가 표시됩니다. 그러나 우리는 딥 러닝 실무자이기 때문에 더 깊이 잠수 할 것입니다!

모델 내부에 정확히 무엇이 있는지 이해하고 있는지 확인해야합니다.

모델의 모든 학습 가능한 매개 변수에 이름과 함께 액세스하는 방법이 있습니다. 그건 그렇고, torch.nn.Parameter 는 Tensor 하위 클래스이며, torch.nn.Module 과 함께 사용 하면 자동으로 매개 변수 목록에 추가되고 parameters () 또는 named_parameters () 반복기에 나타납니다 . 반면에 torch.nn.Tensor 를 추가하는 것은 그러한 효과가 없습니다. 나중에 더 자세히!

모델의 모든 매개 변수 인쇄로 돌아갑니다.

Wooouhooouhooou! 그래서 여기서 무슨 일이 일어 났습니까?

named_parameters () 함수 를 살펴 보겠습니다 .

model.named_parameters () 자체는 생성기입니다. 매개 변수의 이름과 매개 변수 자체에 불과한 이름매개 변수를 리턴합니다 . 여기서 반환되는 매개 변수는 일종의 텐서 인 torch.nn.Parameter 클래스입니다. param은 텐서의 한 유형이므로 모양이 있고 require_grad 속성도 있습니다. param.shape 는 단순히 텐서의 모양이고 param.requires_grad 는 매개 변수가 학습 가능한지 여부를 알려주는 부울입니다. 모델의 모든 매개 변수가 requires_grad = True 이므로 모든 매개 변수를 학습 할 수 있으며 모델 학습시 업데이트됩니다. 특정 매개 변수에 대해 False 로 설정했다면 해당 매개 변수의 가중치는 모델 학습시 업데이트되지 않습니다.

따라서 requires_grad 는 모델의 특정 레이어 집합 을 학습 / 고정 하려고 할 때 변경할 수있는 플래그입니다 .

이제 모델의 마지막 레이어를 제외하고 모두 고정하려고합니다. 모델의 모든 매개 변수 이름을 모두 살펴보면 마지막 레이어의 이름이 '완전 연결됨'을 나타내는 'fc' 임을 알 수 있습니다 .

따라서 이름이 'fc.weight' 또는 'fc.bias'인 매개 변수를 제외한 모든 매개 변수를 고정하겠습니다.

모델의 모든 매개 변수에 대한 requires_grad 를 인쇄하여 원하는 변경이 성공적으로 수행되었는지 확인할 수 있습니다.

원하는 변경이 성공적으로 이루어 졌음을 알 수 있습니다!

그래서 우리는 모델의 원하는 매개 변수에 대한 requires_grad 플래그 를 변경하는 방법을 배웠습니다 . 또한 모델에서 일부 특정 매개 변수 / 레이어의 가중치 를 학습 / 고정 하려는 상황에서 그렇게하는 것이 매우 유용 할 수 있음을 배웠습니다 .

이제 모델의 가중치 / 매개 변수를 저장하는 널리 알려진 두 가지 방법을 배웁니다.

  1. torch.save (model.state_dict (), 'weights_path_name.pth') 모델 의 가중치
    만 저장합니다 .
  2. torch.save (model, 'model_path_name.pth')
    전체 모델 ( 아키텍처와 가중치 )을 저장합니다.

먼저 state_dict 구문을 작성하는 방법을 살펴 보겠습니다 . 꽤 쉽습니다.

그것은 단지 파이썬의 주문 된 사전입니다.

그러나 이것을 인쇄하면 혼란이 생길 ​​것입니다. 그래서 우리는 여기서 전체 모델에 대한 state_dict 를 인쇄하지 않을 것입니다 . 그러나 저는 여러분들이 계속해서 여러분의 화면에 그것을 인쇄 할 것을 권장합니다!

주제에서 조금 벗어나기 좋은시기라고 생각합니다.

help (model) 인쇄 는 모델이 nn.Module 의 인스턴스임을 알려줍니다.

파이썬의 isinstance 함수를 사용하여 확인할 수도 있습니다.

model.fc 또한 인스턴스 nn.Module ?

분명히 그렇습니다!

그러나 정확히 무엇 FC , 그리고 양식을 어디에서 오는가?

모든 nn.Module 객체가 모델 아래에있는 것을 볼 수 있습니다.

named_children ()는 어떤 적용 nn.Module의 모든 것이 직접적인 아이 (도의 객체 반환 nn.Module 객체). 코드 작성 부분 위의 결과를 보면, 우리는 것을 알고 '순차', '레이어 1', '계층 2''FC가' 모델의 모든 아이들이 있고 이들 모두는 nn.Module 클래스 객체. 이제 우리 모두는 'fc' 가 어디에서 오는지 알고 있습니다.

그리고 그거 알아? state_dict () 는 모든 nn.Module 객체 에서 작동하며 모든 직계 자식 ( nn.Module 클래스 )을 반환합니다 .

모델 의 'fc' 레이어 에서 state_dict () 함수를 사용해 봅시다 .

그 기억 model.fc.state_dict () 또는 nnModule.state_dict ()를 되어 주문 사전 . 그래서 그것을 반복하면 nn.Module 객체가 아니라 형태requires_grad 속성을 가진 간단한 torch.Tensor 인 매개 변수 텐서에 접근하는 데 사용할 수있는 사전의 키를 얻을 수 있습니다 .

따라서 nn.Module 객체 (예 : 모델 )state_dict () 를 저장 하면 torch.Tensor 객체가 저장됩니다!

이것이 전체 모델 의 state_dict 를 저장하는 방법 입니다.

이렇게하면 작업 디렉터리에 'weights_only.pth' 파일 이 만들어 지고 모델의 모든 계층에 대한 torch.Tensor 개체가 정렬 된 사전에 보관 됩니다.

이제 저장된 가중치를로드 해 보겠습니다. 하지만 그 전에 먼저 모델 아키텍처를 정의해야합니다. 그것은 감각 저장된 정보가 있기 때문에 거기에 가중치를로드 먼저 모델을 정의 할 수 있습니다 단지 가중치와 없는 모델 아키텍처.

가중치가 정의 된 모델에로드되면,의는 확인 할 수 requires_grad의 model_new의 모든 레이어의 속성을.

기다려! 뭐 ?

모든에 무슨 일이 requires_grad의 우리는 모든 다른 레이어로 설정했다고 플래그? 모든 require_grad 플래그가 True 로 재설정 된 것 같습니다 .

실제로, 우리 는 처음에 매개 변수 의 required_grad 플래그를 저장하지 않았습니다 . state_dict 는 단순히 각 계층을 매개 변수 텐서에 매핑하는 파이썬 사전 객체라는 것을 기억하십시오 . 매개 변수 의 requires_grad 속성은 저장하지 않습니다 .

따라서 더 많은 에포크를 위해 모델 학습을 재개하기 전에 모든 매개 변수 의 require_grad 속성에 필요한 변경을 다시 해야 합니다.

전체 모델을 저장하는 방법과 그것을 할 때?

예, 우리는 전체 모델도 저장할 수있는 두 번째 저장 방법이 있습니다. 전체 모델이란 모델의 아키텍처가중치를 의미 합니다.

따라서 모델 의 마지막 레이어 ( 'fc' 레이어)를 제외하고 모두 고정한 지점부터 다시 시작 하고 전체 모델을 저장합니다.

이렇게하면 작업 디렉토리에 'entire_model.pth' 파일이 생성되고 여기에는 모델 아키텍처 저장된 가중치가 포함됩니다.

이제 저장된 모델을로드 해 보겠습니다. 그리고 이번에는 모델 아키텍처에 대한 정보가 이미 저장된 파일에 저장되어 있으므로 모델 아키텍처를 정의 할 필요가 없습니다.

모델이로드되면,의는 확인 할 수 requires_grad의 model_new의 모든 레이어의 속성을.

그것이 바로 우리가보고 싶었던 것입니다. :디

따라서 전체 모델을 저장할 때 nn.Module 객체를 저장하고 이렇게하면 모든 매개 변수 의 requires_grad 플래그도 저장 됩니다.

공개 kaggle 커널 을 포크 하고 코드를 가지고 플레이하여 느낌을 얻으시기 바랍니다!

요약

이 블로그에서 많은 것을 배웠습니다.

  1. nn.Module 객체 (예 : model , model.layer2 또는 model.fc )named_parameters () 를 적용하면 모든 이름과 해당 매개 변수가 반환됩니다. 이 매개 변수는 nn.Parameter (의 서브 클래스 torch.Tensor ) 개체에 따라서 자신이 갖고 모양requires_grad 특성을.

3. 모든 nn.Module 객체 에 named_children () 을 적용하면 모든 직계 자식 (또한 nn.Module 객체)이 반환 됩니다.

4. nn.Module 객체 (예 : model , model.layer2 또는 model.fc )state_dict () 는 단순히 각 매개 변수를 매개 변수 텐서 ( torch.Tensor 객체)에 매핑 하는 파이썬 정렬 된 사전 객체입니다 . 이 정렬 된 사전 의 는 각 매개 변수 텐서에 액세스하는 데 사용할 수있는 매개 변수의 이름입니다.

5. nn.Module 객체의 state_dict를 저장 하면 모델 아키텍처가 아닌 해당 객체의 다양한 매개 변수 가중치저장 됩니다. 어느 쪽도 아니 그것은 포함되지 않습니다 requires_grad의 가중치의 속성을. 따라서 state_dict 를로드하기 전에 먼저 모델을 정의해야합니다.

6. 모델 아키텍처와 가중치를 포함하는 전체 모델 ( nn.Module 객체)도 저장할 수 있습니다 . nn.Module 객체를 저장하기 때문에 requires_grad 속성 도이 방법으로 저장 됩니다. 또한 저장된 파일에는 이미 모델 아키텍처가 저장되어 있으므로 저장된 파일을로드하기 전에 모델 아키텍처를 정의 할 필요가 없습니다.

7. state_dict 저장은 모델의 가중치를 저장하는 데만 사용할 수 있습니다. required_grad 플래그를 저장하지 않는 반면 전체 모델을 저장하면 모델 아키텍처, 가중치 및 모든 매개 변수 의 requires_grad 속성 이 저장 됩니다.

8. 추론을 위해 state_dict 와 전체 모델을 저장할 수 있습니다.

다른 사람의 블로그를 읽고 많은 것을 배웠기 때문에이 블로그를 작성하고 있으며, 가능한 한 많이 저의 배운 것과 지식을 작성하고 공유해야한다고 생각합니다. 따라서 아래의 댓글 섹션에 의견을 남겨주세요. 또한 나는 블로그를 작성하는 것이 처음이므로 내 글을 향상시키는 방법에 대한 제안을 주시면 감사하겠습니다! :디

Suggested posts

폭발 할 중성자 폭탄 : 사이키델릭과 감시 자본주의

인공 지능과 신경 과학이 사이키델릭 경험과 융합 될 때 일어나는 일

폭발 할 중성자 폭탄 : 사이키델릭과 감시 자본주의

4 월 9 일 비즈니스 뉴스 발표는 "정신 질환을 가진 사람들을 치료하는 데 도움이되는 컴퓨터 인터페이스"를 허용하는 장치에 대한 Compass Pathways 투자자 Peter Thiel의 새로운 지분을 예고했습니다. Thiel의 최신 인수 인 Psyber는 인간의 두뇌와 외부 장치 간의 직접 통신을 가능하게하는 두뇌 컴퓨터 인터페이스입니다.

소셜 미디어의 AI와 가짜 뉴스

소셜 미디어의 AI와 가짜 뉴스

최근에 나는 영어 수업에서 연설문을 쓰는 임무를 맡았고 어떤 주제도 선택할 수있었습니다. 자연스럽게 AI를 선택했습니다. 더 구체적으로, 저는 소셜 미디어에서 인공 지능과 가짜 뉴스에 대해 글을 썼습니다.

Related posts

자각몽

각성시

자각몽

첫 번째와 두 번째 봉쇄 사이의 시간은 자각몽과 같았습니다. 깨어 있지만 깨어 있지는 않지만 통제하고 통제 할 수없는 꿈을 꾸지 않습니다. 짙은 안개 다시 나는 그 꿈이 무엇에 관한 것인지 기억이 나지 않는다 그것은 일시 정지가 아니라는 것을 제외하고는 일시 정지 같았다 그것은 삶이었다 ~ 잠시 다 ~ 꿈을 꾸기 위해 새로운 꿈을 배우기 : 그들을 붙잡는 방법 그들을 소유하는 방법 기억하는 방법 꿈을 나누는 방법은… 자각몽입니다. Lindsay Soberano-Wilson은 시인, 교사 및 프리랜서 작가입니다.

삶과 사랑을 생각하면서

시.

삶과 사랑을 생각하면서

떠오르는 생각 깊이 알려지지 않은 광대 한 바다에 떠 다니는 배처럼. 잠재적 인 보물 또는 아래에 숨어있는 깊고 어두운 움푹 들어간 곳… 마인드 레이싱 그 자체로, 끝없이 확장되는 결승선을 향해 위험하게 미끄러지면서 기하 급수적 인 속도에 도달합니다.

열사병

말이없는 하나의 우주에서 길을 잃었다

열사병

수천 개의 태양이 그 끝을 만날 수 있고, 반짝이는 별의 폭발을 받아 들일 수 있지만, 당신의 광채의 불꽃은 필연적으로 각 하나를 더 빛나게하여 내 마음 속에있는 은하계에서 플래티넘을 제거합니다. 침묵하는 단어는 빛의 속도보다 빠르게 바깥쪽으로 나선다. 그러나 수천 광년 사이에 그들은 결코 당신에게 닿을 수없고, 당신을 붙잡고, 나의 블랙홀 안에있는 특이점에 무엇이 존재하는지 당신에게 말할 수 없습니다.

One More Kiss Dear

One More Kiss Dear

갈색 베이클라이트 라디오는 편안한 소파 옆의 어두운 호두 나무 탁자 위에 놓여 있고, 다이얼에서 따뜻한 호박색 빛이납니다.