PyTorch-컨볼 루션 신경망
딥 러닝은 기계 학습의 한 부분이며 최근 수십 년 동안 연구자들이 취한 중요한 단계로 간주됩니다. 딥 러닝 구현의 예에는 이미지 인식 및 음성 인식과 같은 애플리케이션이 포함됩니다.
두 가지 중요한 유형의 심층 신경망은 다음과 같습니다.
- 컨볼 루션 신경망
- 반복 신경망.
이 장에서는 첫 번째 유형 인 CNN (Convolutional Neural Networks)에 초점을 맞출 것입니다.
컨볼 루션 신경망
컨볼 루션 신경망은 여러 계층의 배열을 통해 데이터를 처리하도록 설계되었습니다. 이러한 유형의 신경망은 이미지 인식 또는 얼굴 인식과 같은 애플리케이션에 사용됩니다.
CNN과 다른 일반 신경망의 주요 차이점은 CNN이 입력을 2 차원 배열로 받아들이고 다른 신경망이 집중하는 특징 추출에 초점을 맞추지 않고 이미지에서 직접 작동한다는 것입니다.
CNN의 지배적 인 접근 방식에는 인식 문제에 대한 솔루션이 포함됩니다. Google 및 Facebook과 같은 최고 기업은 더 빠른 속도로 활동을 수행하기 위해 인식 프로젝트의 연구 개발 프로젝트에 투자했습니다.
모든 컨볼 루션 신경망에는 세 가지 기본 아이디어가 포함됩니다.
- 지역별 분야
- Convolution
- Pooling
이러한 각 용어를 자세히 이해하겠습니다.
지역별 분야
CNN은 입력 데이터 내에 존재하는 공간 상관 관계를 활용합니다. 신경망의 동시 계층에서 각각은 일부 입력 뉴런을 연결합니다. 이 특정 영역을 Local Receptive Field라고합니다. 숨겨진 뉴런에만 집중합니다. 은닉 뉴런은 언급 된 필드 내부의 입력 데이터를 처리하여 특정 경계 밖의 변경 사항을 인식하지 못합니다.
로컬 각 필드를 생성하는 다이어그램 표현은 다음과 같습니다.
회선
위의 그림에서 우리는 각 연결이 한 레이어에서 다른 레이어로의 이동과 관련된 연결로 숨겨진 뉴런의 가중치를 학습하는 것을 관찰합니다. 여기에서 개별 뉴런은 수시로 전환을 수행합니다. 이 프로세스를 "컨볼 루션"이라고합니다.
입력 계층에서 숨겨진 특징 맵으로의 연결 매핑은 "공유 가중치"로 정의되고 포함 된 편향은 "공유 편향"이라고합니다.
풀링
컨벌루션 신경망은 CNN 선언 직후에 위치하는 풀링 레이어를 사용합니다. 컨볼 루션 네트워크에서 나오는 기능 맵으로 사용자의 입력을 받아 압축 된 기능 맵을 준비합니다. 풀링 레이어는 이전 레이어의 뉴런으로 레이어를 만드는 데 도움이됩니다.
PyTorch 구현
다음 단계는 PyTorch를 사용하여 Convolutional Neural Network를 만드는 데 사용됩니다.
1 단계
간단한 신경망을 만드는 데 필요한 패키지를 가져옵니다.
from torch.autograd import Variable
import torch.nn.functional as F
2 단계
컨벌루션 신경망의 배치 표현이있는 클래스를 만듭니다. 입력 x에 대한 배치 모양은 차원이 (3, 32, 32)입니다.
class SimpleCNN(torch.nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
#Input channels = 3, output channels = 18
self.conv1 = torch.nn.Conv2d(3, 18, kernel_size = 3, stride = 1, padding = 1)
self.pool = torch.nn.MaxPool2d(kernel_size = 2, stride = 2, padding = 0)
#4608 input features, 64 output features (see sizing flow below)
self.fc1 = torch.nn.Linear(18 * 16 * 16, 64)
#64 input features, 10 output features for our 10 defined classes
self.fc2 = torch.nn.Linear(64, 10)
3 단계
첫 번째 컨볼 루션 크기 변경의 활성화를 (3, 32, 32)에서 (18, 32, 32)로 계산합니다.
치수 크기가 (18, 32, 32)에서 (18, 16, 16)으로 변경됩니다. 크기가 (18, 16, 16)에서 (1, 4608)로 변경되는 신경망 입력 계층의 데이터 차원을 재구성합니다.
-1은 주어진 다른 차원에서이 차원을 유추합니다.
def forward(self, x):
x = F.relu(self.conv1(x))
x = self.pool(x)
x = x.view(-1, 18 * 16 *16)
x = F.relu(self.fc1(x))
#Computes the second fully connected layer (activation applied later)
#Size changes from (1, 64) to (1, 10)
x = self.fc2(x)
return(x)