나는 오늘 무엇을 했는가?
1. AIS 7기 수업 수강
- CNN, conv와 pooling
====================================================================
컴파일
optimizer는 문자열로 지정해서 사용할 수도 있지만
메서드를 불러 사용하면 learning_rate를 지정해서 사용할 수도 있다.
optimizer = tf.keras.optimizers.RMSprop(0.001)
====================================================================
합성곱 층 만들기 (Convolutional Neural Network, CNN)
핵심 키워드: Conv, Pooling(Max)
✨ DNN과 CNN 차이점
입력층 데이터:
DNN 1차원
CNN 3차원(이미지 높이, 이미지 너비, 컬러 채널)
✨ CNN으로 모델 layor 쌓기
model = models.Sequential()
model.add(layers.Conv2D(filters = 32, kernel_size = (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D(pool_size = (2, 2))
model.add(layers.Conv2D(filters = 64, kernel_size = (3, 3), activation='relu'))
model.add(layers.MaxPooling2D(pool_size = (2, 2)))
model.add(layers.Conv2D(filters =64, kernel_size = (3, 3), activation='relu'))
※ kernel_size: 필터의 크기(3X3 등)
※ filters = 32, 32개의 피쳐맵이 출력된다.
※ conv 단계에서 padding = "same"을 사용하면 모서리 부분의 데이터의 특징을 더 잘 학습할 수 있다.
Q. MNIST(28, 28, 1) 로 3차원이다. cifar10과 input_shape 에 어떤 차이가 있을까?
A. MNIST는 흑백이라 1개만 사용했지만, cifar10은 컬러라서 RGB 3개의 컬러채널을 사용했다.
Q. 모니터나 인쇄매체 중 어디에 사용하느냐에 따라 색상의 표현방식이 달라진다.
A. 모니터에서는 보통 RGB 3원색을 사용하지만, 인쇄매체는 CMYK
Q. train_images[0][:,:,:0].shape
train_images에는 여러 장의 이미지가 있고 train_images[0]은 그 중 첫번째 이미지를 가져오는 것이다.
(image_height, image_width, color_channels) 이기 때문에 image_height, image_width는 그대로 가져오고 color_channels은 0, 1, 2 번째 값을 가져올 수 있다.
이를 적용하면 [:,:,0]은 train_images[0] image_height, image_width는 전부 다, color channels의 0번째 채널(Red)을 가져오는 것이다.
Q. 합성곱 신경망의 별명은 피쳐 자동 추출기이다. 어떻게 피처를 자동으로 추출할까?
A. 필터를 랜덤하게 여러장 만들고 각 필터의 사이즈는 kernel_size로 정한다.
필터를 이미지에 통과시켜서 합성곱 연산을 하여 결과가 나오면 그 결과로 특징을 추출한다.
필터를 랜덤하게 만들다 보면 1자 모양도 있을 수 있고, / 모양도 있을 수 있고, 0 또는 ㅁ 이러한 여러 패턴을 랜덤하게 만들 수 있을 것이다.
그리고 그 패턴을 통과시켜서 그 패턴이 얼마나 얼마나 있는지 확인해볼 수 있을 것이다.
즉, 이런 필터를 여러 장 만든다. ▶️ filters ▶️ 필터의 사이즈 조정하는 것을 kernel_size라고 부른다.
✨ 피쳐맵과 액티베이션맵
피쳐맵: 컨볼루션 결과로 나온 output
액티베이션맵: 피쳐맵이 활성화 함수를 통과한 것
✨ 패딩
이미지가 줄어드는 것을 방지하기 위해 사용하기도 하지만 패딩을 사용하면 이미지 가장자리 모서리 부분의 특징을 좀 더 학습할 수 있다.
(패딩이 있으면 모서리 값을 위에서도 한 번, 아래로 내려와서도 한 번 학습할 수 있다. 총 4번 학습가능, 패딩을 사용하지 않으면 모서리 부분은 1번 학습)
패딩을 1로 커널 사이즈를 3*3으로 사용하면 입력값과 출력값의 크기(?)가 같아진다.
✨ 풀링
합성곱층에서 받은 최종 출력 데이터(activation map)의 크기를 줄이거나 특정 데이터를 강조
데이터의 사이즈를 줄여주며 노이즈를 상쇄시키고 미세한 부분에서 일관적은 특징을 제공
계산을 효율적으로 만들어주고 데이터를 압축하는 효과가 있기 때문에 오버피팅 방지를 하기도 함
(이미지를 추상화 해주기 때문에 너무 자세히 학습하지 않도록 하기에 오버피팅이 방지됨)
종류
1️⃣ MaxPooling: 가장 큰 값을 반환
2️⃣AveragePooling: 평균 값 반환
3️⃣ MinPooling: 최솟값 반환
대체적으로 컬러이미지에는 max pooling을 가장 많이 사용하는 편이며 흑백이미지에는 min-pooling을 사용하기도 한다.
또한 커널 사이즈처럼 풀 사이즈도 지정 가능함
====================================================================
✨ 정리
1️⃣ convolution 연산을 하면 필터(filters, kernel_size에 해당하는 filters 개수만큼)를 통과시켜 filters 개수만큼 피쳐맵 생성
- CNN의 별명은 피쳐 자동추출기, 비정형 이미지를 입력했을 때 이미지를 전처리 하지 않고 그대로 넣어주어도 알아서 피쳐맵을 생성한다.
- 피쳐맵은 피쳐가 어떤 특징을 가지고 있는지 나타냄
- 선이 있는지, 곡선이 있는지, 0, 1 등등 다양한 모양을 랜덤하게 생성해서 통과시키면 해당 특징이 있는지를 학습하게 하는 것이 convolution 연산이다.
2️⃣ 피쳐맵의 output에 활성화함수(activation function)을 통과시켜 액티베이션 맵을 생성
- relu 등 활성화 함수를 사용하게 되면, 출력값에 활성화 함수를 적용한 액티베이션 맵을 반환함
3️⃣ pooling에는 Max, Average, Min 등 여러 방법이 있는데, 보통 MaxPooling 을 주로 사용함(단, 흑백이미지에서는 MinPooling 을 사용하기도 함)
- MaxPooling: 가장 큰 값을 반환
- AveragePooling: 평균 값 반환
- MinPooling: 최솟값 반환
- 이때 커널 사이즈 처럼 풀사이즈도 지정이 가능하다.
※ pooling: 이미지 크기를 줄여 효율적으로 계산을 하고 데이터를 압축하는 효과가 있기 때문에 오버피팅을 방지하기도 함(이미지를 추상화해주기 때문에 너무 자세히 학습하지 않도록 해서 오버피팅이 방지됨)
4️⃣ CNN 관련 논문을 보면 이 층을 얼마나 깊게 쌓는지에 대한 논문이 있음
- VGG16, VGG19 등은 층을 16개, 19개 만큼 깊게 만든 것을 의미(층: conv와 pooling)
- 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는 필터의 이동 보폭을 조정함
====================================================================
Q. 피쳐맵을 만드는 이유는?
A. 피쳐의 특징을 추출하기 위함이다.
Q. 이미지 데이터에 DNN을 사용하지 않고 CNN을 주로 사용하는 이유는?
1️⃣ DNN의 경우 flatten()으로 1차원 벡터 형태로 주입을 해야하며, 이는 인접 공간에 대한 정보를 읽어버리게 된다.
2️⃣ 1차원 형태로 주입을 해주게 되면 입력값이 커서 계산이 오래 걸림
3️⃣ conv와 pooling 연산을 하게 되면 데이터의 공간적인 특징을 학습하여 어떤 패턴이 있는지를 알게 된다.
4️⃣ pooling을 통해 데이터를 압축하면 데이터의 용량이 줄어들어, 추상화를 하기 때문에 너무 자세하게 학습하지 않게 되며 이는 오버피팅을 방지해준다.
머신러닝과 딥러닝의 차이
인간의 개입 여부
네트워크에 넣어주는 것은 동일하지만 CNN 에서는 미리 특징을 추출하는 층을 갖는다.
CNN과 DNN의 차이
DNN은 flatten을 통해 1차원으로 넣어주지만,
CNN은 바로 1차원으로 넣어주는 것이 아니라 conv, pooling 연산을 통해 특징을 학습하고 압축한 결과를 flatten해서 DNN에 넣어준다.
2. SQL 리트코드 2문제 풀이
3. DL 복습(초반부)
나는 오늘 무엇을 느꼈는가?
DL 복습을 계속 하고싶었는데 일정이 많은 탓인지(핑계일 수도 있다.... ㅠㅠㅠ)
요즘 SQL문제풀이와 프로젝트만 진행했던 것 같다.
DL 더 밀리기 전에 꼭 시간 내서 복습해야할 것 같다!!
할 수 있다 아자아자
총 공부시간
9시간 1분 28초
'복습 및 회고 > TIL' 카테고리의 다른 글
[TIL] 20221207 (수) (0) | 2022.12.07 |
---|---|
[TIL] 20221206 (화) (0) | 2022.12.06 |
[TIL] 20221204 (일) (0) | 2022.12.04 |
[TIL] 20221130 (수) (0) | 2022.11.30 |
[TIL] 20221129 (화) (0) | 2022.11.29 |
댓글