케글 Dogs vs Cats Keras Convolutional Neural Networks 평균값 전처리

이전 장에서 HDF5 및 메모리에 맞지 않는 너무 큰 데이터 세트로 작업하는 방법을 배웠습니다. 이를 위해 이미지의 입력 데이터 세트를 가져 와서 고효율 HDF5 데이터 세트로 직렬화하는 데 사용할 수있는 Python 유틸리티 스크립트를 정의했습니다. HDF5 데이터 세트에서 이미지 데이터 세트를 표현하면 I/O 지연 문제를 피할 수 있으므로 훈련 프로세스의 속도를 높일 수 있습니다.

Bulldog and Cat Facing Off

예를 들어 디스크에서 이미지를 순차적으로 로드하는 데이터 집합 생성기를 정의한 경우 각 이미지에 대해 하나씩 N 개의 읽기 작업이 필요합니다. 그러나 이미지 데이터 세트를 HDF5 데이터 세트에 배치하면 단일 읽기를 사용하여 이미지 배치를로드 할 수 있습니다. 이 작업을 통해 I/O 호출 수를 크게 줄이고 매우 큰 이미지 데이터 세트로 작업 할 수 있습니다.

이 장에서는 작업을 확장하고 Keras로 Convolutional Neural Networks를 훈련하는 데 적합한 HDF5 데이터 세트용 이미지 생성기를 정의하는 방법을 배웁니다. 이 생성기는 HDF5 데이터 세트를 열고 학습 할 네트워크에 대한 이미지 배치 및 관련 학습 레이블을 생성하고 모델이 충분히 낮은 손실/높은 정확도에 도달 할 때까지 계속 진행합니다. 이 프로세스를 수행하기 위해 먼저 분류 정확도를 높이기 위해 설계된 세 가지 새로운 이미지 전 처리기 (평균 빼기, 패치 추출 및 자르기 (또는 오버 샘플링이라고도 함))를 살펴 보겠습니다. 새로운 전 처리기 세트를 정의한 후에는 실제 HDF5 데이터 세트 생성기 정의로 넘어갈 것입니다.

여기에서 Krizhevsky 등의 2012 년 논문 인 ImageNet Classification with Deep Convolutional Neural Networks의 AlexNet 아키텍처를 구현할 것입니다. AlexNet을 구현하여 Kaggle Dogs vs. Cats 챌린지에 대한 학습을 시작하게 됩니다. 학습 된 모델이 주어지면 테스트 세트에서 성능을 평가 한 다음 오버 샘플링 방법을 사용하여 분류 정확도를 더욱 높일 것입니다. 결과에서 알 수 있듯이, 네트워크 아키텍처 + 자르기 방법을 통해 Kaggle Dogs vs. Cats 챌린지에서 상위 25 위 순위에 진입 할 수 있습니다.

이 섹션에서는 두 개의 새로운 이미지 전처리기를 구현할 것입니다.

1. 입력 이미지 (데이터 정규화의 한 형태)에서 데이터 세트 전체의 평균 빨강, 녹색 및 파랑 픽셀 강도를 빼도록 설계된 평균 빼기 전 처리기 ).

2. 훈련 중 이미지에서 M × N 픽셀 영역을 무작위로 추출하는 데 사용되는 패치 전 처리기.

3. 입력 이미지의 5 개 영역 (네 모서리 + 중앙 영역)을 해당 수평 뒤집기와 함께 샘플링하기 위해 테스트 시간에 사용되는 오버 샘플링 전 처리기 (총 10 회 자르기). 오버 샘플링을 사용하면 CNN을 통해 10 가지 크롭을 전달한 다음 10 가지 예측을 평균하여 분류 정확도를 높일 수 있습니다.

30.1.1 평균값 전처리

평균 전 처리기부터 시작하겠습니다. 29 장에서 이미지 데이터 세트를 HDF5 형식으로 변환하는 방법을 배웠습니다. 이 변환의 일부는 전체 데이터 세트의 모든 이미지에서 평균 빨강, 녹색 및 파랑 픽셀 강도를 계산하는 것입니다. 이제 이러한 평균을 얻었으므로 데이터 정규화의 한 형태로 입력 이미지에서 이러한 값을 픽셀 단위로 뺄 것입니다. 입력 이미지 I와 R, G, B 채널이 주어지면 다음을 통해 평균 감산을 수행 할 수 있습니다.

• R = R− µR

• G = G− µG

• B = B− µB

여기서 µR, µG 및 µB는 이미지 데이터 셋은 HDF5 형식으로 변환됩니다. 아래 그림에는 입력 이미지에서 평균 RGB 값을 빼는 시각화가 포함되어 있습니다. 빼기가 픽셀 단위로 수행되는 방식을 확인하십시오.

R = 124.96, G = 115.97, B = 106.13 픽셀 단위를 빼서 입력 이미지 (왼쪽)에 평균 빼기를 적용하여 출력 이미지 (오른쪽)를 생성하는 예입니다. 평균 빼기는 분류 중 조명 변화의 영향을 줄이는 데 사용됩니다.

이 개념을 좀 더 구체적으로 만들기 위해 계속해서 MeanPreprocessor 클래스를 구현해 보겠습니다.

전처리 하위 모듈에 meanpreprocessor.py라는 새 파일을 배치 한 방법에 주목하십시오. 이 위치는 MeanPreprocessor 클래스가있는 곳입니다. 이제 이 클래스를 구현해 보겠습니다.

# import the necessary packages

import cv2

class MeanPreprocessor:

def __init__(self, rMean, gMean, bMean):

# store the Red, Green, and Blue channel averages across a

# training set

self.rMean = rMean

self.gMean = gMean

self.bMean = bMean

5 행은 MeanPreprocessor에 대한 생성자를 정의합니다. 여기에는 세 개의 인수 (전체 데이터 세트에서 계산 된 각각의 빨간색, 녹색 및 파란색 평균)가 필요합니다. 이 값은 8-10 행에 저장됩니다. 다음으로, 이미지 처리 파이프 라인에 적용하려는 모든 전처리기에 필요한 함수 인 전처리 방법을 정의 해 보겠습니다.

15 행은 cv2.split 함수를 사용하여 입력 이미지를 각각의 RGB 구성 요소로 분할합니다. OpenCV는 RGB 가 아닌 BGR 순서로 이미지를 나타내므로 반환 튜플에 (R, G가 아닌 (B, G, R) 서명이있는 이유는 , B). 또한 OpenCV 이미지는 일반적으로 부호없는 8 비트 정수로 표시되므로 이러한 채널이 부동 소수점 데이터 유형인지 확인합니다 (이 경우 음수 값을 가질 수 없으며 대신 모듈로 산술이 수행됨).

17-20 행은 입력 이미지의 RGB 채널에서 각각의 평균 RGB 값을 빼면서 평균 빼기를 수행합니다. 그런 다음 23 행은 정규화 된 채널을 다시 병합하고 결과 이미지를 호출 함수에 반환합니다.

inception_module 인공지능 딥러닝 Googlenet Inception downsample_module

오리지널 Inception 모듈은 GoogLeNet 용으로 설계되어 ImageNet 데이터 세트 (각 입력 이미지가 224 × 224 × 3 인 것으로 가정)에서 학습하고 최첨단 정확도를 얻을 수 있습니다. 그럼에도 더 적은 네트워크 매개 변수가 필요한 더 작은 데이터 세트 (더 작은 이미지 공간 차원 포함)의 경우 Inception 모듈을 단순화 할 수 있습니다. 아래 그림의 맨 위 행은 MiniGoogLeNet 구현에 사용 된 세 가지 모듈을 설명합니다.

Miniception 아키텍처는 convolution 모듈, Inception 모듈 및 다운 샘플 모듈을 포함한 빌딩 블록으로 구성됩니다. 이러한 모듈은 전체 아키텍처를 형성하기 위해 함께 결합됩니다.

• 왼쪽 : 컨볼루션, 배치 정규화 및 활성화를 수행하는 컨볼 루션 모듈입니다.

• 중간 : 1×1 필터 용과 3×3 필터 용으로 하나씩 두 세트의 컨볼 루션을 수행하는 미니 셉션 모듈이 결과를 연결합니다. (1) 입력 볼륨이 더 작아지고 (CIFAR-10 데이터 세트를 사용할 것이므로) (2) 네트워크의 매개 변수 수를 줄이기 위해 3×3 필터 전에 차원 축소가 수행되지 않습니다.

• 오른쪽 : 컨볼루션과 최대 풀링을 모두 적용하여 차원을 줄인 다음 필터 차원에서 연결하는 다운 샘플 모듈입니다.

그런 다음 이러한 빌딩 블록을 사용하여 맨 아래 줄에 MiniGoogLeNet 아키텍처를 구축합니다. 여기서는 CNN을 구현할 때 권장되는 것과 달리 작성자가 활성화 전에 배치 정규화를 배치했음을 알 수 있습니다 (아마도 Szegedy 등이 수행 한 작업이기 때문일 수 있음). 이 책에서는 결과를 복제하기 위해 활성화 전에 배치 정규화를 배치하여 원저자의 작업 구현을 고수했습니다. 자신의 실험에서는 이 순서를 바꾸는 것을 생각해 볼 수 있습니다. 다음 섹션에서는 MiniGoogLeNet 아키텍처를 구현하고이를 CIFAR-10 데이터 세트에 적용합니다. 여기에서 전체 Inception 모듈을 구현하고 cs231n Tiny ImageNet 과제를 해결할 준비가 될 것입니다.

먼저 nn의 conv 모듈 내에 minigooglenet.py라는 파일을 만듭니다. 여기에 MiniGoogLeNet 클래스 구현을 하겠습니다.

minigooglenet.py를 열고 다음 코드를 삽입하십시오.

2 ~ 13 행은 필수 Python 패키지를 가져옵니다. 한 레이어의 출력이 다음 레이어로 직접 공급되는 Sequential 클래스를 가져 오는 대신 Model 클래스 (11 행)를 사용해야합니다. Sequential이 아닌 Model을 사용하면 Inception 모듈 에서처럼 분할 및 분기가있는 네트워크 그래프를 만들 수 있습니다. 아직 보지 못한 또 다른 import는 12 행의 concatenate 함수입니다. 이름에서 알 수 있듯이이 함수는 입력 집합을 가져 와서 주어진 축을 따라 연결합니다. 이 경우에는 채널 차원이됩니다. 이전 그림에 설명 된대로 MiniGoogLeNet의 정확한 버전을 구현할 것이므로 conv_module부터 시작하겠습니다.

conv_module 함수는 컨볼 루션 적용, 배치 정규화, 마지막으로 활성화를 담당합니다. 메서드에 대한 매개 변수는 아래에 자세히 설명되어 있습니다.

• x : 함수에 대한 입력 계층.

• K : CONV 레이어가 학습 할 필터의 수

• kX 및 kY : 학습 할 각 K 필터의 크기

• stride : CONV 레이어의 스트라이드

• chanDim : “channels last”또는 “channels first” 순서에서 파생된 채널의 차원

• padding : CONV 레이어에 적용 할 패딩 유형

19 행에서 우리는 conv 층을 생성합니다. Conv2D에 대한 실제 매개 변수는 AlexNet 및 VGGNet과 같은 이전 아키텍처의 예제와 동일하지만 여기서 변경된 사항은 주어진 계층에 입력을 제공하는 방법입니다.

네트워크 아키텍처를 정의하기 위해 Sequential이 아닌 Model을 사용하고 있기 때문에 model.add를 호출 할 수 없습니다. 이것은 한 레이어의 출력이 순차적으로 다음 레이어로 이어진다는 것을 의미하기 때문입니다. 대신 함수 호출이 끝날 때 괄호 안에 입력 레이어를 제공합니다.이를 Functional API라고합니다. 모델의 각 레이어 인스턴스는 텐서에서 호출 할 수 있으며 텐서를 반환합니다. 따라서 객체가 인스턴스화되면 함수로 호출하여 주어진 레이어에 입력을 제공 할 수 있습니다. 이러한 방식으로 레이어를 구성하기위한 템플릿은 아래에서 볼 수 있습니다.

비 순차적 네트워크를 정의 할 때마다 사용하게 되므로 네트워크에 레이어를 추가하는이 새로운 스타일에 익숙해 지시길 바랍니다. Conv2D 계층의 출력은 20 행의 BatchNormalization 계층으로 전달됩니다. 그런 다음 BatchNormalization의 출력은 ReLU 활성화 (21 행)를 거칩니다. conv_module을 시각화하는 데 도움이되는 그림을 구성한다면 아래 그림과 같을 것입니다.

MiniGoogLeNet 아키텍처의 conv_module. 이 모듈은 분기를 포함하지 않으며 간단한 CONV => BN => ACT입니다.

먼저 컨볼 루션이 적용된 다음 일괄 정규화가 적용된 다음 활성화됩니다. 이 모듈은 분기를 수행하지 않았습니다. 아래의 inception_module 정의로 변경 될 것입니다.

Mininception 모듈은 1×1 CONV와 3×3 CONV의 두 세트의 컨볼루션을 수행합니다. 이 두 컨볼루션은 병렬로 수행되고 결과 함수는 채널 차원에서 연결됩니다.

30 행과 31 행은 conv_module을 사용하여 numK1x1 필터 (1×1)를 학습합니다. 32 행과 33 행은 conv_module을 다시 적용하여 numK3x3 필터 (3 × 3)를 학습합니다. conv_module 함수를 사용하면 코드를 재사용 할 수 있고 CONV => BN => RELU 블록의 여러 블록을 삽입하여 MiniGoogLeNet 클래스를 부 풀릴 필요가 없습니다. 이 스택은 conv_module을 통해 간결하게 처리됩니다.

1×1 및 3×3 Conv2D 클래스에 대한 입력이 모두 레이어에 대한 입력 인 x 인 것을 확인하십시오. Sequential 클래스를 사용할 때 이러한 유형의 레이어 구조는 불가능했습니다. 그러나 Model 클래스를 사용하면 이제 여러 레이어가 동일한 입력을 받아들이도록 할 수 있습니다. conv_1x1과 conv_3x3이 모두 있으면 채널 차원에서 연결합니다.

(mini) -inception_module은 두 가지 분기로 구성됩니다. 첫 번째 분기는 1×1 필터를 학습하는 CONV 계층입니다. 두 번째 분기는 3×3 필터를 학습하는 또 다른 CONV 계층입니다. 그런 다음 필터 응답은 채널 차원을 따라 연결됩니다.

“Mini”-Inception 모듈을 시각화하려면 위 그림을 살펴보십시오. 1×1 및 3×3 CONV 레이어는 주어진 입력을 받아 각각의 컨볼루션을 적용합니다. 그런 다음 두 컨볼 루션의 출력이 연결됩니다 (33 행). padding = “same”으로 인해 두 컨볼루션의 출력 볼륨 크기가 동일하기 때문에 레이어 출력을 연결할 수 있습니다. 다음은 이름에서 알 수 있듯이 입력 볼륨의 공간 크기를 줄이는 역할을 하는 downsample_module입니다. @staticmethod def downsample_module(x, K, chanDim): # define the CONV module and POOL, then concatenate # across the channel dimensions conv_3x3 = MiniGoogLeNet.conv_module(x, K, 3, 3, (2, 2), chanDim, padding=”valid”) pool = MaxPooling2D((3, 3), strides=(2, 2))(x) x = concatenate([conv_3x3, pool], axis=chanDim) # return the block return x

이 메소드는 일괄 정규화 및 채널 연결을 위한 chanDim과 함께 컨벌루션 레이어가 학습 할 필터 수 K 인 입력 x를 전달해야합니다. downsample_module의 첫 번째 분기는 2×2의 스트라이드를 사용하여 K, 3×3 필터 세트를 학습하여 출력 볼륨 크기를 줄입니다 (라인 43 및 44). 우리는 볼륨 크기를 줄이기 위해 창 크기가 3×3이고 보폭이 2×2 인 라인 45 (두 번째 분기)에 최대 풀링을 적용합니다. conv_3x3 및 pool 출력은 연결되고 (46 행) 호출 함수로 반환됩니다.

downsample_module은 입력 볼륨의 공간 차원을 줄이는 역할을합니다. 첫 번째 분기는 출력 볼륨을 줄이기 위해 스트라이드가 2×2 인 필터 세트를 학습합니다. 두 번째 분기도 이번에는 최대 풀링을 적용하여 공간 차원을 줄입니다. downsample_module의 출력은 채널 차원을 따라 연결됩니다.

위 그림에서 downsample_module을 시각화 할 수 있습니다. 그림에서 알 수 있듯이 컨볼루션 및 최대 풀링 작업이 동일한 입력에 적용된 다음 연결됩니다.

이제 모든 조각을 모을 준비가되었습니다. @staticmethod def build(width, height, depth, classes): # initialize the input shape to be “channels last” and the # channels dimension itself inputShape = (height, width, depth) chanDim = -1 # if we are using “channels first”, update the input shape # and channels dimension if K.image_data_format() == “channels_first”: inputShape = (depth, height, width) chanDim = 1

52 행은 네트워크에 대한 빌드 방법을 정의합니다. 우리의 빌드 방법은 입력 너비, 높이, 깊이 및 학습 할 총 클래스 수를 허용합니다. 55 행과 56 행은 우리가 “channels last”순서를 사용한다고 가정하고 inputShape와 chanDim을 초기화합니다. 대신 “channels first”순서를 사용하는 경우 60-62 행은 이러한 변수를 각각 업데이트합니다. 첫 번째 conv_module과 함께 모델 입력을 정의 해 보겠습니다. # define the model input and first CONV module inputs = Input(shape=inputShape) x = MiniGoogLeNet.conv_module(inputs, 96, 3, 3, (1, 1), chanDim)

65 행의 입력에 대한 호출은 아키텍처를 초기화합니다. 네트워크에 대한 모든 입력은 단순히 입력 데이터를 “holds”하는 이 계층에서 시작됩니다 (모든 네트워크에 입력이 있어야 함). 첫 번째 CONV => BN => RELU는 66 번과 67 번 줄에 적용되어 96, 3×3 필터를 학습합니다. 여기에서 두 개의 Inception 모듈과 다운 샘플 모듈을 쌓습니다. # two Inception modules followed by a downsample module x = MiniGoogLeNet.inception_module(x, 32, 32, chanDim) x = MiniGoogLeNet.inception_module(x, 32, 48, chanDim) x = MiniGoogLeNet.downsample_module(x, 80, chanDim)

첫 번째 Inception 모듈 (70 행)은 1×1 및 3×3 CONV 레이어 모두에 대해 32 개의 필터를 학습합니다. 연결되면이 모듈은 K = 32 + 32 = 64 필터로 볼륨을 출력합니다. 두 번째 Inception 모듈 (71 행)은 32, 1 × 1 필터와 48, 3 × 3 필터를 학습합니다. 다시 연결하면 출력 볼륨 크기가 K = 32 + 48 = 80임을 알 수 있습니다. 다운 샘플 모듈은 입력 볼륨 크기를 줄이지 만 80에서 학습 한 필터 수는 동일하게 유지합니다. 다음으로 4 개의 Inception 모듈을 위에 쌓아 보겠습니다. 다운 샘플을 적용하기 전에 GoogLeNet이 더 깊고 풍부한 기능을 학습 할 수 있도록 합니다. # four Inception modules followed by a downsample module x = MiniGoogLeNet.inception_module(x, 112, 48, chanDim) x = MiniGoogLeNet.inception_module(x, 96, 64, chanDim) x = MiniGoogLeNet.inception_module(x, 80, 80, chanDim) x = MiniGoogLeNet.inception_module(x, 48, 96, chanDim) x = MiniGoogLeNet.downsample_module(x, 96, chanDim)

일부 레이어에서는 3×3 필터보다 1×1 필터를 더 많이 학습하는 반면 다른 Inception 모듈은 1×1보다 3×3 필터를 더 많이 학습합니다. 이러한 유형의 변형 패턴은 Szegedy et al. 이 많은 실험을 결과로 의도적으로 수행된 것입니다.. 이 장 뒷 부분에서 GoogLeNet의 더 깊은 변형을 구현할 때 이 패턴을 볼 수 있습니다. 구현을 계속하면서 이제 두 개의 시작 모듈을 더 적용한 다음 글로벌 풀 및 드롭 아웃을 적용 할 것입니다.​ # two Inception modules followed by global POOL and dropout x = MiniGoogLeNet.inception_module(x, 176, 160, chanDim) x = MiniGoogLeNet.inception_module(x, 176, 160, chanDim) x = AveragePooling2D((7, 7))(x) x = Dropout(0.5)(x)

83 행 이후의 출력 볼륨 크기는 7×7×336 입니다. 7×7의 평균 풀링을 적용하면 볼륨 크기가 1×1×336으로 줄어들 기 때문에 많은 완전 연결 레이어를 적용 할 필요성이 줄어 듭니다. 대신 간단히 컨볼루션의 공간 출력을 평균해 버립니다. 드롭 아웃은 과적 합을 줄이기 위해 85행에서 50 % 확률로 적용됩니다. 마지막으로 배우고 자하는 클래스 수에 따라 소프트맥스 분류기를 추가합니다. # softmax classifier x = Flatten()(x) x = Dense(classes)(x) x = Activation(“softmax”)(x) # create the model model = Model(inputs, x, name=”googlenet”) # return the constructed network architecture return model

그런 다음 실제 모델은 inputs, layer (내부 분기를 포함하는 x) 및 선택적으로 네트워크의 이름을 전달하는 93 행에서 인스턴스화됩니다. 구성된 아키텍처는 96 행의 호출 함수로 반환됩니다.

인공지능 딥러닝 기계학습 DeepLearning Inception imagenet

Inception 모듈의 동기에 대해 논의 했으므로 이제 그림에서 실제 모듈 자체를 살펴 보겠습니다.

GoogLeNet에서 사용 된 원래 Inception 모듈. Inception 모듈은 네트워크의 동일한 모듈 내에서 1 × 1, 3 × 3 및 5 × 5 컨볼 루션을 계산하여 “다단계 특징 추출기”역할을합니다.

Szegedy et al., 2014 논문 그림

활성화 함수 (ReLU)는 모든 CONV 계층 이후에 암시 적으로 적용됩니다. 공간을 절약하기 위해이 활성화 기능은 위의 네트워크 다이어그램에 포함되지 않았습니다. GoogLeNet을 구현할 때이 활성화가 Inception 모듈에서 어떻게 사용되는지 볼 수 있습니다.

특히 Inception 모듈이 입력 계층에서 4개의 개별 경로로 분기되는 방식을 주목하십시오. Inception 모듈의 첫 번째 분기는 입력에서 일련의 1×1 로컬피처를 학습합니다.

두 번째 배치는 먼저 1×1 컨볼루션을 로컬 피처 학습의 한 형태로 적용 할뿐만 아니라 차원 감소로 적용합니다. 더 큰 컨볼루션 (즉, 3×3 및 5×5)은 정의상 더 많은 계산을 수행해야합니다. 따라서 1×1 컨볼루션을 적용하여 이러한 더 큰 필터에 대한 입력의 차원을 줄일 수 있다면 네트워크에 필요한 계산량을 줄일 수 있습니다. 따라서 두 번째 분기의 1×1 CONV에서 학습 된 필터의 수는 항상 나중에 직접 학습 된 3×3 필터의 수보다 적습니다.

세 번째 분기는 두 번째 분기와 동일한 논리를 적용하지만 이번에는 5×5 필터 학습을 목표로 합니다. 다시 한 번 1×1 컨볼 루션을 통해 차원을 줄인 다음 출력을 5×5 필터에 공급합니다.

Inception 모듈의 네 번째이자 마지막 분기는 1 × 1의 stride로 3 × 3 max 풀링을 수행합니다. 이 분기를 일반적으로 풀 프로젝션 분기라고합니다. 역사적으로 풀링을 수행하는 모델은 더 높은 정확도를 얻을 수있는 능력을 보여 왔지만 2014 년 Springenberg et al 논문, Striving for Simplicity : The All Convolutional Net 에서는 이것이 반드시 사실은 아니며 볼륨 크기를 줄이기 위해 POOL 레이어를 CONV 레이어로 대체 할 수 있다고 설명했습니다.

Szegedy et al.의 경우 CNN이 합리적으로 수행되는 데 필요하다고 생각했기 때문에 이 POOL 레이어가 추가되었습니다. 그런 다음 POOL의 출력은 로컬 기능을 학습하기 위해 또 다른 일련의 1 x 1 컨볼 루션으로 공급됩니다.

마지막으로 Inception 모듈의 4 개 분기가 모두 수렴하여 채널 차원을 따라 함께 연결됩니다. 구현 중에 (제로 패딩을 통해) 각 분기의 출력이 동일한 볼륨 크기를 가지도록 특별히 주의하여 출력을 연결할 수 있도록 합니다. Inception 모듈의 출력은 네트워크의 다음 계층으로 공급됩니다. 실제로, 우리는 종종 볼륨 크기를 줄이기 위해 풀링 작업을 수행하기 전에 여러 Inception 모듈을 서로 겹쳐 쌓습니다.

GoogLeNet 소개 inception 모듈 및 변형

첫째, 모델 아키텍처는 AlexNet 및 VGGNet에 비해 작습니다 (가중치 자체의 경우 ≈ 28MB). 작성자는 완전히 연결된 레이어를 제거하고 대신 글로벌 평균 풀링을 사용하여 네트워크 아키텍처 크기를 크게 줄일 수 있었습니다 (전체 네트워크의 깊이는 여전히 증가). CNN의 가중치 대부분은 고밀도 FC 레이어에서 찾을 수 있습니다. 이러한 레이어를 제거 할 수 있다면 메모리 절약이 엄청납니다.

둘째, Szegedy et al. 논문은 전체 매크로 아키텍처를 구성 할 때 네트워크 또는 마이크로 아키텍처에서 네트워크를 사용합니다.

지금까지 한 네트워크의 출력이 다음 네트워크로 직접 공급되는 순차 신경망 만 보았습니다. 이제 나머지 아키텍처 내부에서 사용되는 작은 빌딩 블록인 마이크로 아키텍처를 살펴 보겠습니다. 여기서 한 레이어의 출력은 여러 다양한 경로로 분할되고 나중에 다시 결합 될 수 있습니다.

특히, Szegedy et al 논문은 Convolutional Neural Network에 맞는 빌딩 블록 인 딥러닝 커뮤니티에 Inception 모듈을 제공하여 여러 필터 크기로 CONV 계층을 학습하여 모듈을 다단계 기능 추출기로 전환했습니다.

Inception과 같은 마이크로 아키텍처는 ResNet의 Residual 모듈과 SqueezeNet의 Fire 모듈을 포함한 다른 중요한 변형에 영감을 주었습니다. 이 장의 뒷부분에서 Inception 모듈 (및 그 변형)에 대해 설명합니다. Inception 모듈을 검사하고 작동 방식을 확인한 후 “MiniGoogLeNet”이라는 GoogLeNet의 더 작은 버전을 구현합니다. 이전 장의 CIFAR-10 데이터 세트에서이 아키텍처를 훈련하고 어떤 것보다 더 높은 정확도를 얻을 것입니다.

여기에서 더 어려운 cs231n Tiny ImageNet Challenge로 넘어갈 것입니다. 이 도전은 최종 프로젝트의 일부로 Stanford의 cs231n Convolutional Neural Networks for Visual Recognition 수업에 등록한 학생들에게 제공됩니다. 이는 전체 ImageNet 데이터 세트만큼 작업하는 데 시간이 많이 걸리거나 부담을주지 않으면서 현대 아키텍처에서 대규모 딥 러닝과 관련된 과제를 맛볼 수 있음을 의미합니다.

Tiny ImageNet에서 GoogLeNet을 처음부터 교육함으로써 Tiny ImageNet 리더 보드에서 상위 순위를 차지하는 방법을 보여 드리겠습니다. 다음 장에서는 ResNet을 활용하여 처음부터 훈련 된 모델에서 최고의 위치를 ​​차지할 것입니다. Inception 모듈에 대해 논의하여 이 장을 시작하겠습니다.

최신 첨단 컨볼루션 신경망은 원래 Lin et al.이 제안한 네트워크 내 네트워크 모듈이라고도 하는 마이크로 아키텍처를 활용합니다. 저는 개인적으로 마이크로 아키텍처라는 용어를 선호합니다.이 모듈은 전체 매크로 아키텍처 (즉, 실제로 구축하고 훈련하는 것)의 맥락에서 이러한 모듈을 빌딩 블록으로 더 잘 설명하기 때문입니다.

마이크로 아키텍처는 네트워크 깊이를 증가시키면서 네트워크가 (1) 더 빠르게, (2) 더 효율적으로 학습 할 수 있도록 딥 러닝 실무자가 설계 한 작은 빌딩 블록입니다. 이러한 마이크로 아키텍처 빌딩 블록은 CONV, POOL 등과 같은 기존 레이어 유형과 함께 스택되어 전체 매크로 아키텍처를 형성합니다.

2014 년에 Szegedy et al 논문에서 Inception 모듈을 도입했습니다. Inception 모듈의 일반적인 개념은 두 가지입니다.

1. 주어진 CONV 레이어에서 학습해야하는 필터의 크기를 결정하는 것은 어려울 수 있습니다. 5 × 5 필터 여야합니까? 3 × 3 필터는 어떻습니까? 1 × 1 필터를 사용하여 로컬 피쳐를 학습해야 합니까? 대신 모든 것을 배우고 모델이 결정하도록 하는 것은 어떨까요? Inception 모듈 내에서 채널 차원을 따라 결과 피쳐 맵을 연결하는 3 개의 5×5, 3×3 및 1×1 필터 (병렬로 계산)를 모두 학습합니다. GoogLeNet 아키텍처의 다음 레이어 (다른 Inception 모듈 일 수 있음)는 이러한 연결되고 혼합된 필터를 수신하고 동일한 프로세스를 수행합니다. 전체적으로 볼 때 이 프로세스를 통해 GoogLeNet은 더 작은 컨볼 루션을 통해 로컬 기능과 더 큰 컨볼루션을 가진 추상화 된 기능을 모두 학습 할 수 있습니다. 더 작은 기능을 희생하여 추상화 수준을 희생 할 필요가 없습니다.

2. 여러 필터 크기를 학습하여 모듈을 다단계 피쳐 추출기로 전환 할 수 있습니다. 5 × 5 필터는 더 큰 수용 크기를 가지며 더 많은 추상 피쳐를 학습 할 수 있습니다. 1×1 필터는 로컬 제한적 입니다. 3×3 필터는 그 사이에 균형을 이루고 있습니다.