import tensorflow as tf
import pandas as pd
(독립, 종속),_ = tf.keras.datasets.mnist.load_data()
print(독립.shape, 종속.shape)
독립변수와 종속변수를 지정하고, 두 변수의 shape를 출력
독립 = 독립.reshape(60000,28,28,1)
종속 = pd.get_dummies(종속)
print(독립.shape, 종속.shape)
컨볼루션 레이어는 이미지 하나의 shape이 2차원이면 안되고 3차원이어야 하므로 reshape로 28x28x1의 3차우너 형태로 바꾼다.
종속 변수는 10개의 칼럼으로 원핫 인코딩한다.
X = tf.keras.layers.Input(shape=[28,28,1])
H = tf.keras.layers.Conv2D(3, kernel_size=5, activation='swish')(X)
컨볼루션 레이어를 지정할 때 맨 앞에는 우리가 몇개의 특징맵을 만들지를 생각해서 필터를 써야하는데, 우리는 필터를 3장을 쓰기로 했다. 커널 사이즈는 5x5로 사용하기로 했고, 덴스레이어와 마찬가지로 활성화 함수를 주어야한다.
H = tf.keras.layers.Conv2D(6, kernal_size=5, activation = 'swish')(X)
H = tf.keras.layers.Flatten()(H)
H = tf.keras.layers.Dense(84, activation='swish')(H)
Y = tf.keras.layers.Dense(10, activation='softmax')(H)
model = tf.keras.models.Model(X, Y)
model.compile(loss='categorical_crossentropy',metrics='accuracy')
컨볼루션 레이어를 하나 더 쌓았다. 두번째 레이어의 필터는 6장, 커널 사이즈는 5로 지정했다.
컨볼루션 레이어를 통과하고 나면 그 결과물은 테이블 형태가 아닌 이미지 여러장으로 표현된 데이터가 구성되고, 이 데이터를 Flatten 레이어를 이용하여 한줄로 펴서 표 형태로 바꿔준다.
표 형태로 펼치고 나면 Dense레이어를 활용할 수 있다.
최종적으로 10개의 분류를 만든다.
model.fit(독립, 종속, epochs=10)
pred = model.predict(독립[0:5])
pd.DataFrame(pred).round(2)
종속[0:5]
model.summary()
모델을 학습하고 결과물을 출력하고 종속변수를 출력해서 값을 비교한 뒤 summary로 모델을 확인했다.

input_1 레이어에 28x28 이미지 1장이 들어가서 conv2d에서 24x24로 줄어든다. 필터가 5x5 크기이므로, 가로, 세로가 4픽셀씩 줄어든 것이다.
conv2d_1 레이어를 통과한 다음에 6장의 특징맵이 만들어졌다. 이미지 한장에서 특징을 뽑아낸 맵 6개가 만들어진 것이다. 즉, 이미지 한 장에 대한 정보가 담겨 있는 것이다.
이미지 한 장당 400픽셀이므로 2400픽셀이 들어가 있을 것이고, 이것을 한줄로 편 flatten레이어는 2400칼럼이 된다.
그 다음에 dense레이어로 84개의 칼럼을 만들라고 했고, 마지막 dense_1레이어에 10개의 칼럼을 만들어 달라고 했다.