Pytorch를 사용하여 Resnet-34 모델 구축 – 초보자를 위한 가이드

소스 노드 : 1075632

이 기사는 데이터 과학 Blogathon

개요

깊은 학습 최근 몇 년 동안 많이 발전했으며 우리 모두는 우리 모델의 정확도를 높이기 위해 더 깊은 아키텍처 네트워크를 구축하게 된 것을 기쁘게 생각합니다. 이러한 기술은 분류, 클러스터링 또는 합성과 같은 이미지 관련 작업에 널리 시도됩니다. 깊이 들어가는 것은 멋져 보일 수 있지만 신경망이 저하라는 문제에 직면하기 때문에 도움이 되지 않습니다.

여기서 정확도가 크게 영향을 받습니다. 이것은 또한 Vanishing Gradient Down이라는 문제로 이어집니다. 이렇게 하면 역전파 단계에서 가중치를 적절하게 업데이트할 수 없습니다. 역전파 단계에서 우리는 체인 규칙을 사용합니다. 네트워크 아래로 내려가면서 각 레이어의 파생물이 곱해집니다.

더 깊은 레이어를 사용하고 시그모이드와 같은 숨겨진 레이어가 있는 경우 파생 상품은 각 레이어 내에서 0.25 미만으로 축소됩니다. 따라서 많은 레이어 도함수가 곱해지면 기울기가 기하급수적으로 감소하고 기울기 계산에 쓸모가 없는 매우 작은 값을 얻습니다. 이로 인해 성능 저하를 피하기 위해 건너뛴 연결을 사용하는 Microsoft Research에서 Resnet을 만들었습니다. 이 기사에서는 Python에서 Pytorch 프레임워크를 사용하여 34계층 ResNet 아키텍처를 구현하는 방법에 대해 설명합니다.

사라지는 기울기 문제 Resnet-34
이미지 1

위에서 논의한 바와 같이 이 다이어그램은 소멸 기울기 문제를 보여줍니다. 시그모이드 함수의 도함수는 0.25 미만으로 축소되며 기울기를 업데이트하는 동안 많은 정보가 손실됩니다.

비행기 네트워크 문제

일반 네트워크 문제
이미지 2

그림과 같이 더 깊은 레이어를 가진 평면 네트워크를 볼 수 있습니다. 왼쪽에는 기차 오류가 있고 오른쪽에는 테스트 오류가 있습니다. 우리는 이것이 과적합의 문제가 될 수 있다고 생각할 것이지만 여기에서 56층 네트워크의 error%는 모델이 과적합될 때 발생하지 않는 훈련 데이터와 테스트 데이터 모두에서 훨씬 최악입니다. 이것을 저하라고 합니다.

Resnet-34의 아키텍처

Resnet-34의 아키텍처
이미지 3

처음에는 커널 크기가 64×7인 7개의 필터가 있는 컨볼루션 레이어가 있습니다. 첫 번째 컨볼루션, 그 다음에는 최대 풀링 레이어가 있습니다. 우리는 보폭을 다음과 같이 지정했습니다. 2 두 경우 모두. 다음으로 전환2_x 풀링 레이어와 다음 컨볼루션 레이어가 있습니다. 이러한 레이어는 일반적으로 잔차가 연결된 방식 때문에 쌍으로 그룹화됩니다(화살표는 두 레이어마다 점프하는 것을 나타냄).

여기에서 kernel_size가 2×3이고 num_filters가 3인 64개의 레이어가 있습니다. 이 모든 레이어는 x3 반복되며, 이는 풀/2와 필터 사이의 레이어에 해당하는 128개, 총 6개 레이어(3개 페어 시간 2). 이 3개의 레이어는 3×128의 kernel_size, num_filters는 4이며, 이것도 반복되지만 이번에는 XNUMX번이 됩니다. 이것은 avg_pooling 및 softmax 함수까지 계속됩니다. 필터 수가 두 배가 될 때마다 첫 번째 레이어가 다음을 지정하는 것을 볼 수 있습니다. num_filters/2.

Pytorch에서 Resnet-34를 정의하는 코드:

클래스 ResNet34(nn.Module): def __init__(self): super(ResNet34,self).__init__() self.block1 = nn.Sequential( nn.Conv2d(1,64,kernel_size=2,stride=2,padding=) 3,bias=False), nn.BatchNorm2d(64), nn.ReLU(True) ) self.block2 = nn.Sequential( nn.MaxPool2d(1,1), ResidualBlock(64,64), ResidualBlock(64,64,2) ,3) ) self.block64,128 = nn.Sequential( ResidualBlock(128,128,2), ResidualBlock(4) ) self.block128,256 = nn.Sequential( ResidualBlock(256,256,2), ResidualBlock(5) =) nn self(256,512) Sequential( ResidualBlock(512,512,2), ResidualBlock(2) ) self.avgpool = nn.AvgPool2d(1) # 모음_분음 부호 self.fc512,11 = nn.Linear(2) # grapheme_root self.fc512,168 = 3 nn. # consonant_diacritic self.fc512,7 = nn.Linear(1) def forward(self,x): x = self.block2(x) x = self.block3(x) x = self.block4(x) x = self. block5(x) x = self.block0(x) x = self.avgpool(x) x = x.view(x.size(1),-1) x1 = self.fc2(x) x2 = self.fc3( x) x3 = self.fc1(x) 반환 x2,x3,xXNUMX

이 코드는 Resnet-34용 모듈의 완전한 구현을 제공합니다. 이제 각 행이 어떻게 작동하는지 깊이 이해해 보겠습니다. 이를 위해 앞에서 본 아키텍처를 단축해 보겠습니다. 아래 34개의 계층 다이어그램을 참조하십시오.

코드 출력
이미지 4

5개의 블록으로 모든 Resnet 아키텍처를 구현해야 함을 알 수 있습니다. 첫 번째 블록에는 보폭이 64인 최대 풀링이 뒤따르는 2개의 필터가 있습니다. 아키텍처는 패딩 2을 사용합니다. 내부 공변량 이동의 기회가 있기 때문에 배치 정규화를 통해 네트워크를 안정화해야 합니다. 마지막에 ReLU 활성화를 사용합니다. 첫 번째 블록은 모든 아키텍처에서 동일하고 나머지 블록은 레이어별로 변경되어 특정 패턴으로 반복됩니다. 첫 번째 블록은 다음과 같이 구현할 수 있습니다.

nn.Conv2d(1,64,kernel_size=2,stride=2,padding=3,bias=False),
nn.BatchNorm2d(64),
nn.ReLU(True)

이 시점에서 건너뛰기 연결이 있습니다. 이것이 잔여 네트워크의 주요 아이디어입니다. 이전에 본 아키텍처 다이어그램은 점선 및 어두운 화살표가 있는 연결 표시를 건너뛰었습니다. 점선은 이전 채널보다 더 큰 크기의 채널로 이동할 때 여기서 일어나는 일입니다. 두 번째 블록은 아래 코드와 같이 커널 크기가 1 * 1이고 두 개의 잔여 블록이 있는 3 * 3의 초기 최대 풀을 구현합니다. 이 두 개는 64개를 입력 및 출력 채널로 사용하며 아키텍처에 표시된 대로 3번 반복됩니다. 결국 마지막 블록은 stride 2로 다음 블록에 연결됩니다.

nn.MaxPool2d(1,1), ResidualBlock(64,64), ResidualBlock(64,64,2)

마지막 블록의 내용은 3번 반복되었으며 아키텍처 다이어그램의 어두운 화살표로 입력 및 출력 채널 크기가 동일하게 유지됨을 나타냅니다. 아키텍처 다이어그램에 표시된 '/2'는 사용된 보폭에 대해 알려줍니다.

세 번째 블록은 3 * 3의 커널 크기를 사용하고 입력 채널은 64의 마지막 블록에서 나오고 출력 채널은 128입니다. 그런 다음 동일한 128을 입력으로, 128을 출력 채널로 사용합니다. 이전 아키텍처 다이어그램에 표시된 대로 이 작업을 4번 반복합니다.

잔여 블록(64,128), 잔여 블록(128,128,2)

이와 유사하게 커널 크기가 4 및 5인 256번째 및 512번째 블록을 빌드합니다.

잔여 블록(128,256), 잔여 블록(256,256,2)
잔여 블록(256,512), 잔여 블록(512,512,2)

선형 함수는 cifar 10 데이터 세트 등을 분류하는 것과 같은 단계를 포함할 수 있는 최종 임무와 이를 최종적으로 연결하는 데 도움이 됩니다. 아이디어는 레이어를 평면화하고 최대값을 찾기 위한 확률적 값을 제공하는 것입니다. 그리고 각 블록을 연결하기 위해 정의한 forward 함수입니다. 교육을 포함한 완전한 파이썬 구현을 위해 다음을 참조할 수 있습니다. 웹 사이트. 또한 Pytorch의 전이 학습 기술을 사용할 수 있으며 해당 코드에 대해서는 이 GitHub를 참조할 수 있습니다. REPO.

결론 :

참조 :

  1. https://www.kaggle.com/khoongweihao/resnet-34-pytorch-starter-kit
  2. https://datascience.stackexchange.com/questions/33022/how-to-interpert-resnet50-layer-types

내 소개 : 저는 딥 러닝 및 자연어 처리 분야에 관심이 있고 현재 인공 지능에서 대학원 과정을 밟고 있는 연구 학생입니다.

이미지 소스

  1. 이미지 1,2: https://towardsdatascience.com/the-vanishing-gradient-problem-69bf08b15484
  2. 이미지 3,4: https://datascience.stackexchange.com/questions/33022/how-to-interpert-resnet50-layer-types
  3. 미리보기 이미지: https://www.zdnet.com/pictures/10-cool-robots-at-this-years-robobusiness-conference/2/

언제든지 저와 연락하십시오:

  1. 링크드인: https://www.linkedin.com/in/siddharth-m-426a9614a/
  2. 깃허브: https://github.com/Siddharth1698

ResNet-34에 대한 이 기사에 표시된 미디어는 Analytics Vidhya의 소유가 아니며 작성자의 재량에 따라 사용됩니다.

출처: https://www.analyticsvidhya.com/blog/2021/09/building-resnet-34-model-using-pytorch-a-guide-for-beginners/

타임 스탬프 :

더보기 분석 Vidhya