갈루아의 반서재

# Overview the Data Set

본 튜토리얼에서는 수화 데이터를 사용한다. 데이터셋 다운로드와 상세한 데이터셋에 대한 설명은 다음 링크를 참조한다. 

  • 데이터셋 다운로드 https://www.kaggle.com/ardamavi/sign-language-digits-dataset
  • 데이터셋 개요 https://www.kaggle.com/ardamavi/sign-language-digits-dataset/home

아래 코드를 실행시키면 input 디렉토리에 있는 파일 디렉토리가 호출된다.

1
2
3
4
5
6
7
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
from subprocess import check_output
print(check_output(["ls""../input"]).decode("utf8"))Colored by Color Scripter
cs
Sign-language-digits-dataset

간략하게 본 데이터셋에 대해 설명하면, 
  • 숫자를 나타내는 수화 이미지 2,062개가 포함되어 있음
  • 숫자는 0 에서 9로 총 10개의 유니크한 기호가 포함되어 있음
  • 튜토리얼 앞 부분에서는 이해를 돕기 위해 0과 1만 사용하여 진행함
  • 데이터에는 인덱스 204 에서 408 까지 총 205개의 0과 822 에서 1027까지 206개의 1 사인이 있음, 따라서 205개의 샘플을 사용하게 됨. 물론 205개의 샘플은 무지하기 적은 수이기는 함

그러면 X, Y 배열을 준비한다. X 는 이미지 배열 (0, 1 사인)이고, Y 는 라벨 배열 (0 과 1)이다. 

1
2
3
4
5
6
7
8
9
x_l = np.load('../input/Sign-language-digits-dataset/X.npy')
Y_l = np.load('../input/Sign-language-digits-dataset/Y.npy')
img_size = 64
plt.subplot(121)
plt.imshow(x_l[260].reshape(img_size, img_size))
plt.axis('off')
plt.subplot(122)
plt.imshow(x_l[900].reshape(img_size, img_size))
plt.axis('off')
cs
(-0.5, 63.5, 63.5, -0.5)

이미지 배열을 생성하기 위해, 0 과 1 배열을 하나로 합친다. 그리고 0 사인 이미지에는 0 배열을, 1 사인 이미지에는 1 배열을 생성한다. 

1
2
3
4
5
6
7
# Join a sequence of arrays along an row axis.
= np.concatenate((x_l[204:409], x_l[822:1027] ), axis=0
= np.zeros(205)
= np.ones(205)
= np.concatenate((z, o), axis=0).reshape(X.shape[0],1)
print("X shape: " , X.shape)
print("Y shape: " , Y.shape)
cs
X shape:  (410, 64, 64)
Y shape:  (410, 1)

X 배열의 형태는 (410, 64, 64) 이다. 여기서 410은 0과 1을 이미지를 합친 갯수를 말한다. 그리고 64는 이미지의 크기가 64x64 라는 의미이다. Y 배열은 (410,1) 의 형태를 가지는데, 410개의 0과 1 라벨을 가진다는 의미이다. 이제 X 와 Y 배열을 훈련셋과 테스트셋으로 나눠보자. 

test_size 는 테스트 사이즈의 비중을 나타내는 것으로 여기서는 15% 로 잡았다. 그리고 random_state 는 랜덤화하는 동안 같은 시드를 사용하는 것으로, 같은 random_state 를 가지면, train_test_split 를 반복적으로 호출하면 같은 훈련 및 검증 분포를 생성하게 된다. 

고정된 random_state 일 때 프로그램 실행마다 똑같은 결과를 산출한다. 따라서 문제가있는 경우 디버그하고 식별하기가 쉽다. random_state 를 설정하지 않으면 알고리즘을 실행할 때마다 다른 시드가 사용되며 다른 결과가 나온다. 

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

1
2
3
4
5
# Then lets create x_train, y_train, x_test, y_test arrays
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.15, random_state=42)
number_of_train = X_train.shape[0]
number_of_test = X_test.shape[0]
cs

1
number_of_train
cs
348
1
number_of_test
cs
62

15% 테스트 비중에 맞게 적절히 분배되었음을 알 수 있다.


1
X_train.shape
cs
(348, 64, 64)
1
Y_train.shape
cs
(348, 1)

위에서 보듯이 이제 3차원의 입력 배열(X) 가지게 되었다. 이제 그것을 2D 로 평탄화시킬 필요가 있다. 라벨 배열 (Y) 은 이미 2D 이므로 손댈 필요가 없다. 그러면 이미지 배열 X 를 평탄화시켜보자. 

1
2
3
4
X_train_flatten = X_train.reshape(number_of_train,X_train.shape[1]*X_train.shape[2])
X_test_flatten = X_test .reshape(number_of_test,X_test.shape[1]*X_test.shape[2])
print("X train flatten",X_train_flatten.shape)
print("X test flatten",X_test_flatten.shape)
cs
X train flatten (348, 4096)
X test flatten (62, 4096)

위에서 보다시피 이미지 train 배열에는 348개의 이미지가 포함되고 각 이미지는 4096 픽셀의 크기를 가진다. 그리고 test 배열에도 마찬가지로 4096 픽셀의 62개의 이미지를 가지게 된다. 이제 전치를 시키자. 


1
2
3
4
5
6
7
8
x_train = X_train_flatten.T
x_test = X_test_flatten.T
y_train = Y_train.T
y_test = Y_test.T
print("x train: ",x_train.shape)
print("x test: ",x_test.shape)
print("y train: ",y_train.shape)
print("y test: ",y_test.shape)
cs

x train: (4096, 348) x test: (4096, 62) y train: (1, 348) y test: (1, 62) 이미지 train 배열에는 348개의 이미지가 포함되고 각 이미지는 4096 픽셀의 크기를 가진다. 그리고 \es

지금까지 0과 1을 나타내는 라벨(클래스) 선택하고, 훈련 및 검증 셋트 생성 및 평탄화 작업을 했다. 최종 입력(이미지)와 출력(라벨 또는 클래스)는 다음과 같다. 

image source https://image.ibb.co/fOqCSc/3.png