AI/Machine Leaning
[Deep Leaning] 알파벳 수화(Sign Language MNIST) 예제
Sungwoo Koo
2022. 5. 17. 21:47
딥러닝을 공부하며 캐글(Kaggle)의 dataset을 활용해 실습한 내용을 기록하기 위해 작성한 글이다
순서
Kaggle에서 Sign Language MNIST 를 받아 알파벳 수화 이미지를 이용해서 알파벳을 예측하는 과정은 다음과 같다
1. 캐글(Kaggle) 환경 변수 설정 (os)
2. 데이터셋 다운로드
3. 데이터셋 로드 (pandas.read_csv)
4. 전처리
5. 모델 설계
6. 모델 학습
7. 학습 결과 - history 그래프
1. 캐글(Kaggle) 환경 변수 설정 (os)
import os
os.environ['KAGGLE_USERNAME'] = 'username'
os.environ['KAGGLE_KEY'] = 'key'
2. 데이터셋 다운로드
!kaggle datasets download -d datamunge/sign-language-mnist
!unzip sign-language-mnist.zip
3. 데이터셋 로드 (pandas.read_csv)
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.optimizers import Adam, SGD
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder
train_df = pd.read_csv('sign_mnist_train.csv')
train_df.head()
# 라벨은 알파벳을 의미 0 : A, 1 : B, ...
# 28 * 28 이미지를 일렬로 펼쳐 놓은 것
4. 전처리
[입/출력 나누기]
train_df = train_df.astype(np.float32)
x_train = train_df.drop(columns=['label'], axis=1).values
y_train = train_df[['label']].values
test_df = test_df.astype(np.float32)
x_test = test_df.drop(columns=['label'], axis=1).values
y_test = test_df[['label']].values
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
# 트레이닝 데이터 셋은 학습시키려는 이미지가 27455개 (784는 픽셀의 수 (28*28))
# 테스트 데이터 셋은 테스트하려는 이미지가 7172개
[데이터 미리보기]
index = 1
plt.title(str(y_train[index]))
# 픽셀이 일자로 쭉 늘어서 있으니 2차원으로 reshape해야 우리가 볼 수 있는 이미지가 된다.
# cmap='gray' : gray 스케일로 이미지를 뿌리게 하는 명령어
plt.imshow(x_train[index].reshape((28,28)), cmap='gray')
plt.show()
# index 1 이미지는 라벨이 6인 이미지
[One-hot encoding]
# One-hot encoding 이후 라벨이 어떻게 변경되었는지 확인
index = 1
plt.title(str(y_train[index]))
plt.imshow(x_train[index].reshape((28,28)), cmap='gray')
plt.show()
# 라벨의 값이 6에서 [0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. ... 0.] 으로 성공적으로 인코딩 되었다
[일반화(Nomalization)]
# 이미지 데이터는 픽셀이 0~255 사이의 정수로 되어있다.
# 이것을 255로 나누어 0~1 사이의 소수점 데이터로 일반화 시킨다.
x_train = x_train / 255.
x_test = x_test / 255.
5. 모델 설계
input = Input(shape=(784,))
hidden = Dense(1024, activation='relu')(input)
hidden = Dense(512, activation='relu')(hidden)
hidden = Dense(256, activation='relu')(hidden)
output = Dense(24, activation='softmax')(hidden) # 다항 논리 회귀의 경우이므로 softmax 사용
model = Model(inputs = input, outputs = output)
model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.001), metrics=['acc'])
model.summary()
# 이제 Total params : 1,466,136 개의 weight와 bias를 학습 시킬것이다.
6. 모델 학습
history = model.fit(
x_train,
y_train,
validation_data=(x_test, y_test),
epochs=20
)
7. 학습 결과 - history 그래프
plt.figure(figsize=(16,10))
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.figure(figsize=(16,10))
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])