Numpy array와 Tensor 차이, 그리고 fit() 메소드
Numpy 특징
- Numpy는 SIMD(Single Instruction Multiple Data) 기반으로 수행 속도를 최적화 할 수 있어서 매우 빠르게 대량 데이터의 수치 연산을 수행할 수 있음.
- 이를 기반으로 선형 대수, 확률통계, 이미지 처리, 다양한 자연과학/공학, 그리고 머신러닝/ 딥러닝 패키지의 기반을 제공한다.
SIMD(Single Instruction Multiple Data)
- SIMD(Single Instruction Multiple Data)는 병렬 프로세서의 한 종류로, 하나의 명령어로 여러 개의 값을 동시에 계산하는 방식.
- 벡터 프로세싱에 많이 사용되며 비디오 게임, 컴퓨터 그래픽스, HPC(High Performance Computing)등의 다양한 분야에서 활용.
- 인텔 CPU에서는 4, 8, 16등의 단위 벡터 기반으로 SIMD 연산 수행.
Array와 Tensor는 논리적으로 같은 의미
Numpy Array와 Tensor의 차이
- Numpy는 GPU를 지원하지 않음
- Deep Learning 학습은 CPU SIMD 기반의 Numpy로는 감당할 수 없을 정도의 매우 많은 연산이 필요.
- Deep Learning 연산을 감당하기 위해 GPU가 필요.
- GPU를 활용한 Tensor 연산 수행(CPU 역시 가능)
Tensor는 배열 처리를 위해서 Numpy Array와 유사한 인터페이스를 가진다. 하지만, Numpy Array는 보다 범용적인 영역(예: 이미지 처리, 자연과학/공학 등)에서 그리고 Tensor는 보다 Deep Learning 전용(예: 자동 미분 등)의 기능을 가지고 있음.
CNN(Convolutional Neural Network)의 이해
일반 Dense Layer에서 Image Classfication시 주요 문제
분류 대상이 이미지에서 고정된 위치에 있는 경우는 크게 문제가 되지 않지만, 위의 사진 처럼 분류 대상이 이미지의 어디에 있을지 모르는 경우는 문제가 된다.
이미지의 크기가 커질 수록 너무 많은 Weight가 필요
CNN과 Human Brain 비교
우리 뇌에 있는 뉴런들은 특정 공간 영역에 반응을 한다.
Feature Extractor와 CNN 개요
Feature Extraction 기반의 Image Classification 메커니즘
위의 사진과 같이 이미지에서 Feature를 추출해서 분류하는 것이 큰 틀이다.
Deep Learning CNN 구조
CNN을 통해 일반적으로 더 deep한 레이어를 만들 수 있게 되었다.
CNN은 Featur Extractor + Classifier로 구성된다!!!!!
- Classfication에 맞는 최적의 Feature를 추출
- 최적의 Feature 추출을 위한 최적 Weight값을 계산
- 최적 Feature 추출을 위한 필터(필터 Weight) 값을 계산
이미지 필터(Filter)
이미지 필터링은 다양한 수식을 적용하여 이미지를 이루고 있는 픽셀 배열을 변경하여 이미지를 변형하는 것을 지칭.
보통 정방 행렬을 원본 이미지에 순차적으로 슬라이딩 해가면서 새로운 픽셀값을 만들면서 적용
Image 배열에 Convoultion 연산 적용하기
- 이미지의 좌상단부터 1 point씩 Sliding 하면서 Convolution 연산을 순차적으로 수행.
- 개별 Convolution 연산은 filter에 매핑되는 원본 이미지 배열과 filter 배열을 Element-wise하게 곱셈을 적용한 뒤 합을 구함.
Convolution 연산을 하면 이미지가 작아진다. 이것을 막기 위해 원본 이미지를 키운다(Padding). → zero padding을 통해 크기를 키운다.
필터(Filter)와 커널(Kernal) 구분
- CNN에서 Filter와 Kernal은 거의 혼용되어서 사용됨.
- 하지만 명확히 구분하자면 필터는 여러개의 Kernel로 구성되어 있으며 개별 Kernel은 필터내에서 서로 다른 값을 가질 수 있음.
kerner_size → 3x3의 크기의 정방핼렬
3x3의 크기의 정방핼렬을 가지는 필터 32개를 Convolution 연산을 하겠다라는 의미.
Kernel size 특징
- Convolution Filter를 Kernel로도 지칭.
- Kernel Size(크기)라고 하면 면적(가로x세로)을 의미하며 가로와 세로는 서로 다를 수 있지만 보통은 일치 시킨다.
- Kernel 크기가 크면 클 수록 입력 Feature Map(또는 원본 이미지)에서 더 큰(또는 더 많은) Feature 정보를 가져 올 수 있음.
- 하지만 큰 사이즈의 Kernel로 Convolution 연산을 할 경우 훨씬 더 많은 연산량과 파라미터가 필요함. → 7x7은 거의 안씀(너무 많은 연산과 파라미터가 필요해서…)
Layer가 깊어지면 깊어질수록 커버하는 영역이 커진다.
filter를 적용하여 이미지의 특징 추출
Feature Map(Activation Map) 개요
- Feature Map은 Convolution 연산을 적용한 결과이다.
- Convolution 연산을 할 때마다 Feature Map이 생성된다.
- sub-sampling layer는 풀링 layer → 적용하면 원본 피처맵의 크기가 줄어든다.
Deep Learning CNN에서의 Filter값 결정
- 일반적으로 Vision 영역에서 filter는 사용자가 목적에 맞는 특정 필터를 스스로 만들거나 기존에 설계된 다양한 필터를 선택하여 이미지에 적용
- Deep Learning CNN은 Filter값ㅇ르 사용자가 만들거나 선택할 필요 없음. Deep Learning Network 구성을 통해 이미지 분류 등의 목적에 부합하는 최적의 filter값을 학습을 통해 스스로 최적화 함.
Stride 개요
Stride는 입력 데이터(원본 Image또는 입력 Feature Map)에 Conv Filter를 적용할 때 Sliding Window가 이동하는 간격을 의미.
- 기본은 1이지만, 2를(2 pixel 단위로 Sliding window 이동) 적용하여 입력 feature map 대비 출력 feature map의 크기를 대략 절반으로 줄임.
- stride를 키우면 공간적인 feature 특성을 손실할 가능성이 높아지지만, 이것이 중요 feature들의 손실을 반드시 의미하지는 않음. 오히려 불필요한 특성을 제거하는 효과를 가져올 수 있음. 또한 Convolution 연산 속도를 향상 시킴.
Padding 개요
- Filter를 적용하여 Conv 연산 수행 시 출력 Feature Map이 입력 Feature Map 대비 계속적으로 작아지는 것을 막기 위해 적용
- Filter 적용 전 보존하려는 Feature map 크기에 맞게 입력 Feature Map의 좌우 끝과 상하 끝에 각각 열과 행을 추가 한 뒤, 0 값을 채워, 입력 Feature map 사이즈를 증가 시킴.
- 아래 4x4 Feature Map에 2x2 filter를 적용 시 출력 Feature map은 3x3이 됨. 입력 feature map의 크기를 맞추기 위해 좌우 끝과 상하 끝에 0값을 채워서 6x6 Feature map으로 변경. 그리고 2x2 filter를 적용하여 Padding 적용 전 원본 feature map 크기와 동일한 4x4 Feature Map 출력.
Padding을 이용해 원본 이미지 크기를 유지할 수 있다.
- CNN Network가 깊어 질수록(Conv 적용을 많이 할 수록) Feature Map 크기가 줄어드는 현상을 막을 수 있음.
- 모서리 주변(좌상단, 우상단, 좌하단, 우하단)의 Conv 연산 횟수가 증가되어 모서리 주변 feature 들의 특징을 보다 강화 하는 장점이 있음
- Zero Padding의 영향으로 모서리 주변에 0값이 입력되어 Noise가 약간 증가되는 우려도 있지만 큰 영향은 없음
- Keras에서 Conv2D() 인자로 padding=’same’을 넣어주면 Conv 연산 시 자동으로 입력 feaature map의 크기를 출력 feature map에서 유지할 수 있게 Padding 면적을 계산하여 적용함. padding=’valid’를 적용하면 별도의 padding을 적용하지 않고, Conv연산 수행.
Pooling 개요
- Conv 적용된 Feature map의 일정 영역 별로 하나의 값을 추출하여(주로 Max 또는 Average 적용) Feature map의 사이즈를 줄임(sub sampling). 일반적으로 Pooling 크기와 Stride를 동일하게 부여하여 모든 값이 한번만 처리 될 수 있도록 함.
- 일정 영역에서 가장 큰 값 또는 평균 값을 추출하므로 위치의 변화에 따른 feature 값의 변화를 일정 수준 중화 시킬 수 있음.
- 보통은 Conv→ReLU activation 적용 후 Activation Map에 Pooling 적용.
- Pooling은 비슷한 feature들이 서로 다른 이미지에서 위치가 달라지면서 다르게 해석되는 현상을 중화 시켜 줌
- Feature Map의 크기를 줄이므로 Computation 연산 성능 향상(Conv 적용 보다 computation이 더 간단)
- Max Pooling의 경우 보다 Sharp한 feature 값을(Edge등) 추출하고 Average Pooling의 경우 보다 Smooth한 feature값을 추출
- 일반적으로는 Sharp한 feature 보다 Classification에 유리하여 Max Pooling이 더 많이 사용됨.
Strides/Padding과 Pooling 비교
- Stride를 증가시키는 것과 Pooling 모두 출력 Feature Map의 크기를 줄이는데 사용. Conv 연산을 진행하면서 점차 Feature Map의 크기를 줄이면 위치의 변화에 따른 feature 값의 영향도 줄여서(Spatial invariance) Generalization, 오버피팅 감소 등의 장점을 얻을 수도 있음.
- Pooling의 경우 특정 위치의 feature값이 손실 되는 이슈 등으로 인하여 최근 Advanced CNN에서는 많이 사용되고 있지 않음.
- 과거 LeNet, AlexNet, VGG의 경우는 CNN(Stride/Padding) → Activation → Pooling으로 이어지는 전형적인 구조를 갖추었으나 이후 발표되는 논문등에서 Stride로 feature map 크기를 줄이는 것이 Pooling 보다 더 나은 성능을 보인다고 연구 결과를 발표하기 시작
- ResNet부터 이어지는 최근 CNN에서는 최대한 Pooling을 자제하고 Stride를 이용하여 Network를 구성하는 경향이 강해 짐.
출처 : CNN 완벽 가이드 - 권철민