@@@ 인공지능/수학·통계를 몰라도 이해할 수 있는 쉬운 딥러닝

2 - 1. 이미지 분류(Classification) 기법 활용하기(4)

HTG 2021. 7. 15. 00:52
728x90

2-1-4. CNN AI는 사물을 구분할 수 있을까?

 

데이터 살펴보기

데이터 - CIFAR10 데이터셋 사용

이전에 FNN은 색상 정보를 처리할 수 없으므로 Flatten을 실행하기에 앞서 이미지를 흑백으로 변환시키는 과정이 필요했음. 하지만 CNN은 컬러 채널 정보를 처리할 수 있으므로 별도로 흑백으로의 변환없이 데이터를 사용.

단, 노멀라이즈는 수행. 원본 이미지는 0 ~ 255 사이의 숫자로 표현된 데이터. 이를 255.0으로 나누어 0 ~ 1 사이의 숫자로 변환.

 

●어떤 인공지능 사용?

- 신경망 구조

3층짜리 CNN

층수 종류 크기 활성화 함수
1층 CNN 32, (3,3) -
- BatchNorm - ReLu
- MaxPool (2,2) -
2층 CNN 64, (3,3) -
- BatchNorm - ReLu
- MaxPool (2,2) -
3층 CNN 64, (3,3) -
- BatchNorm - ReLu
- MaxPool (2,2) -
4층 Flatten - -
5층 FNN 128 ReLu
- Dropout rate = 0.5 -
6층 FNN 10 SoftMax

1층, 2층, 3층 모두 CNN이고 활성화 함수는 렐루.

CNN의 크기는 "필터의 개수"와 "필터의 사이즈"로 구분.

1층의 경우 필터의 개수가 32, 필터의 크기가 (3,3)

2층과 3층의 경우 필터의 개수가 64, 필터의 크기가 (3,3)

 

BatchNorm - 앞서 살펴본 드롭아웃처럼 인공지능의 성능 향상을 위한 연산.

활성화 함수로는 ReLu 사용. 활성화 함수를 배치 노멀라이즈 이후에 사용한것에 주목.

'CNN - 배치 노멀라이즈 - 활성화 함수 - 풀링' 순서로 적용

 

MaxPool - '풀링 레이어(pooling layer)'라고 부르는 도구.

이미지의 사이즈를 줄이기 위해 사용. 

 

4층에 'Flatten'

각층의 CNN은 필터가 적용된 이미지를 출력. 이 이미지는 가로축과 세로축으로 구성된 2차원 데이터이므로 FNN에는 바로 입력 불가능. 따라서 이미지를 1차원 데이터로 변환하기위해 Flatten 레이어를 적용해 주어야 CNN의 출력물을 FNN으로 입력.

 

5층은 렐루가 적용된 평범한 FNN이며 드롭아웃을 사용.

 

마지막으로 출력층은 CIFAR10의 10갸 카테고리를 구분하기 위하여 크기 10에 소프트맥스를 활용하는 FNN 구성.

 

CNN이 이미지 정보를 압축해주면, 뒤에 FNN이 분류 문제를 해결하는 형태의 모델.

'CNN - 배치 노멀라이즈 - 활성화 함수 - 풀링' 의 순서로 레이어를 적용 (주목)

 

- 배치 노멀라이즈

이번 예제는 신경망을 6층. 산업에서 이용되는 AI들은 수십 층 혹은 100층 이상 깊게 쌓인 경우도 많음.

신경망을 깊게 쌓으면 쌓을수록 '내부 공변량 변화(internal convariate shift)'라는 문제가 발생한다고 주장. 

즉, 학습 과정에서 각 층의 신경망 분포가 다르게 학습되기 때문에, 이전 층의 왜곡이 다음 층에도 영향을 끼친다는 이야기.

이 문제를 해결하기 위한 수단으로 배치 노멀라이즈(batch nomalize)라는 알고리즘 제안.

배치 노멀라이즈는 실용성이 뛰어났음. 아무 딥러닝 모델에나 배치 노멀라이즈를 적용하면 학습이 잘 되고 성능이 올라갔음. 모델의 규모가 조금 커진다 싶으면 묻지도 따지지도 않고 배치 노멀라이즈를 적용하는 것이 트렌드.

하지만 배치 노멀라이즈가 성능 향상에 도움을 주는 것은 사실이지만, 배치 노멀라이즈는 '내부 공변량 변화(internal convariate shift)'를 감소시키는 효과는 없다는 것을 밝힘.

아직도 성능을 높이는 정확한 원리는 논쟁 중. 하지만 성능은 좋아짐.

 

- 풀링 레이어

풀링 레이어는 이미지의 크기를 감소시키기 위해 사용하는 장치.

이번에 사용하는 풀링 레이어는 그 크기가 2 X 2.

2 X 2 풀링 레이어는 이미지의 크기를 가로세로 모두 절반으로 줄여줌. 

풀링 방법에도 여러 가지가 있음. 보통 맥스 풀링(max pooling)과 애버리지 풀링(average pooling) 만 알고있어도 상관없음.

풀링 레이러를 적용할 때는 우선 풀링 레이어의 크기에[ 맞추어 원본 이미지를 잘라냄. 2 X 2 사이즈 풀링 레이어를 적용할 때에는 가로세로 2 X 2 사이즈 크기로 원본 이미지를 자름.

 

맥스 풀링을 적용할 때는 각 칸에 있는 데이터 중 최댓값 하나만 취하고, 애버리지 풀링을 적용할 때는 각 데이터를 평균한 값을 구함. 이 값들을 정리해 순서대로 배열하면 풀링이 끝남.

 

풀링 레이어와 반대로 압축되었던 이미지를 다시 확대시켜주는 언풀링 레이어(unpooling layer)도 있음.

 

●딥러닝 코딩

-인공신경망 제작

CNN과 배치 노멀라이즈, 풀링 레이어를 적용하는 방법에 유의

CNN을 적용할 때에는 keras.layers.Conv2D() 함수 사용. 함수를 호출하면서 '필터의 개수'와 '필터의 사이즈'를 입력. 이때 괄호를 사용해 필터의 사이즈를 하나로 묶어서 입력.

 

배치 노멀라이즈를 적용하는 방식을 확인. 배치 노멀라이즈를 적용하려는 레이어의 바로 아랫줄에서 keras.layers.BatchNormalization() 함수를 호출하면 배치 노멀라이즈 적용.

배치 노멀라이즈 이후 렐루를 따로 적용시키기 위해 keras.layers.ReLu() 함수를 호출.

풀링 레이어를 적용할 때는 keras.layers.MaxPooling2D() 함수를 사용하며, 풀링 레이어의 크기를 입력.

이때 괄호를 사용해 가로와 세로 값을 하나의 데이터로 묶어서 입력해야 정상적으로 작동.

 

- 인공신경망 컴파일

옵티마이저(optimizer) - Adam

메트릭(metrics) - accuracy

로스(loss) - sparse_categorical_crossentropy

 

●인공지능 학습

인공신경망 학습

 

학습 결과 출력

그래프로 출력

 

●인공지능 학습 결과 확인

인공지능 성능 확인하기

저자의 경우 72~76% 정도의 정확도를 보임. 이전의 FNN을 활용하여 CIFAR10 분류 정확도가 38% 정도에 비해 많이 성능이 향상된 것을 볼 수 있음.

나의 경우 71~75% 정도의 정확도를 보임.

 

학습 기록 확인하기

빨간 선이 train, 파란 선이 test

저자의 경우 Loss를 볼 때, 트레이닝은 꾸준히 내려가나 테스트는 트레이닝 보다 훨씬 위에 있으며 요동치고 있음.

accuracy를 봐도 트레이닝 성능에 비해 테스트의 성능이 부족.

이는 오버피팅의 흔적.

나의 경우도 비슷한 형태를 보임.

 

CNN뒤에 FNN이 따라오는 이유

CNN은 영상 데이터를 압축하는 능력이 뛰어남. 하지만 CNN의 출력물은 필터가 적용된 이미지로, 2차원 데이터

2차원 데이터를 활용하여 확률 질량 함수를 구하고, 분류 문제로 연결 짓는 과정은 까다로우니 편하게 FNN 분류기를 CNN뒤에 부착하여 사용.

다만 이런 과정을 대체할 방법도 많이 제안. 그 중 가장 유명한 방법은 필터의 크기가 1 X 1인 CNN을 활용하는 것.

1 X 1 사이즈 필터 10개를 가진 CNN은 수학적으로 퍼셉트론 10개로 구성된 FNN과 동치이기 때문. 이런 방법은 분류보다는 세그멘테이션(segmentation)이라는 분야에서 많이 사용.

 

CNN 하이퍼 파라미터 조정

필터 개수/ 필터 크기/ 레이어 개수/ 풀링 레이어 일부 제거 등