반응형
Fashion MNIST
- MNIST
- 손으로 쓴 숫자들로 이루어진 대형 데이터베이스
- 다양한 화상 처리 시스템을 트레이닝하기 위해 일반적으로 사용되는 데이터베이스
- Fashion MNIST
- MNIST가 무엇인지 이해하면 이제 Fashion MNIST도 이해가 쉬울 것이다.
- 즉, 의류에 대한 데이터베이스를 인공지능이 학습하여 의류를 구분 할 수 있게 하는 라이브러리
예시에 사용 될 데이터프레임
- fashion_mnist 데이터 : tf.keras datasets API에 포함(자체적 제공)
- 10개로 분류된 의류 이미지를 분류하는 인공지능 모델 만들기
데이터프레임 호출
- 데이터셋은 텐서플로우 라이브러리 자체에 포함
- tf.keras.datasets으로 호출
- 학습/검증을 위한 이미지와 레이블 각각 2개씩 총 4개의 데이터셋을 반환
- 튜플로 2개씩 짝지어 반환하며 첫번째에는 이미지, 두번째에는 이미지가 구분된 값을 저장
- 4개의 변수 이름은 임의로 지정
- 이해하기 쉽게 풀어쓰자면 X_train, X_test, y_train, y_test
# 텐서플로 라이브러리 호출
import tensorflow as tf
# 데이터프레임 자체가 텐서플로 라이브러리에 포함
mnist = tf.keras.datasets.fashion_mnist
# 데이터프레임 호출 -> 트레이닝과 테스트셋 호출
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
데이터셋의 구조 이해하기
training_images.shape
>>> (60000, 28, 28)
- (60000, 28, 28)
- 60000 : 이미지의 순서 (첫번째 이미지)
- 28, 28 : 가로 28행, 세로 28열
데이터 구조 이해하기
training_images[0]
>>>
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]], dtype=uint8)
- images[0] : 인덱스, 데이터셋 구조의 첫번째(60000에 해당하는 부분), 즉 첫번째 이미지를 의미
- 출력 되는 값 : 각 픽셀의 RGB값(0~255), 28x28의 크기를 가지는 행렬
피쳐 스케일링 - 정규화
- 각 이미지들의 RGB(0~255)값을 피쳐 스케일링 진행
- 스케일러를 호출하지 않아도 255로 나누면 피쳐 스케일링 가능 (0~1의 값으로 변환)
# 0~ 255의 값이므로 피쳐스케일링을 따로 진행하지 않아도 된다.
training_images = training_images / 255.0
test_images = test_images / 255.0
인공지능 모델링
인공지능 딥러닝 모델링
model = tf.keras.models.Sequential()
이미지 Flatten 작업
- Flatten : 다차원의 행렬을 1차원의 행렬로 변환하는 작업, 하나의 1차원의 행렬로 이어서 붙임
- Flatten을 사용하면 input_shape를 지정하지 않아도 자동으로 지정
model.add(tf.keras.layers.Flatten())
계층(Layer) 생성
# Dense
model.add(tf.keras.layers.Dense(128, 'relu'))
활성함수 softmax를 이용하여 분류
model.add(tf.keras.layers.Dense(10, 'softmax'))
- 3개 이상의 분류 문제를 다룰 때 쓰는 활성 함수
- 데이터를 0~1사이의 값으로 정규화하여 출력되는 값들의 총 합은 1이 되는 함수
- 여러개의 값 중에서 가장 큰 값을 1을 만들고 나머지의 값들을 0으로 만듦
분류 문제의 모델 컴파일
- 현 예시의 분류에서는 의류에 대한 분류 이므로 3개이상
- y의 값이 1, 2, 3 등등 으로 나열되어 있으므로 레이블 인코딩
- sparse_categorical_crossentropy 사용
- y의 값이 1, 2, 3 등등 으로 나열되어 있으므로 레이블 인코딩
model.compile('adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
+ 분류 문제의 활성함수와 손실함수
https://luvris2.tistory.com/163
tensorflow - 분류 문제에서 활성 함수와 손실 함수 설정
분류 문제에서의 활성함수 (Activation Function) Sigmoid 2개의 분류 문제를 다룰 때 쓰는 활성 함수 알려지지 않는 파라미터를 데이터로부터 추정해 0과 1로 분류하는 것 Softmax 3개 이상의 분류 문제를
luvris2.tistory.com
인공지능 모델 학습
model.fit(training_images, training_labels, epochs=5)
성능 평가
model.evaluate(test_images, test_labels)
>>> 313/313 [==============================] - 1s 2ms/step - loss: 0.3652 - accuracy: 0.8708
[0.3651878535747528, 0.8708000183105469]
- 정확도 87퍼센트
예측된 값의 실제값 확인
- 인공지능 예측
# 예측하고 첫번째 이미지 확인
y_pred = model.predict(test_images)
plt.imshow( test_images[0], cmap='gray')
- 예측값의 실제값 확인
y_pred[0].argmax()
>>> 9
- 실제 데이터와 일치하는지 확인
test_labels[0]
>>> 9
- + 소프트맥스의 함수 특성 확인하기 (모든 합이 1이 되는 함수)
# 레이블 인코딩된 소프트맥스 활성함수 이용 출력 값
y_pred[0]
>>> array([7.8119228e-06, 8.7083414e-08, 6.8455364e-08, 1.5924198e-07,
2.8541135e-07, 3.0820727e-04, 3.5284240e-06, 1.9661729e-01,
4.1257539e-05, 8.0302131e-01], dtype=float32)
# 가장 높은 값의 값
y_pred[0].max()
>>> 0.8030213
# 모든 값의 합 확인, 소프트맥스 함수의 특성 충족
y_pred[0].sum()
>>> 1.0
결과 지표 확인하기
- 예측값(y_pred)이 레이블 인코딩 된 값이므로 실제값만 남기기
# 실제값의 열만 변수에 재저장
y_pred = y_pred.argmax(axis=1)
- 결과지표 보기
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(test_labels, y_pred)
cm
>>>
array([[880, 1, 9, 16, 1, 2, 89, 0, 2, 0],
[ 7, 966, 0, 22, 2, 0, 3, 0, 0, 0],
[ 25, 0, 742, 19, 121, 0, 92, 0, 1, 0],
[ 29, 5, 6, 900, 17, 0, 40, 0, 3, 0],
[ 1, 1, 85, 53, 767, 0, 89, 0, 4, 0],
[ 0, 0, 0, 1, 0, 912, 0, 74, 1, 12],
[174, 0, 66, 25, 59, 0, 668, 0, 8, 0],
[ 0, 0, 0, 0, 0, 5, 0, 986, 1, 8],
[ 13, 0, 3, 5, 3, 1, 7, 4, 964, 0],
[ 0, 0, 0, 1, 0, 4, 1, 91, 0, 903]])
- 결과지표 히트맵으로 보기
import seaborn as sns
sns.heatmap(cm, annot=True,fmt='.0f', cmap='RdPu')
plt.show()
Fashion-MNIST 모델링시 주의사항
- 화상 처리의 분류 모델에서는 Flatten 라이브러리를 쓰지 않으면 에러 출력, 반드시 사용
- 출력층이 학습할 컬럼수보다 적으면 학습을 시행하지 않음 (loss:nan, accuracy:0.100 출력)
- epochs가 많을수록 과대적합 현상 발생
- 과대적합(Overfitting) : 너무 많은 학습으로 학습한 결과가 학습에 사용된 데이터와 거의 일치하여 새로운 데이터가 들어 왔을 때 예측이 틀려버리는 상태
반응형