from tensorflow import keras
keras.layers.Conv2D(10, kernel_size=(3,3),activation='relu')
-> 첫 번째 매개변수는 커널의 개수이고, 두 번째 매개변수는 사용할 커널의 사이즈이다.
keras.layers.Conv2D(10, kernel_size=(3,3), activation='relu', padding='same', strides=1)
-> 마지막 매개변수인 strides(스트라이드)는 이동의 크기로 기본값이 1이며, 보통 기본값 그대로 사용한다.
-> 풀링에는 가중치가 없다. 도장을 찍은 영역에서 가장 큰 값을 고르면 최대 풀링, 평균값을 계산하면 평균 풀링이라고 부른다. 풀링에서는 겹치지 않게 이동하기 때문에 풀링 크기가 (2,2)라면 스트라이드가 2, (3,3)이라면 스트라이드가 3이다.
만약 RGB(빨강, 초록, 파랑)으로 구성된 컬러 이미지를 사용한다면 깊이가 3인 커널을 활용하면 된다. 예를 들어 (4,4,3) 입력을 (3,3,3) 커널을 이용한다면 (2,2) 크기의 특성 맵이 만들어진다. 즉, 입력이나 필터의 차원이 몇 개인지 상관없이 항상 출력은 하나의 값이다.
fashion MNIST 데이터셋을 이용하여 저번과 같이 학습 데이터와 검증 데이터를 나누어준 뒤, 합성곱 신경망을 만든다면 아래와 같다.
model = keras.Sequential()
# 32개의 (3,3) 커널을 이용하여 세임 패딩을 해준다.
model.add(keras.layers.Conv2D(32, kernel_size=3, activation='relu', padding='same', input_shape=(28, 28, 1)))
#(2,2) 크기의 최대 풀링을 한다.
model.add(keras.layers.MaxPooling2D(2))
# 64개의 (3,3) 커널을 이용하여 세임 패딩을 해준다.
model.add(keras.layers.Conv2D(64, kernel_size=3, activation='relu', padding='same'))
# (2,2) 크기의 최대 풀링을 한다.
model.add(keras.layers.MaxPooling2D(2))
# 특성 맵을 일렬로 펼쳐서 신경망을 통과시킨다.
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.Dense(10, activation='softmax'))