[이미지 분류 모델링] Flatten(), softmax, evaluate(), sparse_categorical_crossentropy
1. 이미지와 행렬, Gray scale image, Colored image
그림 => 행렬로 표현
0~ 255까지의 숫자를 저장할 수 있는 데이터프레임 unsigned int => uint8
1개 행렬 => gray scaled
R,G,B 3개 행렬 => colored image
Start Coding
array([[[0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], ..., [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0]], [[0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], ..., [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0]], [[0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], ..., [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0]], ..., [[0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], ..., [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0]], [[0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], ..., [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0]], [[0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], ..., [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0]]], dtype=uint8)
이미지는 숫자로 되어있다. 0부터 255까지의 숫자로 되어있다.
(60000, 28, 28) # 28행 28열 짜리 사진이 6만장 있다는 뜻.
(28, 28)
(28, 28)
2
9
2. 이미지를 피져 스케일링하는 방법 :
Image normalization
학습이 잘 되도록 0과 1사이의 값으로 노말라이징(normalizing) 한다.
이미지의 가로 세로를 전부 일렬로 만드는 작업이 flatten 이다.
모델을 만들어 보자.
28*28
784
Flatten: 2차원, 3차원을 1차원으로 만드는것
Dense: 뉴런을 레이어에 붙인다.
각 레이어는 activation function 이 필요하다.
Relu effectively means "If X>0 return X, else return 0" -- so what it does it it only passes values 0 or greater to the next layer in the network.
Softmax 여러개의 값 중에서 가장 큰 값을 선택. [0.1, 0.1, 0.05, 0.1, 9.5, 0.1, 0.05, 0.05, 0.05], 여기서 가장 큰 값을 1로 만들고 나머지는 0으로 만들어준다. [0,0,0,0,1,0,0,0,0]
optimizer and loss function 으로 컴파일 한 후에 model.fit 함수로 학습한다..
3. 뉴럴넷에 이미지를 학습시킬때 텐서플로우를 활용하는 코드
from tensorflow.keras.models import Sequential
array([9, 0, 0, ..., 3, 0, 5], dtype=uint8)
Epoch 1/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.4932 - accuracy: 0.8261
Epoch 2/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3737 - accuracy: 0.8662
Epoch 3/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3337 - accuracy: 0.8788
Epoch 4/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3102 - accuracy: 0.8865
Epoch 5/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.2920 - accuracy: 0.8915
<keras.callbacks.History at 0x7f5cad9c8610>
accuracy 가 약 90% 라는 뜻. 5 epochs 라 금방 끝났다.
학습에 사용하지 않는, 테스트 데이터를 통해서, 얼마나 정확도되 나오는지 확인해 본다.
[0.35349422693252563, 0.8759999871253967]
313/313 [==============================] - 1s 1ms/step - loss: 0.3535 - accuracy: 0.8760
(10000, 28, 28)
(10000, 10)
9
y_pred[0]
array([6.9568177e-06, 1.7505666e-06, 1.9499380e-07, 1.2268709e-06, 4.2575034e-06, 1.9690637e-02, 6.4530359e-06, 1.3645212e-01, 4.7943188e-04, 8.4335691e-01], dtype=float32)
9
array([9, 2, 1, ..., 8, 1, 5])
array([9, 2, 1, ..., 8, 1, 5])
array([9, 2, 1, ..., 8, 1, 5], dtype=uint8)