미국 수화 데이터세트 이미지 분류
시작하기 전 배울 개념
- MNIST 연습하러 가기
➡ 아래의 문제와 거의 유사하니 위의 개념을 완전히 숙지하고 오자
목표
- 트레이닝을 위한 이미지 데이터 준비
- 이미지 분류를 위한 단순 모델 생성 및 컴파일
- 이미지 분류 모델 트레이닝 및 결과 관찰
미국 수화 데이터셋 설명
- 26개의 문자가 포함
- 이 중 두 개의 문자(j 및 z)에는 동작이 요구되므로 제외
데이터 로드
MNIST와 동일한 방식으로 Keras를 통해 제공되지 않음
➡ x_train, y_train, x_valid , y_valid 를 부르기 위한 다른 방법 필요
데이터 읽기
수화 데이터세트는 csv 형식으로 되어있음.
- 상단에 레이블이 있는 행과 열로 이루어진 그리드
- 데이터를 로드하여 작업하기 위해 데이터 로드 및 조작을 위한 고성능 툴인 Pandas라는 라이브러리를 사용
- CSV 파일은 DataFrame이라는 형식으로 읽음
import pandas as pd
Pandas에는 csv 파일을 예상하고 DataFrame을 반환하는 read_csv 메서드가 존재
- 이를 통해 데이터를 불러 올 것임
train_df = pd.read_csv("data/asl_data/sign_mnist_train.csv")
valid_df = pd.read_csv("data/asl_data/sign_mnist_valid.csv")
데이터 살펴보기
- head 메서드를 사용하여 DataFrame의 처음 행 몇 개를 출력
- 784개의 값을 지닌 이미지
train_df.head()
레이블 추출
트레이닝 및 검증 레이블을 y_train 및 y_valid 변수에 저장하는 법
1️⃣ 해당 변수를 생성
2️⃣ 다음 레이블이 더 이상 필요없는 데이터프레임 원본에서 레이블을 삭제
# label 이라는 열이 정답열임
y_train = train_df['label']
y_valid = valid_df['label']
del train_df['label']
del valid_df['label']
이미지 추출
트레이닝 및 검증 이미지를 x_train 및 x_valid 변수에 저장
x_train = train_df.values
x_valid = valid_df.values
트레이닝 및 검증 데이터 요약
[트레이닝]
- x_train.shape: 트레이닝을 위한 각각 784개 픽셀을 포함하는 27,455개의 이미지 존재
- y_train.shape: 트레이닝을 위한 위 이미지의 레이블(정답)
x_train.shape
# (27455, 784)
# (이미지 개수, 각 픽셀 개수)
y_train.shape
# (27455,)
# (위 이미지의 정답 개수,)
[검증]
- x_valid.shape :검증을 위한 7,172개의 이미지, 784개의 픽셀 존재
- y_valid.shape: 검즐을 위한 이미지의 정답
x_valid.shape
# (7172, 784)
# (이미지 개수, 픽셀개수)
y_valid.shape
# (7172,)
# 이미지 정답개수
데이터 시각화
- matplotlib 라이브러리를 사용
- 이미지를 이용하기 위해 784개 픽셀로 이루어진 1D 모양 ➡ 28x28픽셀로 이루어진 2D 모양
import matplotlib.pyplot as plt
plt.figure(figsize=(40,40))
num_images = 20
for i in range(num_images):
row = x_train[i]
label = y_train[i]
image = row.reshape(28,28)
plt.subplot(1, num_images, i+1)
plt.title(label, fontdict={'fontsize': 30})
plt.axis('off')
plt.imshow(image, cmap='gray')
–
TEST
이미지데이터 정규화
데이터의 픽셀 값이 현재처럼 0~255가 아닌 0~1의 부동 소수점 값이 되어야함
보기전에 코드 직접 쳐보고 정말 정답 확인용으로 봐라
👀 정답 코드 보기
x_train = x_train / 255
x_valid = x_valid / 255
레이블 분류
keras.utils.to_categorical
메서드를 사용하여 여기에 인코딩할 값과 값을 인코딩할 범주 수를 전달해 범주 인코딩keras를 가져와 범주 수(24)를 설정해둠
import tensorflow.keras as keras
num_classes = 24
이 다음 코드를 짜봐라
- Categorically encode y_train and y_valid
👀 정답 코드 보기
# TODO: Categorically encode y_train and y_valid.
y_train = keras.utils.to_categorical(y_train, num_classes)
y_valid = keras.utils.to_categorical(y_valid, num_classes)
모델 분류
데이터가 모두 준비되었음 이제 순차모델 구축할 차례
다음과 같은 모델을 구축해봐라
1️⃣ 입력 레이어: dense, 512개의 뉴런 포함, 활성화 함수 relu 사용, 입력이미지 모양(784,)
2️⃣ 512개의 뉴런 포함, 활성화 함수 relu사용, 밀집 레이어 지님
3️⃣ 뉴런 수 = 클래스, 활성화 함수 softmax, 밀집 출력 레이어 지님
➕ 모델을 저장할 model 변수를 생성
- Keras 순차 모델 클래스와 Dense 레이어 클래스를 가져옴
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
👀 정답 코드 보기
models = Sequential() # 인스턴스 생성
model.add(Dense(units = 512, activation='relu', input_shape=(784,))) #1️⃣
model.add(Dense(units = 512, activation='relu')) #2️⃣
model.add(Dense(units = num_classes, activation='softmax')) #3️⃣
모델 요약
👀 정답 코드 보기
model.summary()
모델 컴파일
실제로 데이터를 사용하여 모델을 트레이닝하기 전에 수행해야 할 마지막 단계
- 손실함수:
categorical crossentropy
사용 - 모델의 정확도를 측정
👀 정답 코드 보기
model.compile(loss='categorical_crossentropy', metrics=['accuracy'])
모델 트레이닝
모델의 fit
메서드를 사용하여 위에서 생성한 트레이닝 및 검증 이미지와 레이블로 20에포크 동안 트레이닝해라.
👀 정답 코드 보기
model.fit(x_train, y_train, epochs=20, verbose=1, validation_data=(x_valid, y_valid))
결과 해석
먼저 결과를 보자
Epoch 1/20
858/858 [==============================] - 2s 3ms/step - loss: 1.9609 - accuracy: 0.3805 - val_loss: 1.4943 - val_accuracy: 0.5194
Epoch 2/20
858/858 [==============================] - 2s 3ms/step - loss: 0.9549 - accuracy: 0.6765 - val_loss: 1.0257 - val_accuracy: 0.6767
Epoch 3/20
858/858 [==============================] - 2s 3ms/step - loss: 0.5751 - accuracy: 0.8078 - val_loss: 1.6662 - val_accuracy: 0.5782
Epoch 4/20
858/858 [==============================] - 2s 3ms/step - loss: 0.3964 - accuracy: 0.8738 - val_loss: 0.8707 - val_accuracy: 0.7769
Epoch 5/20
858/858 [==============================] - 2s 3ms/step - loss: 0.3031 - accuracy: 0.9107 - val_loss: 1.8709 - val_accuracy: 0.6090
Epoch 6/20
858/858 [==============================] - 2s 3ms/step - loss: 0.2558 - accuracy: 0.9319 - val_loss: 1.0081 - val_accuracy: 0.7864
Epoch 7/20
858/858 [==============================] - 2s 3ms/step - loss: 0.2183 - accuracy: 0.9418 - val_loss: 2.5155 - val_accuracy: 0.6352
Epoch 8/20
858/858 [==============================] - 2s 3ms/step - loss: 0.2059 - accuracy: 0.9524 - val_loss: 1.5742 - val_accuracy: 0.7352
Epoch 9/20
858/858 [==============================] - 2s 3ms/step - loss: 0.1746 - accuracy: 0.9594 - val_loss: 0.9821 - val_accuracy: 0.8316
Epoch 10/20
858/858 [==============================] - 2s 3ms/step - loss: 0.1803 - accuracy: 0.9654 - val_loss: 1.2241 - val_accuracy: 0.8228
Epoch 11/20
858/858 [==============================] - 2s 3ms/step - loss: 0.1793 - accuracy: 0.9632 - val_loss: 1.4079 - val_accuracy: 0.8049
Epoch 12/20
858/858 [==============================] - 2s 3ms/step - loss: 0.1732 - accuracy: 0.9649 - val_loss: 1.3251 - val_accuracy: 0.8377
Epoch 13/20
858/858 [==============================] - 2s 3ms/step - loss: 0.1434 - accuracy: 0.9703 - val_loss: 1.8805 - val_accuracy: 0.7966
Epoch 14/20
858/858 [==============================] - 2s 3ms/step - loss: 0.1503 - accuracy: 0.9705 - val_loss: 1.3894 - val_accuracy: 0.8381
Epoch 15/20
858/858 [==============================] - 2s 3ms/step - loss: 0.1442 - accuracy: 0.9728 - val_loss: 1.8816 - val_accuracy: 0.7705
Epoch 16/20
858/858 [==============================] - 2s 3ms/step - loss: 0.1488 - accuracy: 0.9747 - val_loss: 2.1172 - val_accuracy: 0.7724
Epoch 17/20
858/858 [==============================] - 2s 3ms/step - loss: 0.1410 - accuracy: 0.9766 - val_loss: 1.3971 - val_accuracy: 0.8404
Epoch 18/20
858/858 [==============================] - 2s 3ms/step - loss: 0.1620 - accuracy: 0.9748 - val_loss: 3.0549 - val_accuracy: 0.7453
Epoch 19/20
858/858 [==============================] - 2s 3ms/step - loss: 0.1318 - accuracy: 0.9781 - val_loss: 1.8434 - val_accuracy: 0.8310
Epoch 20/20
858/858 [==============================] - 2s 3ms/step - loss: 0.1211 - accuracy: 0.9812 - val_loss: 1.7680 - val_accuracy: 0.8434
<tensorflow.python.keras.callbacks.History at 0x7fb84e4138d0>
트레이닝 정확도는 [높/낮]고 테스트 정확도가 [높/낮] 다.
이유는 ( ) 이기 때문이다
👀 정답 보기
트레이닝 정확도는 높고 테스트 정확도가 낮다.
이유는 overfiting이기 때문이다
메모리
넘어가기 전에 다음 셀을 실행하여 GPU 메모리를 지우기
이는 다음 노트북으로 넘어가기 위한 필수 작업
import IPython
app = IPython.Application.instance()
app.kernel.do_shutdown(True)