네트워크 수술을 수행하기 전에 주어진 딥러닝 모델에있는 모든 레이어의 레이어 이름과 인덱스를 알아야합니다. 사전 훈련 된 CNN에서 특정 레이어를 “고정” 및 “고정 해제” 해야 하므로 이 정보가 필요합니다. 레이어 이름과 인덱스를 미리 알지 못하면 우리는 계획이없는 통제 불능 외과 의사 처럼 “맹목적으로 절단” 할 것입니다. 대신 네트워크 아키텍처와 구현을 검토하는 데 몇 분을 투자하면 수술을 더 잘 준비 할 수 있습니다. 계속해서 VGG16의 레이어 이름과 인덱스를 살펴 보겠습니다.
새 파일을 열고 inspect_model.py라는 이름을 지정한 후 다음 코드를 삽입하십시오.

2행은 VGG16 Keras 구현을 가져옵니다. 이 네트워크는 우리가 검사하고 수술을 준비 할 네트워크입니다. 6-9 행은 명령행 인수를 구문 분석합니다. 여기에는 네트워크 헤드가 모델 요약에 포함되어야 하는지 여부를 나타내는 데 사용되는 단일 스위치가 필요합니다.
23 행과 24 행은 디스크에서 사전 훈련 된 ImageNet 가중치를 사용하여 VGG16을 로드합니다. 네트워크 헤드는 선택적으로 포함됩니다.
마지막으로 19 행과 20 행을 통해 모델을 조사 할 수 있습니다. 네트워크의 각 계층에 대해 해당 인덱스를 인쇄합니다. 이 정보가 주어지면 FC 헤드가 시작되는 위치 (및 새 FC 헤드로 교체 할 위치)의 색인을 알 수 있습니다. VGG16 아키텍처를 조사하려면 다음 명령을 실행하십시오.


여기서 우리는 레이어 20-22가 완전히 연결된 레이어임을 알 수 있습니다. 확인을 위해 inspect_model.py 스크립트를 다시 실행하고 이번에는 FC 헤드를 해제하는 스위치 –include-top -1을 제공합니다.
네트워크의 최종 계층이 POOL 계층인지 확인 하십시오 (특징 추출에 대한 23 장에서와 같이). 이 네트워크 바디는 파인튜닝의 시작점 역할을합니다.
사전 훈련 된 CNN의 헤드를 교체하기 전에 이를 교체 할 무언가가 필요합니다. 따라서 우리는 완전히 연결된 네트워크 헤드를 정의해야합니다. 시작하려면 nn.conv 하위 모듈에 fcheadnet.py라는 새 파일을 만듭니다.

그런 다음 fcheadnet.py를 열고 다음 코드를 삽입합니다.

이전 네트워크 구현과 마찬가지로 실제 네트워크 아키텍처를 구성하는 빌드 방법을 정의합니다. 이 방법에는 baseModel (네트워크 본문), 데이터 세트의 총 클래스 수, 마지막으로 완전 연결 계층의 노드 수 D의 세 가지 매개 변수가 필요합니다.
11 행은 네트워크를 나머지 본문 인 baseModel.output과 연결하는 headModel을 초기화합니다. 거기에서 12-17행은 다음과 같은 매우 간단한 완전 연결 아키텍처를 구축합니다.

다시 말하지만, 이 완전히 연결된 헤드는 4,096 FC 레이어의 두 세트로 구성된 VGG16의 원래 헤드에 비해 매우 단순합니다. 그러나 대부분의 파인튜닝 문제의 경우 네트워크의 원래 헤드를 복제하는 것이 아니라이를 단순화하여 파인튜닝이 더 쉽습니다. 헤드의 매개 변수가 적을수록 올바르게 수행 할 가능성이 높습니다. 새로운 분류 작업에 맞게 네트워크를 조정합니다. 마지막으로 라인 20은 새로 구성된 FC 헤드를 호출 함수로 반환합니다.
다음 섹션에서 볼 수 있듯이 네트워크 수술을 통해 VGG16의 헤드를 새로 정의 된 FCHeadNet으로 교체 할 것입니다.