NVIDIA: 02 ASL classification

김현정·2022년 6월 5일
0

NVIDIA

목록 보기
2/6

NVIDIA: 02 ASL classification

  • NVIDIA의 Fundamentals of Deep Learning 강좌 리뷰를 위한 글이다.

Objectives

  • 01에서 익혔던 classification문제를 다른 dataset에 적용해 볼 것이다.
  1. ASL dataset
  2. Data preparation
  3. model creation & compiling
  4. 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를 추출해오자

  • labeldataframe에서 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할 예정이다.
  1. dense input layer, 512개 neuron, relu activation function, input_shape은 (784,)
  2. second dense layer, 512 neuron, relu activation function
  3. 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

  • 20 pochs
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)에 대해 알아보자.

0개의 댓글