NVIDIA: 02 ASL classification
- NVIDIA의 Fundamentals of Deep Learning 강좌 리뷰를 위한 글이다.
Objectives
- 01에서 익혔던 classification문제를 다른 dataset에 적용해 볼 것이다.
- ASL dataset
- Data preparation
- model creation & compiling
- model training
ASL dataset
- American Sign Language data
- 26개의 알파벳을 가지고 만든 dataset이다.
- j와 z는 움직임이 필요한 글자이므로 training dataset에 포함되지 않는다. 따라서 y label은 0~23개의 총 24가지 경우를 가짐.
Data Loading
- MNIST Dataset처럼 Keras에 load되어 있는 data가 아님
- CSV(Comma Separated Values) format
- Pandas library를 사용하여 CSV file을 DataFrame이라는 format으로 읽어온다.
- 이 문제에서 dataset은 data/asl_data/. 에 저장되어 있다.
import pandas as pd
train_df = pd.read_csv("data/asl_data/sign_mnist_train.csv")
valid_df = pd.read_csv("data/asl_data/sign_mnist_valid.csv")
data 관찰
- head method를 사용하면 dataframe의 앞줄 몇개의 row를 print해준다.
- 각 row에는 label과 784개의 pixel에 해당하는 값이 저장되어 있다.
train_df.head()
label과 image를 추출해오자
- label은 dataframe에서 label에 해당하는 column만 읽어온 후 csv파일에서 해당 column을 삭제해준다.
- image pixel값은 label column이 제거된 dataframe의 나머지 value들을 저장하면 된다.
y_train = train_df['label']
y_valid = valid_df['label']
del train_df['label']
del valid_df['label']
x_train = train_df.values
y_valid = train_df.values
data
- x_train은 (27455, 784)
- y_train은 (27455, )
- x_valid는 (7172, 784)
- y_valid는 (7172, )
++ ( y label은 0~23의 값을 가지고 있다. 26개의 알파벳에서 j와 z제외)
Visualizing
- 이미지 visualizing을 위해서는 784개의 1D pixel로 되어있는 row를 2D의 28*28 piexel로 재구성 해야한다.
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.axie('off')
plt.imshow(image, cmap='gray')
Normalizing
- dataset의 x value들은 0~255의 integer값을 갖는다.
- deep learning의 training은 0~1사이의 floating point value를 가져야 학습에 용이하므로 normalizing을 해준다.
x_train = x_train/255
x_valid = x_valid/255
또는
x_train = train_df.values/255
x_valid = valid_df.values/255
Categorize the Labels
- keras의 keras.utils.to_categorical method를 사용하여 y label값을 one-hot encoding을 따르도록 한다.
import tensorflow.keras as keras
num_classes = 24
if not y_train.shape[-1] == 24:
y_train = keras.utils.to_categorical(y_train, num_classes)
y_valid = keras.utils.to_categorical(y_valid, num_classes)
Model building
- 지금까지 준비시킨것은 data, normalized images, categorically encoded labels
우리는 다음과 같은 Sequential model을 build할 예정이다.
- dense input layer, 512개 neuron, relu activation function, input_shape은 (784,)
- second dense layer, 512 neuron, relu activation function
- dense output layer, class개수와 같은 neuron, softmax activation function
model summarizing
model.summary()
Model Compiling
- 많은 category중 하나로 fit하고 싶으므로 categorical_crossentropy사용
- model의 accuracy를 측정하고 싶음
model.compile(loss='categorical_crossentropy', metrics=['accuracy'])
Model Training
model.fit(x_train, y_train, epochs=20, verbose=1, validation_data=(x_valid, y_valid))
Overfitting
- training의 높은 accuracy에 비해 test의 accuracy가 낮음.
- training data를 외워서 unseen data에 대해서는 잘 적용되지 않음
GPU memory정리
import IPython
app = IPython.Application.instance()
app.kernel.do_shutdown(True)
Next
- 지금까지는 data를 loading하고 preparation한뒤, 간단한 model을 build하여 학습해봄
- 좀더 복잡한 모델인 CNN(convolutional Neural Network)에 대해 알아보자.