CNN 실습파일
합성곱 신경망의 별명 => 피처 자동 추출기 그러면 어떻게 피처를 자동으로 추출할까요?
=> 필터(filters)를 랜덤하게 여러 장 만듭니다. 각 필터의 사이즈는 kernel_size 로 정합니다.
=> 필터를 이미지에 통과시켜서 합성곱 연산을 하여 결과가 나오면 그 결과로 특징을 추출합니다.
=> 필터에는 랜덤하게 만들다 보면 1자 모양도 있을 수 있고 / 모양도 있을 수 있고 O, ㅁ 이런 여러 패턴을
랜덤하게 만들 수있겠죠. 그리고 그 패턴을 통과시켜서 그 패턴이 얼마나 있는지 확인해 볼 수 있겠죠.
이런 패턴을 여러 장 만든다 => filters => 각 필터의 사이즈 kernel_size라 부릅니다.
패딩의 사용 이유?
- 가장자리 모서리 부분의 특징을 추가적으로 학습
- 입력 데이터의 공간적 크기를 고정한 채 다음 계층에 전달하여 출력크기가 1이 되는 걸 방지(1이 되면 합성곱 연산 불가)
ex. 패딩을 1로 커널사이즈를 3x3 으로 사용하면 입력과 출력값이 같아짐.
합성곱 신경망 (Convolutional Neural Network, CNN)
1. CNN
- CNN은 필터링 기법을 인공신경망에 적용하여 이미지를 효과적으로 처리하기 위한 방법이다.
- LeCun et al., 1989에 처음 소개되었다.
- 필터링 기법은 이미지 처리 분야에 활발히 사용되는 기법으로
- 이미지의 테두리를 추출하거나 추상화하는 등의 기능을 수행하기 위해 사용된다.
- CNN의 기본 개념은 "행렬로 표현된 필터의 각 요소가 데이터 처리에 적합하도록 자동으로 학습되게 하자"는 것이다.
2. CNN의 구조
일반적인 인공신경망은 아래와 같이 affine으로 명시된 fully-connected 연산과 ReLU와 같은 비선형 활성 함수 (nonlinear activation function)의 합성으로 정의된 계층을 여러 층 쌓은 구조이다.
CNN은 아래와 같이 합성곱 계층 (convolutional layer)과 풀링 계층 (pooling layer)이라고 하는 새로운 층을 fully-connected 계층 이전에 추가함으로써 원본 이미지에 필터링 기법을 적용한 뒤에 필터링된 이미에 대해 분류 연산이 수행되도록 구성된다.
1) Convolution 연산을 하면 필터(filters, kernel_size에 해당하는 filters 개수만큼)를 통과시켜서 filters 개수만큼 피처맵을 생성한다.
=> CNN 의 별명이 피처자동추출기 이다. 비정형 이미지를 입력했을 때 이미지를 전처리 하지 않고 그대로 넣어주게 되면 알아서 피처맵을 생성한다다. 피처맵은 피처가 어떤 특징을 갖고 있는지를 나타낸다. 선이 있는지, ), O, 1, , 다양한 모양을 랜덤하게 생성해서 통과 시키면 해당 특징이 있는지를 학습하게 하는게 Convolution 연산이다.
2) 피처맵 Output에 Activation Function (활성화함수)을 통과시켜서 액티베이션맵을 생성한다.
=> relu 등을 사용하게 되면 출력값에 활성화 함수를 적용한 액티베이션맵을 반환한다.
3) Pooling
이미지 크기를 줄여 계산을 효율적으로 하고 데이터를 압축하는 효과가 있다. 이미지를 추상화 해주기 때문에 너무 자세히 학습하지 않도록해서 오버피팅이 방지되게 된다.
- MaxPooling : 가장 큰 값을 반환, 주로 사용
- AveragePooling : 평균 값 반환
- MinPooling : 최솟값 반환, 흑백 이미지에서 사용하기도 함
4) CNN 관련 논문을 보면 이 층을 얼마나 깊게 쌓는지에 대한 논문이 있습니다. VGG16, VGG19 등은 층을 16개, 19개 만큼 깊게 만든 것을 의미합니다. 30~50층까지 쌓기도 하고 100층 정도 쌓기도 합니다. 층의 수를 모델의 이름에 붙이기도 합니다.
=> 과거에 비해 GPU 등의 연산을 더 많이 지원하기 때문에 연산이 빨라진 덕분이기도 합니다.
5) TF API 는 다음의 방법으로 사용합니다.
model.add(layers.Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
6) Padding, Stride 등을 사용해서 입력과 출력사이즈를 조정한다든지, Stride는 필터의 이동 보폭을 조정하기도 합니다.
3. DNN과 CNN
DNN
1) flatten() 으로 1차원 벡터 형태로 주입을 해야 하기 때문에 인접 공간에 대한 정보를 잃어버린다.
2) 1차원 형태로 주입을 해주게 되면 입력값이 커서 계산이 오래 걸린다.
CNN
3) Conv과 Pooling 연산을 하게 되면 데이터의 공간적인 특징을 학습하여 어떤 패턴이 있는지를 알게 된다.
4) Pooling 을 통해 데이터를 압축하면 데이터의 용량이 줄어들며, 추상화를 하기 때문에 너무 자세히 학습하지 않아 오버피팅을 방지해준다.
'멋쟁이사자처럼 AIS7 > 오늘코드' 카테고리의 다른 글
[1207] 전이학습과 다차원 배열 (0) | 2022.12.07 |
---|---|
[1206]합성곱 신경망 (Convolutional Neural Network, CNN) 실습 (1) | 2022.12.06 |
[1130] DNN (0) | 2022.11.30 |
[1129] 인공신경망과 텐서플로 (0) | 2022.11.29 |
[1128] Confusion Matrix, Resampling, Deep Learning (2) | 2022.11.28 |
댓글