--21.CNN 합성곱신경망 구성요소.ipynb--
Convolution Neural Network
"""
Dense layer 에는 뉴런마다 입력개수 만큼의 가중치(weight) 가 있었고, "모든 입력"에 가중치를 '곱'했다.
그리고 절편(b) 를 추가하여 출력값을 냈다.
"합성곱" 은 입력데이터 전체에 가중치를 적용하는게 아닌, '일부'에 가중치를 곱함.
"""
None
"""
여기에서 중요한 것은 첫번째 합성곱에 사용된 가중치 w1~w3 와 절편 b 가 두번째 합성곱에도 동일하게 사용됩니다.
이렇게 '한칸씩 이동' 하면서 출력을 만드는 것이 '합성곱' 입니다.
여기에서는 이 뉴런의 가중치가 3개이기 때문에 모두 '8개의 출력'이 만들어집니다
10개의 입력 x 뉴런의 가중치가 3개 => 8개의 출력(8번의 계산)
"""
None


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
import tensorflow as tf
from tensorflow import keras
tf.keras.utils.set_random_seed(42)
tf.config.experimental.enable_op_determinism()
from sklearn.model_selection import train_test_split
(train_input, train_target), (test_input, test_target) = \
keras.datasets.fashion_mnist.load_data()
train_scaled = train_input.reshape(-1, 28, 28, 1) / 255.0
train_scaled, val_scaled, train_target, val_target = train_test_split(
train_scaled, train_target, test_size=0.2, random_state=42)
tf.keras.layers.Conv2D()
https://www.tensorflow.org/api_docs/python/tf/keras/layers/Conv2D
tf.keras.layers.Conv2D(
filters, kernel_size, strides=(1, 1), padding='valid',
data_format=None, dilation_rate=(1, 1), groups=1, activation=None,
use_bias=True, kernel_initializer='glorot_uniform',
bias_initializer='zeros', kernel_regularizer=None,
bias_regularizer=None, activity_regularizer=None, kernel_constraint=None,
bias_constraint=None, **kwargs
)
keras.layers.Conv2D(filters=10, kernel_size=(3,3), activation='relu')

padding:
zero padding을 만들 것인지. VALID는 Padding이 없고, SAME은 Padding이 있음 (사이즈에도 영향을 줌)
값이 'SAME' 이면 겉에 zero padding 을 넣어 이미지 사이즈의 변화가 없다. 합성곱에서 많이 사용되는 방식
-'VALID' 이면 padding 없구, 이미지 사이즈 변화 받는다


keras.layers.Conv2D(10, kernel_size=3, activation='relu', padding='same')
이동의 크기
keras.layers.Conv2D(10, kernel_size=3, activation='relu',
padding='same', strides=1) # strides=(1,1) 과 동일







https://www.tensorflow.org/api_docs/python/tf/keras/layers/MaxPool2D
tf.keras.layers.MaxPool2D(
pool_size=(2, 2), strides=None, padding='valid', data_format=None,
**kwargs
)
keras.layers.MaxPooling2D(pool_size=2) # pool_size=(2,2)
![]()
"""
keras 의 합성곱 층은 항상 이렇게 3차원 입력을 기대합니다.
만약 패션 MNIST 데이터처럼 graysacle 이미지일 경우에는 깊이 차원이 1인 3차원 배열로 변환하여 전달해야 합니다
(height, width) -> (height, width, channel) 형태!
예를 들어 (28, 28) 크기의 2차원 배열을 (28, 28, 1) 크기의 3차원 배열로 변환합니다.
원소 개수는 동일하면서 차원만 맞춘거죠.
"""
None
"""
합성곱층 - 풀링층 다음에 또 다시 합성곱 층이 올때
예를 들어 첫번째 합성곱 층의 필터개수가 3개라고 가정하여 첫번째 풀링 층을 통과한 특성 맵의 크기가 (6,6,3) 라고 해보죠
(즉 다음층의 입력으로 전달될 값에 '3번째 차원'이 추가되었다!)
그러면!
두번째 합성곱 층에서 필터의 너비와 높이가 각각 3이라면. 이 필터의 커널 크기는 (3, 3, 3)가 되어야 합니다.
왜냐하면 입력의 '깊이'와 필터의 '깊이'는 같아야 하기 때문입니다.
아래 그림처럼 (3 x 3 x 3 = 27 개의 가중치를 곱하고 절편을 더한) 이 합성곱의 결과는 1개의 출력을 만듭니다.
두번째 합성곱 층의 필터 개수가 2개라면 만들어진 특성맵의 크기는 (4,4,2)이 될겁니다.
만약 필터 개수가 10개라면 특성맵의 크기는 (4,4,10) 이 될것이다.
합성곱 신경망은 너비와 높이는 점점 줄어들고 깊이는 점점 깊어지는 것이 특징입니다.
그리고 마지막 출력층 전에 특성맵을 모두 펼쳐서 밀집층의 입력으로 사용하게 되는 겁니다.
★ 이를 이해해야 나중에 합성곱 신경망의 모델 파라미터를 계산할수 있습니다!!
"""
None
예시) (6, 6, 3) 크기 입력과 (3, 3, 3) 크기 커널의 합성곱
