
학습 목표
- Implement the basic building blocks of ResNets in a deep neural network using Keras
- Train a state-of-the-art neural network for image classification
- Implement a skip connection in your network
- Create a dataset from a directory
- Preprocess and augment data using the Keras Sequential API
- Adapt a pretrained model to new data and train a classifier using the Functional API and MobileNet
- Fine-tine a classifier's final layers to improve accuracy
"심층 CNN(Deep CNN)에서 사용되는 강력한 실용적인 트릭과 방법을 연구 논문에서 직접 찾아보고, 그런 다음 자신의 심층 CNN에 전이 학습을 적용하세요. 학습 목표 Keras를 사용하여 ResNets의 기본 구성 요소를 심층 신경망에 구현하기 이미지 분류를 위한 최신 신경망을 훈련시키기 네트워크에 스킵 연결 구현하기 디렉토리에서 데이터셋 생성하기 Keras Sequential API를 사용하여 데이터 전처리 및 증강하기 사전 훈련된 모델을 새 데이터에 적응하고 Functional API 및 MobileNet을 사용하여 분류기 훈련시키기 분류기의 최종 레이어를 세밀하게 조정하여 정확도 향상시키기" |
Why look at case studies?
개요
Classic Networks
1. LeNet-5 아키텍처:
입력 이미지 크기는 32x32x1입니다.
LeNet-5은 손글씨 숫자를 인식하는 것이 목표입니다.
이 신경망은 흑백 이미지에 훈련되었으므로 32x32x1 크기입니다.
첫 번째 단계에서는 5x5 필터 6개를 사용하여 합성곱을 수행하고, 스트라이드 1을 사용하여 출력 크기를 20x20x6으로 줄입니다.
평균 풀링을 사용하여 출력 크기를 14x14x6으로 줄입니다.
다음으로 또 다른 합성곱 레이어를 적용하고 출력 크기를 10x10으로 줄입니다.
다시 평균 풀링을 사용하여 출력 크기를 5x5로 줄입니다.
이러한 숫자를 모두 곱하면 5x5x16 = 400이 됩니다.
그런 다음 완전히 연결된 레이어를 사용하여 400개의 노드를 120개의 뉴런에 연결합니다.
마지막으로, 84개의 피처를 사용하여 10가지 가능한 출력 값을 예측합니다.
2. 신경망의 특징:
LeNet-5은 현대 기준으로 작은 신경망으로, 약 60,000개의 매개변수를 가지고 있습니다.
현대적인 신경망에서는 10백만에서 1억 개의 매개변수를 가진 네트워크를 자주 볼 수 있으며, 이 네트워크보다 1000배나 큰 네트워크도 흔히 볼 수 있습니다.
신경망이 깊어질수록(왼쪽에서 오른쪽으로 이동할수록), 높이와 너비가 감소하는 경향이 있습니다.
신경망의 레이어 배치 패턴은 합성곱 레이어 다음에 풀링 레이어, 그리고 한 개 이상의 합성곱 레이어와 풀링 레이어, 그 다음 완전 연결 레이어, 그리고 출력으로 이어지는 것이 일반적입니다.
3. 고급 내용 (선택 사항):
원래 논문에서는 시그모이드 및 탄젠트 하이퍼볼릭(sigmoid and tanh) 비선형성을 사용했으며, 현대에는 ReLU(nonlinearities)가 더 흔히 사용됩니다.
초기 LeNet-5의 구조는 현대 표준과 다르며, 컴퓨터의 성능 문제로 인해 입력 블록의 다른 채널을 보는 다양한 필터가 있었습니다.
평균 풀링 레이어 다음에 비선형성이 있는 레이어가 있었는데, 이것은 현재의 표준이 아닙니다.
1. AlexNet:
AlexNet은 Alex Krizhevsky가 처음 저술한 논문에서 영감을 받아 이름 붙인 신경망입니다.
입력 이미지 크기는 227x227x3이지만 논문에서는 224x224x3이라고 언급됩니다.
첫 번째 레이어는 96개의 11x11 필터를 사용하고 스트라이드는 4입니다.
맥스 풀링(3x3 필터, 스트라이드 2)을 적용하여 출력 크기를 27x27x96으로 줄입니다.
다음으로 5x5 합성곱과 맥스 풀링을 반복하여 네트워크를 구성합니다.
여러 계층을 거치고 6x6x256 크기의 피처 맵을 얻습니다.
이를 9216개의 노드로 펼쳐 완전 연결 레이어를 거칩니다.
마지막으로 소프트맥스 레이어를 사용하여 1000가지 클래스 중 하나를 예측합니다.
AlexNet는 LeNet과 유사한 기본 블록을 사용하지만 훨씬 크고 60백만 매개변수를 가지고 있으며, ReLU 활성화 함수를 사용하여 성능을 향상시켰습니다.
2. AlexNet의 고급 내용 (선택 사항):
초기에는 GPU의 속도가 더 느렸기 때문에 두 개의 GPU를 사용하여 훈련하는 복잡한 방법을 사용했습니다.
논문에서는 Local Response Normalization(LRN)이라는 추가 레이어를 사용했지만 현대의 네트워크에서는 잘 사용되지 않습니다.
1. VGG-16 아키텍처:
VGG-16은 간단한 구조로 유명한 신경망입니다.
이 네트워크는 3x3 필터와 스트라이드 1, 항상 동일한 패딩을 사용하여 conv 레이어를 중점적으로 구성합니다.
맥스 풀링 레이어는 2x2 필터와 스트라이드 2를 사용하여 출력 크기를 줄입니다.
네트워크 아키텍처:
입력 이미지 크기: 224x224x3
64개의 필터를 사용하는 두 개의 conv 레이어
맥스 풀링 레이어
128개 필터를 사용하는 conv 레이어
맥스 풀링 레이어
256개 필터를 사용하는 conv 레이어
맥스 풀링 레이어
512개 필터를 사용하는 conv 레이어
맥스 풀링 레이어
512개 필터를 사용하는 conv 레이어
맥스 풀링 레이어
7x7x512 크기의 피처 맵을 완전 연결 레이어로 변환
4096개의 노드가 있는 완전 연결 레이어
1000개의 클래스를 분류하기 위한 소프트맥스 출력 레이어
VGG-16은 총 138 백만 개의 매개변수를 가지고 있으며, 비교적 큰 네트워크입니다.
2. VGG-16 아키텍처의 특징:
VGG-16은 간단하고 균일한 구조를 가지며, 일정한 패턴을 따릅니다.
합성곱 레이어와 풀링 레이어가 번갈아가며 나오고, 풀링 레이어는 높이와 너비를 절반으로 줄입니다.
컨볼루션 레이어에서는 필터 수가 2배씩 증가하는 경향이 있습니다.
3. VGG-16 아키텍처의 활용:
VGG-16은 비교적 간단한 구조를 가지고 있어서 이해하기 쉽습니다.
매개변수 수가 많아 훈련하기에는 커다란 모델이지만, VGG-16이 VGG-19보다 거의 동일한 성능을 보이기 때문에 많은 연구자가 VGG-16을 선호합니다.
네트워크가 깊어짐에 따라 높이와 너비는 감소하고, 채널 수는 증가하는 경향이 있습니다.
VGG-16 아키텍처에서 512개 필터를 사용하는 conv 레이어를 두 번 사용하는 이유는 네트워크의 깊이를 늘리고 더 복잡한 특징을 학습하기 위함입니다. 이런 연속된 합성곱 레이어는 네트워크가 더 추상적이고 고수준의 특징을 학습할 수 있도록 합니다. 첫 번째 512개 필터를 사용하는 conv 레이어는 이전 레이어에서 얻은 피처 맵에 새로운 필터를 적용하여 다양한 특징을 추출합니다. 이러한 특징은 이미지의 다양한 세부 정보를 나타냅니다. 두 번째 512개 필터를 사용하는 conv 레이어는 첫 번째 레이어의 출력에 대한 추가적인 필터 적용을 통해 피처를 더 조합하고 추상화합니다. 이로써 네트워크는 더 복잡한 패턴과 특징을 학습할 수 있게 됩니다. |
ResNets
1. Residual Networks (ResNets) 소개:
매우 깊은 신경망은 경사가 소실하거나 폭발하는 그래디언트 문제로 인해 훈련이 어려울 수 있습니다.
ResNet은 스킵 연결(skip connection)을 사용하여 한 레이어의 활성화 값을 다른 레이어로 전달함으로써 깊은 신경망을 효과적으로 훈련시킬 수 있게 해줍니다.
2. Residual Block (잔여 블록):
ResNet은 잔여 블록을 사용하여 구성됩니다.
각 잔여 블록은 선형 연산을 수행한 후 ReLU 활성화 함수를 적용하는 일반적인 레이어들과 스킵 연결로 구성됩니다.
스킵 연결은 이전 레이어의 활성화를 현재 레이어로 복사하고, 활성화 함수 적용 전에 추가합니다.
따라서 정보는 주 경로(main path) 뿐만 아니라 스킵 경로(shortcut)를 통해 더 깊은 레이어로 흐를 수 있습니다.
3. ResNet의 효과:
ResNet은 매우 깊은 신경망을 구축할 수 있도록 하며, 이를 통해 훈련 및 성능 향상이 가능합니다.
여러 개의 잔여 블록을 쌓아 깊은 네트워크를 만들 수 있습니다.
ResNet의 개발자들은 잔여 블록을 사용하면 훨씬 깊은 신경망을 효과적으로 훈련할 수 있음을 발견했습니다.
1. Plain Network vs. Residual Network:
"Plain network"는 스킵 연결(skip connection)이 없는 신경망을 의미합니다.
"Residual network" 또는 "ResNet"은 스킵 연결을 추가하여 일반 네트워크를 변환한 것입니다.
2. 스킵 연결을 통한 ResNet 구성:
스킵 연결(또는 단축 연결)은 레이어 간의 활성화 값을 건너뛰는 연결을 의미합니다.
각 두 레이어 사이에 스킵 연결을 추가하여 각 레이어를 "잔여 블록"으로 변환합니다.
스킵 연결을 추가하면 정보는 주 경로(main path)를 따라 흐를 뿐만 아니라 스킵 경로(shortcut)를 통해 더 깊은 레이어로 전달됩니다.
3. ResNet의 효과:
일반 네트워크의 경우, 네트워크가 깊어질수록 훈련 오차가 증가하는 경향이 있습니다.
그러나 ResNet은 스킵 연결을 통해 깊은 네트워크도 효과적으로 훈련할 수 있게 합니다.
스킵 연결을 통해 그래디언트 소실 및 폭발 문제를 줄이고, 더 깊은 신경망을 효과적으로 훈련할 수 있습니다.
4. ResNet의 활용:
ResNet은 매우 깊은 네트워크에서도 훈련 성능을 유지하거나 향상시킬 수 있습니다.
현재는 수백 레이어에서 수천 레이어까지 사용되며, 이러한 네트워크는 실전에서도 효과적으로 사용됩니다.
Why ResNets Work?
1. ResNets(Residual Networks)의 효과:
ResNets는 매우 깊은 신경망을 더 깊게 만들어도 훈련에 도움이 되는 이점을 가집니다.
일반 네트워크(plain network)에서는 네트워크를 깊게 만들면 훈련 오차가 증가할 수 있으나 ResNets에서는 이런 문제가 덜 발생합니다.
2. 예시를 통한 설명:
예시를 통해 ResNet의 동작 원리를 이해합니다.
기존 네트워크에 추가적인 레이어를 적용하면 네트워크를 더 깊게 만들 수 있습니다.
ResNet 블록을 추가하면 스킵 연결(skip connection)을 통해 쉽게 항등 함수(identity function)를 학습할 수 있습니다.
스킵 연결을 통해 항등 함수를 학습하는 것은 매우 쉬우며, 따라서 네트워크의 성능에 큰 영향을 미치지 않습니다.
3. 항등 함수 학습의 중요성:
ResNet의 핵심은 항등 함수를 학습하기 쉽다는 점입니다.
깊은 일반 네트워크에서는 항등 함수 학습이 어려워 성능이 저하될 수 있지만, ResNet에서는 학습에 도움이 됩니다.
스킵 연결을 통해 항등 함수를 학습하는 데 성공하면 성능을 높일 수 있습니다.
4. 차원 관리와 스킵 연결:
ResNet에서는 입력과 출력의 차원을 동일하게 유지하기 위해 "same convolution"이 많이 사용됩니다.
입력과 출력의 차원이 다른 경우 추가 매개변수인 Ws를 사용하여 차원을 맞춥니다.
1. Plain Network와 ResNet 비교:
평범한 네트워크(plain network)는 이미지를 입력으로 받고 여러 개의 컨볼루션 레이어를 거쳐 마지막에 softmax 출력을 생성합니다.
ResNet으로 변환하려면 추가적인 스킵 연결(skip connection)을 더해야 합니다.
2. 컨볼루션 레이어와 차원 유지:
네트워크에는 주로 3x3 사이즈의 컨볼루션 레이어가 많이 사용됩니다.
대부분의 컨볼루션은 "same convolution"으로 동일한 차원의 피쳐 벡터를 생성하므로 스킵 연결의 차원 조정이 가능합니다.
3. 네트워크 구조:
네트워크 구조는 컨볼루션 레이어와 풀링 레이어가 번갈아가면서 등장합니다.
풀링 레이어가 등장할 때 차원 조정을 위한 행렬 Ws를 사용하고, 스킵 연결을 통해 입력과 출력의 차원을 조정합니다.
4. 전체 구조:
네트워크는 Conv-Conv-Conv-Pool 구조를 반복하고, 마지막에 fully connected 레이어를 추가하여 softmax를 사용하여 예측을 수행합니다.
Networks in Networks and 1x1 Convolutions
1. 1x1 Convolution이란?:
1x1 Convolution은 입력된 이미지의 픽셀에 숫자를 곱하는 것처럼 보이지만, 실제로는 더 복잡한 작업을 수행합니다.
6x6 크기의 이미지에 1x1 크기의 필터를 사용하여 Convolution을 적용하면, 이미지의 모든 픽셀에 동일한 값을 곱합니다.
2. 다차원 이미지에 1x1 Convolution 적용:
6x6 크기의 이미지가 32개의 채널을 가지고 있다면, 1x1 Convolution은 32개 채널 각각의 값에 해당 필터의 가중치를 적용하고 ReLU 활성화 함수를 적용합니다.
결과적으로 32채널을 가진 출력을 생성하며, 이것은 입력 이미지의 각 위치에 대한 연산을 수행합니다.
3. 다중 필터 적용:
하나의 1x1 Convolution 필터 대신 여러 개의 필터를 사용할 수 있으며, 이렇게 하면 다양한 출력을 얻을 수 있습니다.
여러 개의 필터를 사용하면 마치 한 위치에서 모든 채널에 대한 fully connected 네트워크를 사용하는 것과 같습니다.
4. 네트워크에서의 활용:
1x1 Convolution은 네트워크에서 채널의 수를 줄이거나 증가시키는 데 사용됩니다.
예를 들어, 192채널을 가진 입력 볼륨을 1x1 Convolution을 사용하여 32채널로 줄일 수 있습니다.
이러한 연산은 네트워크의 복잡성을 높일 뿐만 아니라 연산량을 줄이는 데에도 도움을 줍니다.
5. 1x1 Convolution의 영향:
1x1 Convolution은 입력 이미지의 채널 수를 변형하거나 유지하며, 복잡한 네트워크를 구축하는 데 도움을 줍니다.
Inception Network Motivation
인셉션 네트워크(Inception Network)는 컨볼루션 신경망(ConvNet) 레이어를 설계할 때, 어떤 필터 크기를 선택할지 또는 풀링 레이어를 사용할지 고르는 대신 이 모든 것을 사용하는 개념입니다. 이것은 네트워크 아키텍처를 더 복잡하게 만들지만 효과적으로 작동합니다.
예를 들어, 인셉션 레이어는 28x28x192 차원의 입력을 받았다고 가정합니다. 이 레이어는 1x1 컨볼루션, 3x3 컨볼루션, 5x5 컨볼루션, 그리고 풀링 레이어를 동시에 사용합니다. 각각의 출력은 다른 차원을 가지며, 이러한 출력을 모두 연결(concatenate)합니다.
이러한 출력을 쌓으면 하나의 인셉션 모듈이 되며, 예를 들어, 28x28x192 입력이 28x28x256 출력으로 변환됩니다. 이것이 인셉션 네트워크의 핵심 개념 중 하나입니다.
인셉션 레이어를 사용하면 여러 필터 크기와 풀링을 동시에 사용할 수 있으며, 네트워크는 어떤 조합이 가장 적합한지 스스로 학습합니다.
그러나 인셉션 레이어의 주요 문제점은 연산 비용(computational cost)입니다.