on
[이미지 분류 딥러닝]
[이미지 분류 딥러닝]
1. 이미지와 행렬, Gray scale 이미지, 컬러 이미지
2. 이미지를 피져 스케일링하는 방법
3. 뉴럴넷에 이미지를 학습시킬때 텐서플로우를 활용하는 코드
4. y 실제값은 레이블 인코딩이고, y 예측값은 소프트맥스로 나왔을때, 컨퓨전 매트릭스 만드는 방법
Start Coding
import tensorflow as tf print (tf.__version__) Fashion MNIST 데이터는 tf.keras datasets API에 들어있다. mnist = tf.keras.datasets.fashion_mnist
트레이닝과 테스트셋 가져온다.
(X_train, y_train),(X_test,y_test) = mnist.load_data()
X_train
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까지의 숫자로 되어있다.
X_train.shape
(60000, 28, 28) # 28행 28열 짜리 사진이 6만장 있다는 뜻.
# 첫번째 이미지를 가져오는 코드 X_train[ 0 ]
X_train[ 0 ].shape
(28, 28)
import matplotlib.pyplot as plt plt.imshow(X_train[ 0 ], cmap= 'gray' ) plt.show()
y_train.shape (60000,)
y_train[ 0 ]
9
학습이 잘 되도록 0과 1사이의 값으로 노말라이징(normalizing) 한다.
# 우리가 기본적으로 하는 피처스케일링은 두가지를 가장 많이 사용한다. # StandardScaler, MinMaxScaler를 많이 사용한다. # (Standardization, Normalization)
# 그러나 이미지는 범위가 0~255 사이로 정해져 있기 때문에 # 굳이 피처스케일러를 사용할 필요없이 # 255로 그냥 나워주기만 하면 자동으로 0과 1사이의 값으로 피처스케일링된다.
X_train = X_train / 255.0
X_test = X_test / 255.0
이미지의 가로 세로를 전부 일렬로 만드는 작업이 flatten 이다.
모델을 만들어 보자.
28*28
784 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense model = Sequential()
Sequential: SEQUENCE layers 로 모델링 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 함수로 학습한다..
from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense,Flatten
model = Sequential() # 지가 알아서 이미지 사이즈 계산해서, 인풋 레이어 만들어 준다. model.add(Flatten()) # 히든 레이어 1개 model.add(Dense(units= 128 , activation= 'relu' ))
# 아웃풋 레이어 세팅 # 아웃풋 레이어는 10개로 분류하는 문제이므로, # 노드 10개를 세팅하고 액티베이션 함수에는 소프트맥스(softmax)를 설정한다. model.add(Dense(units= 10 , activation= 'softmax' )) # 컴파일할때 옵티마이저와 로스를 설정하는데 # 2개로 분류할때의 loss는 binary_crossendtropy를 사용했다.
# 3개 이상으로 분류하는 경우에서 # y값이 어떻게 들어있는지 확인한 후, # 1. y값이 0,1,2,3,.... 이런식으로 레이블 인코딩으로 되어있는 경우는 # sparse_categorical_crossentropy를 사용하고 # 2. y값이 원핫인코딩으로 들어있는 경우 # categorical_crossentropy를 사용한다. y_train
array([9, 0, 0, ..., 3, 0, 5], dtype=uint8) model. compile (optimizer= 'adam' , loss= 'sparse_categorical_crossentropy' , metrics=[ 'accuracy' ])
# flatten일때는 model.summary()가 안된다. fit이 다 끝나고 summary 가능.
model.fit(X_train, y_train, epochs= 5 )
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
accuracy 가 약 90% 라는 뜻. 5 epochs 라 금방 끝났다.
학습에 사용하지 않는, 테스트 데이터를 통해서, 얼마나 정확도되 나오는지 확인해 본다.
model.evaluate(X_test, y_test) [0.35349422693252563, 0.8759999871253967] 313/313 [==============================] - 1s 1ms/step - loss: 0.3535 - accuracy: 0.8760
# 어떤 것을 많이 틀리는 지 확인한다. # 이런 것은 컨퓨전 매트릭스 확인하는 것!
from sklearn.metrics import confusion_matrix y_pred = model.predict(X_test)
X_test.shape
(10000, 28, 28) y_pred.shape (10000, 10) y_test[ 0 ] 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)
y_pred[ 0 ].argmax() 9 plt.imshow(X_test[ 0 ]) plt.show()
y_pred_label = y_pred.argmax(axis= 1 ) y_pred_label
array([9, 2, 1, ..., 8, 1, 5]) y_test array([9, 2, 1, ..., 8, 1, 5]) y_test array([9, 2, 1, ..., 8, 1, 5], dtype=uint8) cm = confusion_matrix(y_test, y_pred_label)
cm array([[866, 1, 36, 17, 5, 0, 68, 1, 6, 0], [ 5, 963, 1, 24, 4, 0, 2, 0, 1, 0], [ 16, 0, 844, 5, 103, 0, 31, 0, 1, 0], [ 34, 2, 22, 857, 64, 0, 18, 0, 3, 0], [ 1, 0, 108, 12, 843, 0, 33, 0, 3, 0], [ 0, 0, 0, 1, 0, 937, 0, 47, 2, 13], [161, 0, 149, 24, 82, 0, 573, 0, 11, 0], [ 0, 0, 0, 0, 0, 5, 0, 982, 0, 13], [ 6, 0, 6, 2, 5, 1, 1, 5, 974, 0], [ 0, 0, 0, 0, 0, 4, 1, 74, 0, 921]])
import seaborn as sb
sb.heatmap(data=cm, annot= True , fmt= '.0f' , cmap= 'RdPu' ) plt.show()
from http://pfshin2.tistory.com/77 by ccl(A) rewrite - 2021-12-01 11:26:48