본문 바로가기

KAIROS 2기

[카이로스2기] 딥러닝 기초 흐름 이해하기 : 고양이 사진을 인식해보자!

아두이노를 잠시 뒤로하고, AI 로봇을 만들기 위한 딥러닝 기초 교육을 받았다.

이번 게시물에서는 어렵지만 정말 흥미로웠던 딥러닝 교육 후기를 작성해보고자 한다.😸

 

딥러닝을 이해함에 있어서 제일 중요한 것은 메인 흐름을 잡는 것이라고 생각한다.

결국 같은 흐름 내에서 어떤 모델을 만들거나 쓸 것인지, 하이퍼 파라미터를 어떻게 조정할 것인지, 이런 부분들을 사람이 바꾸게 되는 것이니, 이 흐름만 이해해도 딥러닝에 부딪쳐보기에는 충분한 것 같다!

 

지금부터 설명할 내용은 크게 아래와 같다.

▶데이터 불러오기 > 살펴보기 > 정규화 > 모델 생성 > 모델 컴파일 > 학습 > 평가 > 예측

(▶ load data > data inspection > normalization/scaling > model create > compile > fit > evaluate > predict)

하나하나 가보자!


1. load data

먼저 당연히 딥러닝을 하기 위한 데이터가 필요하다.교육단계에서는 제일 친숙한 keras의 MNIST 데이터나, sklearn의 cancer 데이터 등을 사용했다.

load_data()를 해오면, 활용하기 쉬운 numpy array 형태로 데이터를 받아올 수 있다.

keras 데이터의 경우 X_train(훈련용 input), y_train(훈련용 정답)가 짝으로, 테스트용 x,y데이터가 짝으로 받아온다.

# keras 데이터
from tensorflow.keras import datasets
(X_train, y_train), (X_test, y_test) = datasets.cifar10.load_data()

# sklearn 데이터
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
X = cancer.data
y = cancer.target

 

2. data inspection

데이터를 받아왔으면 가장 먼저 할 것은? 당연히 데이터를 뜯어보는 것이다!🥕

총 몇 개의 데이터인지, 몇 차원인지, 이미지라면 n*n 짜리 데이터인지 확인을 해야한다. shape, ndim을 통해 크기를 보고, 처음 몇개의 데이터를 직접 print해보는 것도 추천한다.

만약 데이터가 학습에 적합하지 않은 형태로 되어있으면 전처리도 진행한다.

(ex. 정답데이터가 2차원으로 되어있다면 reshape(-1)로 1차원으로 변경, one-hot-encoding 적용 등)

 

3. normalization

데이터를 확인했다면, 학습을 위해 input 데이터의 모든 특성들을 정규화해주어야한다.

정규화를 하지 않으면 여러가지 특성들의 중요성이 잘못 인식될 수 있기 때문에, 데이터를 잘 보고 필요한 항목들은 정규화를 잊지 않도록 하자! 👀

이미지의 경우에는 0~255 사이 값을 가지고 있기 때문에, 0~1 사이의 값으로 보기 위해 /255.0을 해주었다.

X_train, X_test = X_train / 255.0, X_test / 255.0

 

4. model create(layer, activation)

이제 준비된 데이터를 학습시킬 모델을 만들어보자! ☺

기본적인 모델로 input을 받아 데이터를 한줄로 만들어줄 Flatten 레이어, 은닉층 2개 레이어, 그리고 output 레이어로 구성하였다. (32, 32) 크기인 이미지를 받아 한줄로 세워서, 2개의 은닉층을 통과하며 최적의 파라미터를 찾아내고, output layer에서 최종 10개 항목에 대한 가능성을 보여준다.

model = Sequential([
    Flatten(input_shape=(32, 32, 3)),
    Dense(64, activation='relu'),
    Dense(32, activation='relu'),
    Dense(10, activation='softmax')
])

 

각 layer에는 activation 함수를 지정해주어야하는데, 어떤 activation 함수를 쓰는지에 따라 학습 결과가 천차만별이 될 수 있으므로 상황에 맞는 함수로 잘 넣어주어야 한다.

위 모델에서는 총 10개의 결과 중 확률을 보여줄 것이기 때문에 마지막 output layer에 softmax 함수를 사용하였다.

이 activation은 optimizer, epochs 등 사람이 지정하는 "하이퍼파라미터" 중 하나이다! 🔧 
- Step Function : 0.5를 기준으로 0 또는 1로 결과를 보여주도록 하는 가장 기본적인 함수. 선형에서만 사용가능
- Sigmoid : 0~1 사이의 값으로 결과를 보여주도록 하는 activation 함수로, binary classfication에 자주 사용
- Relu : sigmoid 함수에서 0 근처와 1 근처 항목들이 과소평가되는 것을 보완, 0 이상 값들은 원래 값을 유지함
이 외에도 Softmax(다중 분류), Leaky relu (vanishing gradient 보완) 등 activation 함수들이 있다.

 

5. compile(opitimizer, loss, metrics)

모델을 만들었다면, 컴파일해주어야 한다. 이 과정에서 optimizer, loss, metrics를 넣어준다. 

해당 모델에서는 optimizer로 adam을, loss function으로는 sparse_categorical_crossentropy를 주었다. (다중 분류)

model.summary 함수를 통해 만들어진 모델의 기본적인 모양을 확인할 수 있다. 레이어를 두개만 넣었는데도, 전체 파라미터 개수는 8만개에 육박한다! 😨

 

6. fit(epoch)

모델이 다 만들어졌다면, 데이터로 학습을 시킬 차례이다. fit() 함수를 통해 모델에 x_train(학습용 문제), y_train(학습용 정답)을 제공한다. epoch는 학습의 횟수를 의미하며, 총 몇번 학습할지를 지정한다.

한 epoch는 batch의 기본값인 1/32로 되어있기 때문에, 아래 이미지에서 한 epoch 당 데이터가 1875 (= 총 60,000개 데이터 / 32) 로 학습하고 있는 것을 볼 수 있다.

잘 학습되고 있다면, 각 학습 횟수마다 loss는 하락하고, accuracy는 증가하는 모습을 띈다.

 

7. evaluate(loss, accuracy)

학습이 잘 되었는지 모델을 평가하는 데에는 evaluate() 함수를 사용한다.

물론 이 과정에서 학습때 사용한 데이터를 그대로 사용하면 평가가 정확히 이루어지지 않기 때문에, 미리 나누어둔 Validation Data, 또는 없을 경우 테스트 데이터를 사용한다.

 

8. predict

마지막으로, 그렇다면 우리의 모델이 얼마나 실제 데이터를 잘 예측하는지 확인해보자! 😎

predict 함수를 통해 test data에 대한 모델의 예측 값을 확인할 수 있다. predict 함수는 각 정답에 대한 확률을 반환한다.

아래 이미지의 경우 binary classification에서 1일 확률이 0.95로 훨씬 높은 결과를 보여주고 있다.

 

그렇다면 10개 값으로 분류를 하는 cifar10 데이터에 대해 학습했던 내 모델의 결과는??

 

그러면 이렇게 짜잔! 고양이를 배(ship)라고 주장하는 모델을 만날 수 있다 ^^

모델아,, 너도 금쪽이구나.. 물론 모든 모델이 완전하지 않기에 맞추지 못하는 경우도 많았다 ㅎㅎ

하지만 이것은 내가 이미지 색상을 BGR2RGB를 해주지 않아서 그런것이므로 사실 내 잘못이었다^^ (cv2는 왜 BGR을 쓰는가..) 그래서 다시 RGB 값으로 모델에 적용해주면, 짜잔! cat으로 잘 인식하는 것을 볼 수 있다. 😍


 

딥러닝 기초 학습 후기 👀

- 정말 기초부터 시작했지만, 짧은 과정을 마치고 나니 어느새 모델에 대한 전반적인 이해가 완성되어 있어서 너무 뿌듯했다. 벌써 CNN도 가볍게 만나보고 나니 심화 과정에서는 어떤 내용을 또 배울수 있을지 정말 기대된다.

- 강사님께서 너무 설명을 잘해주셔서 시간가는줄 모르고 재밌게 배웠다. 너무 재밌어서 신기하기까지 했다! 확실히 마지막에 각자 모델을 만들고 성능을 비교하고, 원하는 이미지를 넣어보고 하니 더 의욕적이었던 것 같다.

- Numpy, Pandas에 대한 이해도를 더 높이고 싶다! 확실히 지금은 예쁘게 주어진 데이터셋을 다루고 있어서 전처리의 중요성이 크지 않았지만, 실제 엉망진창인 데이터도 다뤄보고 싶다 🤔

- 경사하강법부터는 미분 지식 필수인데, 수학적 지식을 키워놓아야겠다 😇

 

카이로스 2기에서 아두이노를 어떻게 배우는지 궁금하신 분들은 여기로!

https://bagjo2884.tistory.com/16

 

[카이로스2기] 비전공자가 처음 만나는 아두이노! 기초부터 OLED까지

카이로스 2기를 시작하며 제일 기대했던 부분은, 당연히 하드웨어를 처음 만지는 수업이었다!비전공에 소프트웨어만 다뤄본 나로서는 회로에 대해서는 빵판이라는 단어로 처음 들었을 정도로

bagjo2884.tistory.com

 

 

카이로스 2기에서 미니 프로젝트를 어떻게 하는지 궁금하신 분들은 여기로!

https://bagjo2884.tistory.com/17

 

[카이로스2기] 아두이노로 쉽게 하는 미니 프로젝트!(RC카, 로봇암, 밸런싱로봇)

카이로스2기 아두이노 수업에서는 과정 중 다양한 미니 프로젝트 실습을 진행하고 있다.☺미니 프로젝트는 제공받은 기본 아두이노 키트를 기반으로 해서 배운 것들을 적용해볼 수 있고, 특정

bagjo2884.tistory.com

 

다음 게시글은 무려 3D 모델링에 도전합니다👊 Fusion360 후기로 만나요!