상세 컨텐츠

본문 제목

딥러닝으로 손글씨 실습

공부/AI

by 근성 2021. 7. 20. 18:48

본문

이번년도에 스마트해상물류 공모전을 참가하면서 스파르타코딩클럽 수강권 1장을 받게되어, 평소에 궁금하던 머신러닝을 수강하게 되었습니다.

 

대학생분들은 한이음 혹은 스마트해상물류 프로젝트를 진행하는거 추천드려요

(수많은 기프티콘, 프로젝트기회, 멘토들의 조언, 수강권 등 많은 혜택이 있습니다.)

 

머신러닝 3주차 과제를 위해서 티스토리에 글을 쓰게 되었습니다 !

 

3주차 과제는 혼자서 딥러닝으로 손글씨학습을 구현하는 문제입니다.

 

먼저 과제를 하기전에 저 처럼 머신러닝에 처음 접하신 분들도 있으실텐데요

TensorFlow라는 것은 들어봤어도 Colab은 이번에 처음 들어봤는데요

구글에서 Colab을 통해 python을 작성할 수 있습니다.

기존 데스크탑이나 노트북을 사용하면서 python을 이용하는데에 라이브러리파일하고 깔기 정말 귀찮았는데,

그 단점을 완벽하게 보완해준 tool입니다 !

 

딥러닝의 등장배경은 자연계에서는 일차함수(머신러닝)으로 해결할 수 없는 문제가 많아 선형회귀에 비선형을 섞어서 층을만들어서 해결했다고 딥러닝이라고 합니다.(and나 or gate는 머신러닝으로 해결, xor은 머신러닝으로 x)

 

딥러닝은 다른 용어로

Deep neural networks

Multilayer Perceptron(MLP) 라고도 한다네요

 

앞에서 설명했다시피, 층을 만들어서 해결을 하는 과정이 있어야하는데 층은 총 3가지로 나뉩니다.

출처: https://www.kdnuggets.com/2016/10/deep-learning-key-terms-explained.html

  • Input layer(입력층): 네트워크의 입력 부분입니다. 우리가 학습시키고 싶은 x 값입니다.
  • Output layer(출력층): 네트워크의 출력 부분입니다. 우리가 예측한 값, 즉 y 값입니다.
  • Hidden layers(은닉층): 입력층과 출력층을 제외한 중간층입니다.

딥러닝의 주요개념과 주요스킬들은 나중에 설명하고, 과제를 먼저 설명하겠습니다.

 

import os
os.environ['KAGGLE_USERNAME']= 'junhyeongrhee'
os.environ['KAGGLE_KEY'] = '11ddf21c53c4abd5bdadfd7d56a7891d'

kaggle에서 데이터셋을 받아야하므로, 이렇게 입력하고, 실행을 합니다.

!kaggle datasets download -d oddrationale/mnist-in-csv
!unzip mnist-in-csv.zip

이어서 손글씨에 대한 데이터셋 알집을 다운로드받고, 알집해제를 합니다.

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
from sklearn.preprocessing import OneHotEncoder

이렇게 라이브러리를 실행시켜주고

train_df = pd.read_csv('mnist_train.csv')

train_df.head()

test_df = pd.read_csv('mnist_test.csv')

test_df.head()

학습 csv파일과 test파일을 맛보기로 봅시다 !

위 : 학습 csv파일 아래: test.csv파일

plt.figure(figsize=(16, 10))
sns.countplot(train_df['label'])
plt.show()

그래프로 또한 볼 수 있습니다.

그래프

 

input_layer와 output_layer을 설정해줍시다 !

train_df = train_df.astype(np.float32)

x_train = train_df.drop(columns=['label'], axis=1).values#label만빼주고

y_train = train_df[['label']].values#label만 넣을것



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)

맛보기로 이미지 하나만 출력시키면

index = 1

plt.title(str(y_train[index]))

plt.imshow(x_train[index].reshape((28, 28)), cmap='gray')

plt.show()

one hot encoder전 맛보기

이렇게 뜨지만, onehot encoder을 시행하고나면,

encoder = OneHotEncoder()
y_train = encoder.fit_transform(y_train).toarray()
y_test = encoder.fit_transform(y_test).toarray()

print(y_train.shape)

one hot encoder후 맛보기

조금 더 자세하게 데이터를 볼 수 있습니다.(위에 숫자)

 

x_train = x_train / 255.
x_test = x_test / 255.#한번만쓰기 계속쓰면 계속 255로 나눠짐

자세하게 학습을 하기위해 255로 나눠줍니다, 저 코드를 계속 시행하면은 계속 255로 나눠지니 주의해야합니다.

 

input = Input(shape=(784,))
hidden = Dense(1024, activation='relu')(input)
hidden = Dense(512, activation='relu')(hidden)
hidden = Dense(256, activation='relu')(hidden)
output = Dense(10, activation='softmax')(hidden)

model = Model(inputs=input, outputs=output)

model.compile(loss='categorical_crossentropy', optimizer=Adam(learning_rate=0.001), metrics=['acc'])

model.summary()

relu라는 activation을 사용할건데 

relu는 0이하인 값을 x로 입력받으면 y가 0으로 출력되고, 0보다 큰수를 입력받으면 y=x인 꼴로 출력 시키는 함수입니다.

 

숫자는 0~9로 이뤄졌기 때문에, output에 10이 들어간걸 볼 수 있습니다.

 

history = model.fit(
    x_train,
    y_train,
    validation_data=(x_test, y_test), # 검증 데이터를 넣어주면 한 epoch이 끝날때마다 자동으로 검증
    epochs=20 # epochs 복수형으로 쓰기!
)

이거를 실행시키면

실행

정확성(acc)이 거의 1에 가까워지는것을 확인할 수 있습니다.

 

튜터님께서 정확도랑 커지고 loss가 줄어드는것을 볼 때마다 기분이 좋다는데, 

저도 이번 강의를 통해서 기분이 좋아지는것을 느꼈습니다.

 

4주차 강의도 딥러닝으로 돌아오겠습니다.

'공부 > AI' 카테고리의 다른 글

CUDA가 아닌 MPS로 MNIST학습  (0) 2022.06.23
CNN으로 풍경 사진을 분류  (0) 2021.08.05
Binary Logical Regression 구현  (0) 2021.07.20
Linear Regression 구현  (0) 2021.07.15

관련글 더보기

댓글 영역