뮤트 개발일지

AIFFEL 아이펠 7일차 본문

AIFFEL

AIFFEL 아이펠 7일차

박뮤트 2022. 1. 5. 05:30

딥러딩: 데이터 준비 -> 딥러닝 네트워크 설계 -> 학습 -> 테스트(평가)

 

데이터 준비

MNIST 숫자 손글씨 Datase 불러들이기

텐서플로우의 표준 API인 tf.keras의 Sequential API를 이용해 숫자 손글씨 인식기를 만들 것

http://yann.lecun.com/exdb/mnist/

 

MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges

 

yann.lecun.com

MNIST 데이터셋의 X항목: 이미지 데이터를 담은 행렬matrix

Y항목: X항목에 들어있는 이미지에 대응하는 실제 숫자 값이 담겨져 있음(답)

 

*Matplotlib: 파이썬에서 제공하는 시각화 패키지. 차트, 플롯 등 다양한 형태로 데이터를 시각화할 수 있다. 

 

학습용데이터와 시험용 데이터

학습용 데이터로 학습을 한 후 학습이 끝나고 시험용 데이터로 테스를 진행한다.

MNIST 데이터셋은 250여 명의 데이터를 학습용으로, 다른 250여 명의 데이터를 시험용으로 사용한다.

print(x_train.shape)

===> 28*28 크기의 사진이 60000장 존재한다는 뜻

 

Train set: 모델을 학습하기 위한 데이터 셋

Validation set: 학습이 이미 완료된 모델을 검증하기 위한 데이터셋, 학습에 참여하지는 않지만 '관여'한다.

Test set: 학습과 검증이 완료된 모델의 성능을 평가하기 위한 데이터셋

일반적으로 Train : Validation : Test = 6 : 2 : 2로 이용한다.

 

* epoch: 인공 신경망에서 전체 데이터 셋에 대해 forward pass/backward pass 과정을 거진 것. 즉, 전체 데이터 셋에 대해 한 번 학습을 완료한 상태. epoch=40은 전체 데이터를 40번 사용해서 학습을 거치는 것

* overfitting과적합: 학습 데이터에 대해 과하게 학습하여 실제 데이터에 대한 오차가 증가하는 현상

예) 노란색 고양이를 보며 고양이 특성을 학습한 사람이 검은색이나 흰색 고양이를 보고는 고양이라고 인식하지 못하는 현상

* cross validation교차검증: tran set을 train set + validatio set으로 분리한 뒤, validation set을 사용해 검증하는 방식

 - 장점: 모든 데이터셋을 훈련에 활용하여 정확도를 향상시킬 수 있고, 데이터 부족으로 인한 underfitting을 방지할 수 있다. 또한 모든 데이터셋을 평가에 활용하여 평가에 사용되는 데이터 편중을 막을 수 있다. 평가 결과에 따라 좀 더 일반화된 모델을 만들 수 있다.

 - 단점: literation 횟수가 많기 때문에, 모델 훈련/평가 시간이 오래 걸린다.

 

인공지능 모델을 훈련시키고 사용할 때, 일반적으로 입력은 0~1 사이의 값으로 정규화 시켜준다. MNIST 데이터는 각 픽셀의 값이 0~255 사이에 있으므로 데이터들을 255.0으로 나눠준다.

 

딥러닝 네트워크 설계하기

Sequential Model

- Conv2D: 첫 번째 인자 = 사용하는 이미지 특징의 수, 위의 사진에서는 16과 32사용. 먼저 16개의 이미지 특징을, 그 뒤에 32개 이미지 특징을 고려하겠다는 의미. 복잡한 영상일 수록 특징 숫자를 늘려줄 수 있다.

- Dense: 첫 번째 인자 = 분류기에 사용되는 뉴런의 숫자. 값이 클수록 복잡한 분류기를 만들 수 있음. 결과적으로 분류해 내야 하는 클래스 수로 지정하면 된다. 숫자 인식기에는 10, 알파벳 인식기에서는 52가 된다.

 

model.summary(): 만든 딥러닝 네트워크 모델을 확인하는 메서드

 

딥러닝 네트워크 학습시키기

print("Before Reshape - x_train_norm shape: {}".format(x_train_norm.shape))
print("Before Reshape - x_test_norm shape: {}".format(x_test_norm.shape))

x_train_reshaped=x_train_norm.reshape( -1, 28, 28, 1)  # 데이터갯수에 -1을 쓰면 reshape시 자동계산됩니다.
x_test_reshaped=x_test_norm.reshape( -1, 28, 28, 1)

print("After Reshape - x_train_reshaped shape: {}".format(x_train_reshaped.shape))
print("After Reshape - x_test_reshaped shape: {}".format(x_test_reshaped.shape))
model.compile(optimizer='adam',
             loss='sparse_categorical_crossentropy',
             metrics=['accuracy'])

model.fit(x_train_reshaped, y_train, epochs=10)

테스트 데이터로 성능 확인

model.prdict(): model이 입력값을 보고 실제로 추론한 확률분포를 출력

model의 추론결과를 시각화해서 보면 향후 model 성능 개선에 도움이 된다.

 

더 좋은 네트워크 만들기

딥러닝 네트워크의 구조 자체를 바꾸지 않으면서 해볼 수 있는것

Conv2D 레이어에서 입력 이미지의 특징 수를 늘리거나 줄여보는 것, Dense 레이어에서 뉴런수를 바꾸는 것, epoch 값 변경하기


https://github.com/pjk7565/rock_scissor_paper

 

GitHub - pjk7565/rock_scissor_paper

Contribute to pjk7565/rock_scissor_paper development by creating an account on GitHub.

github.com

가위바위보 분류기를 만들어보았는데 이해가 안 된 상태로 하려니 막막했다ㅜ

그래도 조원분들이 감사하게도 도와주셔서 어찌어찌 마무리..! 정확도는 30%밖에 안 나왔지만 왜 그런지도 알았고, 내가 할 수 있는 최선은 다한 것 같아 제출하기로 했다. (별 수집가가 되고 싶었는데ㅠ)

점점 어려워지는데 밀리지 않도록 열심히 해야겠다. (지금 시간 새벽 5시 반..)

'AIFFEL' 카테고리의 다른 글

AIFFEL 아이펠 8일차  (0) 2022.01.05
AIFFEL 아이펠 다양한 데이터 전처리 기법  (0) 2022.01.05
AIFFEL 아이펠 6일차  (0) 2022.01.03
AIFFEL 아이펠 파이썬으로 코딩 시작하기  (0) 2022.01.03
AIFFEL 아이펠 5일차  (0) 2021.12.31