📝딥러닝 DNN 텐서플로우 이미지를 분류하는 딥러닝 해보기
TensorFlow keras datasets API에 들어있는 Fashion MNIST데이터를 가져온다
mnist = tf.keras.datasets.fashion_mnist
트레이닝셋과 테스트셋을 가져온다
※ 텐서플로우에서 사진을 넘파이로 변환해둔 데이터
X_train.shape의 결과 값은 (60000, 28, 28) = 28행 28열 6만장(갯수)이다
(X_train, y_train), (X_test, y_test) = mnist.load_data()
해당 데이터에 들어있는 두번째 사진의 이미지를 확인해보기 위해 pyplot의 imshow() 사용
plt.imshow(X_train[1], cmap='gray')
plt.show()
학습이 잘 되도록 0과 1사이의 값으로 노말라이징(normalizing)
※ 이미지의 최대값으로 나눈다
X_train = X_train / 255.0
X_test = X_test / 255.0
이미지의 가로 세로를 전부 일렬로 만드는 작업을 해주어(flatten) 모델을 만든다
from keras.models import Sequential
from keras.layers import Dense
from keras. layers import Flatten
def build_model() :
model = Sequential()
# 인풋레이어 Flatten() 사용
model.add( Flatten() )
model.add( Dense( units= 128, activation= 'relu') )
model.add( Dense( units= 64, activation= 'relu') )
model.add( Dense( units=10, activation= 'softmax' ) )
# 로스펑션은 y값이 레이블 인코딩으로 되어있으므로 sparse_categorical_crossentropy 사용
model.compile( optimizer= 'adam', loss= 'sparse_categorical_crossentropy', metrics= [ 'accuracy' ])
return model
※ Flatten 라이브러리 없이 평탄화 하는 방법
# 아래 코드의 결과값은 (60000, 28, 28) 이다
X_train.shape
# 28 * 28 = 784이므로 열을 784로 변환해준다
X_train = X_train.reshape(60000, 784)
# X_test의 값도 변환해준다
X_test = X_test.reshape(10000, 784)
# 데이터 타입을 변경한 후 모델링할때 입력 input_shape=(784, )
def build_model() :
model = Sequential()
model.add( Dense( units= 128, activation= 'relu', input_shape=(784, ) ) )
model.add( Dense( units= 64, activation= 'relu') )
model.add( Dense( units=10, activation= 'softmax' ) )
model.compile( optimizer= 'adam', loss= 'sparse_categorical_crossentropy', metrics= [ 'accuracy' ])
return model
모델을 만들었으니 학습시킨다
model = build_model()
model.fit(X_train, y_train, epochs= 5)
나온 결과를 확인하고 학습에 사용하지 않은 테스트 데이터를 통해서 얼마의 정확도가 나오는지 확인한다
model.evaluate(X_test, y_test)
테스트 데이터를 예측시켜 변수에 저장한다
※ 예측한 결과는 리스트로 나온다 ANN의 아웃풋의 노드(뉴런)수가 10개 이기 때문에
softmax 활성화 함수를 통해서 0~1사이의 10개의 숫자가 나오게 되어있다
y_pred = model.predict(X_test)
컨퓨전 매트릭스를 이용해서 어떤것을 컴퓨터가 많이 헷갈려 하는지 파악한다
※ numpy의 argmax() 함수를 이용하면 가장 큰 값이 들어있는 곳의 인덱스를 얻을 수 있다
from sklearn.metrics import confusion_matrix
# argmax() 함수를 이용해 레이블 인코딩
y_pred = y_pred.argmax(axis=1)
# 행이 실제값, 열이 예측값이다
confusion_matrix(y_test, y_pred)
그냥 보기엔 구분이 잘 가지 않으니 히트맵으로 확인한다
sb.heatmap(cm, annot= True, fmt='.0f', cmap='RdPu')
plt.show()
CNN으로 해보기 (https://coding-jisu.tistory.com/166)
'인공지능 > Deep Learning' 카테고리의 다른 글
[Deep Learning] TensorFlow 모델 저장 / 불러오기 (0) | 2022.12.29 |
---|---|
[Deep Learning] Dropout (0) | 2022.12.29 |
[Deep Learning] epochs 횟수 조정 (0) | 2022.12.29 |
[Deep Learning] 분류 문제 Loss 셋팅 (0) | 2022.12.28 |
[Deep Learning] activation Softmax (0) | 2022.12.28 |
댓글