상세 컨텐츠

본문 제목

[TIL]1205: DNN리뷰, CNN(Convolution,Pooling) 기본개념

멋사 AISCOOL 7기 Python/TIL

by dundunee 2022. 12. 6. 00:18

본문

0902복습: DNN리뷰

  • 모델구성과 컴파일을 보고 분류 또는 회귀를 구분할 수 있는 기준? : loss값을 보고 알 수 있다! : 분류에서도 activation을 지정하지 않아도 loss를 판단할 수 있다. : 분류문제는 binary, multiclass인지 명시적으로 지정해주는게 좀 더 코드를 읽고 해석하기 쉽다. : 혼란을 줄이기 위해 명시적으로 지정해주는 게 좋다.
  • 단 분류에서는? : sigmoid의 경우1개로 해주어야 확률값으로 출력을 받아 특정 임계값보다 크다작냐로 binary값을 만들어 판단한다. : 분류에서 units이 2개라면 softmax로 반환받는 것이 좋다. 이 때 둘 중에 확률이 높은 값을 선택해서 사용한다. : 멀티클래스 예측값이 나왔을 때 가장 큰 값의 인덱스를 반환하는 넘파이 매서드는 np.argmx()이며, 이것으로 반환받은 값이 해당클래스의 답이다.
  • softmax와 sigmoid의 차이는 무앗일까요? : sigmoid는 단일 클래스 분류, softmax는 다중클래스 분류일 때 사용한다. : sigmoid는 1개의확률값이 반환되는데 그 확률값이 임계값보다 큰지 작은지 판단한다. : softmax는 n개의 확률값을 반환하고 전체의 합은 1이 된다. : 두 개 중에 하나를 예측할 때는 softmax를 사용할 수도 있기는 하지만 보통 sigmoid를 사용한다.
  • 옵티마이저 : Adam을 사용하게 되면 baseline이상의 점수가 나온다. : 또한 문자열로 지정해서 사용할 수 있지만
  • learning rate가 무엇인가? : 학습률을 의미하며, 경사하강법에서 한 발자국 이동하기 위한 step size를 의미합니다. 학습률이 클수록 손실함수의 최솟값을 빨리 찾을 수 있으나 발산의 우려가 있고 너무 작으면 학습이 지나치게 오래걸리는 단점이 있다 : 적당하게 설정해 주는 것이 좋다

!! 복습을 해본다면 출력층 compime의 loss를 보면 분류인지, 회귀인지, 이진분류인지, 멀티클래스인지를 판단해볼 수 있도록 계속 연습해보자!!


💡오늘의 핵심: 합성곱신경망(Convolutional Neural Network, CNN)💡
- Conv
- Pooling(Max)
- CNN + DNN

합성곱 신경망(Convolutional Neural Network, CNN) 텐서플로우 실습

 

합성곱 신경망  |  TensorFlow Core

12월 7일 Women in ML 심포지엄 참석 지금 등록 합성곱 신경망 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Note: 이 문서는 텐서플로 커뮤니티에서 번역했습니

www.tensorflow.org

✅ 합성곱 층 만들기

  • DNN 을 사용할 때의 입력과 CNN을 사용할 때 입력의 차이?(이미지 높이, 이미지 너비, 컬러 채널) : CNN은 배치크기를 제외하고 (이미지 높이, 이미지 너비, 컬러 채널)크기의 텐서(tensor)를 입력받는다.
  • input_shape이 MNIST(28, 28, 1)로 3차원인데, CIFAR10은 (32, 32, 3)이다
  • input_shape는 데이터 하나를 가져왔을 때 shape값 그대로 지정해준다.
  • train_image에는 여러 장의 이미지가 있기 때문에 그중 첫 이미지를 가져온게 train_images[0]다.
    • (image_height, image_width, color_channels) 이기 때문에 image_height, image_width, 는 그대로 가져오고,color_channels는 0, 1, 2번째 값을 가져올 수 있다 → 그래서 3

💡cnn explain

https://poloclub.github.io/cnn-explainer/

 

CNN Explainer

An interactive visualization system designed to help non-experts learn about Convolutional Neural Networks (CNNs).

poloclub.github.io

✅ 합성곱 신명망의 별명은 피처 자동 추출기이다. 어떻게 피처를 자동으로 추출할까?

  • 필터를 랜덤하게 여러장 만든다. 각 필터의 사이즈는 kernel_size로 정한다.
  • 필터를 이미지에 통과시켜서 합성곱 연산을 하여 결과가 나오면 그 결과로 특징을 추출할 수 있다 → 즉 필터는 특징(피쳐)를 추출한다.
  • 필터는 랜덤하게 만들다 여러모양을 랜덤하게 만들 수있고, 그 패턴을 통과시켜서 그 패턴이 얼마나 있는지 확인해 볼 수 있다.
  • 이런 패턴을 여러 장 만드는 것이 filters이며, 이 때 각 필터의 사이즈 를 kernel_size라 부른다.

✅ 하이퍼파라미터: Padding 을 사용하는 이유?

  • 이미지가 줄어드는 것을 방지하기 위해 사용하기도 하지만 가장자자리 모서리 부분의 특징을 좀 더 학습할 수 있다.
  • 패딩을 1로, 커널사이즈를 3x3으로 사용하면 입력과 출력값이 같아지게 된다.

✅ 질문모음

  • 컨볼루션 레이어를 통과한 결과 10개의 피처를 무엇이라고 부를까요? 피쳐맵
  • 피쳐맵이 relu 활성화함수를 통과한 결과를 무엇이라고 부를까요? 액티베이션 맵
  • MaxPooling 을 적용하게되면 정해진 구역 안에서 최대값을 뽑아내주고, 과대적합을 예방하며 계산의 효율성을 높여주는 장점이 있다.

✏️ 정리

1. DNN의 문제점

  • flatten()으로 1차원 벡터 형태로 주입해야하기 때문에 인접 공간에 대한 정보를 잃어버리게 된다.
  • 1차원 형태로 주입을 해주게 되면 입력값이 커서 계산이 오래 걸린다.

2. DNN과 다른 CNN의 특징

  • Conv과 Pooling연산을 하게 되면 데이터의 공간적인 특징을 학습하여 어떤 패턴이 있는지 알게된다
  • 또한 pooling을 통해 데이터를 압축하면 데이터의 용량이 줄어들며, 추상화를 하기 때문에 너무 자세히 학습하지 않게되어 오버피팅을 방지해준다.
  • 결국은 1차원으로 완전밀집연결층(Dense NN , Fully-connected NN)에 주입하게 되며, 네트워크에 넣어주는 것은 동일하지만 CNN에서는 미리 특징을 추출하는 층을 갖는다. → 즉 CNN, DNN의 가장 큰 차이는 바로 1차원으로 flatten해서 넣어주는게 아니라, Conv, Pooling연상을 통해 특징을 학습하고, 압축한 결과를 Flatten해서 DNN에 넣어주게 된다.

3. Convolution 연산을 하면 필터(filters, kernel_size에 해당하는 fiters 개수만큼)를 통과시켜서 filters개수만큼 피처맵을 생성한다.

  • CNN의 별명이 피처자동추출기 이기도 한다. 비정형 데이터를 입력했을 때 이미지를 전처리하지 않고 그대로 넣어주게 되면 알아서 피처맵을 생성한다.
  • 피처맵은 피처가 어떤 특징을 갖고 있는지를 나타낸다.
  • 다양한 모양을 랜덤하게 생성해서 통과시키면 해당 특징이 있는지를 학습하게 하는게 Convolution 연산이다.
  • Convolution 연산의 결과는 (height, width, filters)이다.
  • padding을해주면 가장자리 모서리 부분을 더 잘 학습할 수 있다.

4. 피처맵 output에 Activation Function(활성화함수)를 통과시켜서 엑티베이션맵을 생성합니다.

  • relu 등을 사용하게 되면 출력값에 활성화함수를 적용한 액티베이션 맵을 반환한다.

5. pooling에는 max, average, min등 여러 방법이 있는데, 보통 maxpooling을 주로 사용한다.

  • 대체적으로 컬러이미지에서는 Maxpooling을 가장 많이 사용하는 편이다.
  • 흑백 이미지에서는 Minpooling을 사용하기도 한다.
  • Maxpooling은 가장 큰 값을 반환, AveragePooling은 평균 값 반환, Minpooling은 최솟값 반환
  • Pooling은 이미지 크기를 줄여 계산을 효율적으로 하고 데이터를 압축하는 효과가 있으며, 추상화를 하기 때문에 오버피팅을 방지해주기도 한다.

6. CNN 관련 논문을 보면 이 층을 얼마나 깊게 쌓는지에 대한 논문이 있다.

  • VGG16, VGG19 등은 층을 16개, 19개 만큼 깊게 만든 것을 의미한다.
  • 30~50층까지 쌓기도 하고 100층 정도 쌓기도 한다.
  • 층의 수를 모델의 이름에 붙이기도 한다. → 과거에 비해 GPU 등의 연산을 더 많이 지원하기 때문에 연산이 빨라진 덕분이기도 합니다.

7. TF API 는 다음의 방법으로 사용한다 model.add(layers.Conv2D(filters=64, kernel_size=(3, 3), activation='relu')) model.add(layers.MaxPooling2D(pool_size=(2, 2)))

 

8. Padding, Stride 등을 사용해서 입력과 출력사이즈를 조정한다든지, Stride는 필터의 이동 보폭을 조정하기도 한다 → 이들은 CNN의 하이퍼파라미터이다.

관련글 더보기