#기본적인 컨브넷의 모습
from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64, (3,3), activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64, (3,3), activation='relu'))
-컨브넷이 (image_height, image_width, image_channels) 크기의 입력 텐서를 사용한다는 점이 중요하다!
-여기서는 MNIST 이미지 포멧인 (28,28,1)크기의 입력을 처리하도록 설정하여 input_shape = (28,28,1)을 첫 번째 층의 매개변수로 전달했다.
-(3,3)은 kernel size(합성곱에 사용되는 필터의 크기)값이다.
지금까지의 컨브넷 구조를 model.summary() 메서드로 확인해보면

-Conv2D, MaxPooling2D 층의 출력은 (height, width, channels) 크기의 3D 텐서이다. 높이와 너비 차원은 네트워크가 깊어질수록 작아진다. 채널 수는 Conv2D 층에 전달된 첫 번째 매개변수(32,64)에 의해 조절된다.
-이 다음 단계에서 마지막 층의 출력 텐서(3,3,64)를 완전 연결 네트워크에 주입하는데 이 분류기는 1D 텐서를 처리하므로 몇 개의 층을 추가하여 3D 출력을 1D 텐서로 펼쳐야한다.
#컨브넷 위에 분류기 추가하기
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
10개의 클래스를 분류하기 위해 마지막 층의 출력 크기를 10으로하고 softmax 활성화 함수를 사용한다

(3,3,64)출력이 (576,) 크기 벡터로 펼쳐진 후 Dense층으로 주입되었다.
이제 MNIST 이미지에 컨브넷 훈련을 진행한다