njs03332 / ml_study

3 stars 0 forks source link

2023/05/25 ~ 2023/05/29 #69

Open njs03332 opened 1 year ago

njs03332 commented 1 year ago
njs03332 commented 1 year ago

assign roles -s 0525 -c 14.2.3 14.2.4~14.3 14.3.1

njs03332 commented 1 year ago
0 1 2
member 주선미 김유리 한단비
chapter 14.2.3 14.2.4~14.3 14.3.1
danbi5228 commented 1 year ago

14.3.1 텐서플로 구현


# 1
# 2x2 커널을 이용한 최대 풀링 층
# 스트라이드: 기본값은 커널 크기로 2가 됨
# 패딩: 기본값은 valid (패딩 없음)
# - 최대 풀링은 평균 풀링보다 강력한 이동 불변성을 제공하고 연산 비용이 조금 덜 듦
# - 일반적으로 평균 풀링 층보다 더 성능이 좋아서 대부분 최대 풀링 층 사용

max_pool = keras.layers.MaxPool2D(pool_size=2)

# 2
# 평균 풀링 층
avg_pool = keras.layers.AvgPool2D(pool_size=2)

# 3
# 깊이방향 풀링 층
# - 흔하지는 않으나 최대 풀링과 평균 풀링은 공간 차원이 아닌 깊이 차원으로 수행될 수 있음
#  - CNN이 다양한 특성에 대한 불변성을 학습할 수 있음
#  - 즉, 이미지의 회전, 왜곡 등이 발생해도 동일한 출력을 만들어 낼 수 있음
# - 케라스는 깊이방향 풀링층을 제공하지 않지만 텐서플로 저수준 딥러닝 API를 사용할 수 있음
# ksize: 배치, 높이, 너비 차원을 따라 커널 크기와 스트라이드를 1로 설정. 깊이 차원을 따라 원하는 커널 사이즈와 스트라이드 값이 마지막 값(3)
# 이 때 마지막 값은 입력 깊이를 나누었을 때 떨어지는 값이여야 함. 이전 층에서 20개의 특성 맵이 출력되면 3의 배수가 아니므로 미동작
depth_pool = keras.layers.Lambda(
    lambda X: tf.nn.max_pool(X, ksize=(1, 1, 1, 3), strides=(1, 1, 1, 3), padding="valid"))

# 4
# 전역 평균 풀링 층
# - 현대적인 신경망 구조에서 종종 사용됨
# - 각 특성 맵의 평균을 계산하여 사용함. 즉 각 샘플의 특성 맵마다 하나의 숫자를 출력함
# - 특성 맵에 있는 대부분의 정보를 잃게되는 매우 파괴적인 연산이지만 출력층에는 유용할 수 있음
global_avg_pool = keras.layers.GlobalAvgPool2D()
givitallugot commented 1 year ago

14.2.3

샘플 이미지 로드 (4D)

china = load_sample_image("china.jpg") / 255 flower = load_sample_imge("flower.jpg") / 255 images = np.array([china, flower]) batch_size, height, width, channels = images.shape

필터 2개 (4D)

filters = np.zeros(shape=(7, 7, channels, 2), dtype = np.float32) filters[:, 3, :, 0] = 1 # 수직선 filters[3, :, :, 1] = 1 # 수평선

outputs = tf.nn.conv2d(images, filters, strides=1, padding = "SAME")

plt.imshow(outputs[0, :, :, 1], cmap="gray") plt.show()

- 각 채널의 픽셀 강도는 0~255 사이의 값을 가진 바이트 하나로 표현, 이를 255로 나눠서 0과 1 사이의 실수로 바꿈
- 그 다음 7X7 필터를 만듬 (하나는 가운데 흰 수직선, 하나는 가운데 흰 수평선)
- tf.nn.conv2d() 함수를 사용해 이 필터를 두 이미지에 적용, 이 예에서는 제로 패딩(padding="SAME")과 스트라이드 1을 사용
- conv2d에서 padding은 "VALID" 또는 "SAME" 중 하나 지정 (VALID는 합성곱 층에 제로 패딩을 사용하지 않음, 스트라이드에 따라 입력 이미지의 아래와 오른쪽 행이 무시될 수 있음, SAME으로 지정하면 합성곱 층에 제로 패딩을 사용 
<img width=600 src=https://github.com/njs03332/ml_study/assets/50584633/4095b616-c04f-428a-8d22-9aa30c696eb6>

- 이 예에서 필터를 직접 지정했지만 실제 CNN에서 보통 훈련 가능한 필터를 정의하므로 앞서 설명한 것처럼 신경망이 가장 잘 맞는 필터를 학습
```python
conv = keras.layers.Covn2D(filters=32, kernel_size=3, strides=1, padding="same", activation="relus")
njs03332 commented 1 year ago

14.2.4 메모리 요구 사항

14.3 풀링 층