모델 훈련을 마치면 딥 러닝 실무자들은 무엇을할까요?
우리는 진정해 !!!
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 플래그 를 변경하는 방법을 배웠습니다 . 또한 모델에서 일부 특정 매개 변수 / 레이어의 가중치 를 학습 / 고정 하려는 상황에서 그렇게하는 것이 매우 유용 할 수 있음을 배웠습니다 .
이제 모델의 가중치 / 매개 변수를 저장하는 널리 알려진 두 가지 방법을 배웁니다.
먼저 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 플래그도 저장 됩니다.
이 블로그에서 많은 것을 배웠습니다.
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 와 전체 모델을 저장할 수 있습니다.
다른 사람의 블로그를 읽고 많은 것을 배웠기 때문에이 블로그를 작성하고 있으며, 가능한 한 많이 저의 배운 것과 지식을 작성하고 공유해야한다고 생각합니다. 따라서 아래의 댓글 섹션에 의견을 남겨주세요. 또한 나는 블로그를 작성하는 것이 처음이므로 내 글을 향상시키는 방법에 대한 제안을 주시면 감사하겠습니다! :디
4 월 9 일 비즈니스 뉴스 발표는 "정신 질환을 가진 사람들을 치료하는 데 도움이되는 컴퓨터 인터페이스"를 허용하는 장치에 대한 Compass Pathways 투자자 Peter Thiel의 새로운 지분을 예고했습니다. Thiel의 최신 인수 인 Psyber는 인간의 두뇌와 외부 장치 간의 직접 통신을 가능하게하는 두뇌 컴퓨터 인터페이스입니다.
최근에 나는 영어 수업에서 연설문을 쓰는 임무를 맡았고 어떤 주제도 선택할 수있었습니다. 자연스럽게 AI를 선택했습니다. 더 구체적으로, 저는 소셜 미디어에서 인공 지능과 가짜 뉴스에 대해 글을 썼습니다.
첫 번째와 두 번째 봉쇄 사이의 시간은 자각몽과 같았습니다. 깨어 있지만 깨어 있지는 않지만 통제하고 통제 할 수없는 꿈을 꾸지 않습니다. 짙은 안개 다시 나는 그 꿈이 무엇에 관한 것인지 기억이 나지 않는다 그것은 일시 정지가 아니라는 것을 제외하고는 일시 정지 같았다 그것은 삶이었다 ~ 잠시 다 ~ 꿈을 꾸기 위해 새로운 꿈을 배우기 : 그들을 붙잡는 방법 그들을 소유하는 방법 기억하는 방법 꿈을 나누는 방법은… 자각몽입니다. Lindsay Soberano-Wilson은 시인, 교사 및 프리랜서 작가입니다.
떠오르는 생각 깊이 알려지지 않은 광대 한 바다에 떠 다니는 배처럼. 잠재적 인 보물 또는 아래에 숨어있는 깊고 어두운 움푹 들어간 곳… 마인드 레이싱 그 자체로, 끝없이 확장되는 결승선을 향해 위험하게 미끄러지면서 기하 급수적 인 속도에 도달합니다.
수천 개의 태양이 그 끝을 만날 수 있고, 반짝이는 별의 폭발을 받아 들일 수 있지만, 당신의 광채의 불꽃은 필연적으로 각 하나를 더 빛나게하여 내 마음 속에있는 은하계에서 플래티넘을 제거합니다. 침묵하는 단어는 빛의 속도보다 빠르게 바깥쪽으로 나선다. 그러나 수천 광년 사이에 그들은 결코 당신에게 닿을 수없고, 당신을 붙잡고, 나의 블랙홀 안에있는 특이점에 무엇이 존재하는지 당신에게 말할 수 없습니다.