무냐의 개발일지
[3/6] 인공지능과 가위바위보 하기 (딥러닝) 본문
* 딥러닝 기술 : "데이터 준비 → 딥러닝 네트워크 설계 → 학습 → 테스트(평가)"
tf.keras의 Sequential API를 이용하여 숫자 손글씨 인식기를 만들 거예요. 구글(Google)에서 오픈소스로 제공하는 텐서플로우는 가장 널리 사용되고 있는 머신러닝 라이브러리 중 하나입니다. 앞으로 딥러닝 구현 실습은 Tensorflow 버전 2.6.0에서 진행될 예정입니다.
<Train set>
모델을 학습하기 위한 dataset이다. 한 가지 계속 명심해야할 중요한 사실은
"모델을 학습하는데에는 오직 유일하게 Train dataset만 이용한다"
보통 train set을 이용해 각기 다른 모델을 서로 다른 epoch로 학습을 시킨다.
여기서 각기 다른 모델이란 hidden layer 혹은 hyper parameter에 약간씩 변화를 줌을 뜻한다.
<Validation set & Test set>
validation set은 학습이 이미 완료된 모델을 검증하기위한 dataset이다.
test set은 학습과 검증이 완료된 모델의 성능을 평가하기위한 dataset이다.
보통 Train : Test 데이터를 8 : 2로 나누는데 여기서 Train 데이터 중 일부를 validation set으로 이용해
결국 Train : Validation : Test 을 일반적으로 6 : 2 : 2로 이용한다.
validation set과 test set의 공통점은 이 데이터를 통해 모델을 update 즉, 학습을 시키지 않는다는 것이다.
이렇게 validation set과 test set은 둘다 이미 학습을 완료한 모델에 대해 평가하고 학습을 시키지 않는데
"그렇다면 둘의 차이는 과연 무엇일까?"
결론부터 말하자면 둘의 차이는
Validation set은 모델을 update, 즉 학습을 시키진 않지만 학습에 '관여'는 한다.
Test set은 학습에 전혀 관여하지 않고 오직 '최종 성능'을 평가하기 위해 쓰인다.
* 교차검증(cross-validation) : 머신러닝에서 모델의 성능을 평가하는 방법 중 하나입니다. 데이터를 여러 개의 폴드로 나누고, 한 폴드를 validation 세트로 사용하고 나머지 폴드를 훈련 세트로 사용하여 모델을 학습하고 평가하는 방법입니다. 교차검증을 통해 모델의 일반화 성능을 평가할 수 있습니다.
교차검증의 종류는 여러 가지가 있습니다. 가장 일반적인 방법은 K-fold 교차검증입니다. K-fold 교차검증은 데이터를 K개의 폴드로 나누고, 각 폴드를 한 번씩 테스트 세트로 사용합니다. K-fold 교차검증을 통해 모델의 성능을 K번 평가할 수 있습니다.
교차검증은 모델의 성능을 평가하는 데 매우 효과적인 방법입니다. 그러나 교차검증은 시간이 오래 걸릴 수 있습니다. 데이터가 많을 경우 교차검증을 수행하는 시간이 매우 오래 걸릴 수 있습니다.
교차검증은 모델의 성능을 평가하는 데 매우 효과적인 방법이지만, 시간이 오래 걸린다는 단점이 있습니다. 데이터가 많을 경우 교차검증을 수행하는 시간이 매우 오래 걸릴 수 있습니다.
| 딥러닝 네트워크 설계
텐서플로우 케라스(tf.keras)에서 Sequential API라는 방법을 사용할 겁니다. Sequential API는 개발의 자유도는 많이 떨어지지만, 매우 간단하게 딥러닝 모델을 만들어낼 수 있는 방법입니다. 여러분들은 이 방법을 통해 미리 정의된 딥러닝 레이어(layer)를 손쉽게 추가할 수 있습니다.
케라스에서 모델을 만드는 방법은 Sequential API 외에도 Functional API를 이용하는 방법, 밑바닥부터 직접 코딩하는 방법 등 여러 방법이 있습니다. 공부하면서 하나씩 배워나갈 테니 걱정 마세요 :)
- Conv2D 레이어의 첫 번째 인자는 사용하는 이미지 특징의 수입니다. 여기서는 16과 32를 사용했습니다. 가장 먼저 16개의 이미지 특징을, 그 뒤에 32개의 이미지 특징씩을 고려하겠다는 뜻입니다. 우리의 숫자 이미지는 사실 매우 단순한 형태의 이미지입니다. 만약 강아지 얼굴 사진이 입력 이미지라면 훨씬 디테일하고 복잡한 영상일 것입니다. 그럴 경우에는 이 특징 숫자를 늘려주는 것을 고려해 볼 수 있습니다. 앞의 16은 출력필터 (커널의 수, 16개의 다른 특징을 감지할 수 있는 필터를 사용한다는 뜻), (3,3)은 각 컨볼루션 필터의 크기 (3x3 필터를 쓴다는 뜻)
- Dense 레이어의 첫 번째 인자는 분류기에 사용되는 뉴런의 숫자 입니다. 이 값이 클수록 보다 복잡한 분류기를 만들 수 있습니다. 10개의 숫자가 아닌 알파벳을 구분하고 싶다면, 대문자 26개, 소문자 26개로 총 52개의 클래스를 분류해 내야 합니다. 그래서 32보다 큰 64, 128 등을 고려해 볼 수 있을 것입니다.
- 마지막 Dense 레이어의 뉴런 숫자는 결과적으로 분류해 내야 하는 클래스 수로 지정하면 됩니다. 숫자 인식기에서는 10, 알파벳 인식기에서는 52가 되겠지요.
- input_shape 안의 숫자는 입력 이미지의 형태를 나타낸다. 앞의 28, 28은 데이터의 사이즈를 말한다. 마지막 숫자는 차원 수(채널수)를 의미한다. 컬러이미지라고 하면, 3개 R,G,B 를 이용하므로 3개 색상 채널을 이용하는 것
| 딥러닝 네트워크 학습시키기
우리가 만든 네트워크의 입력은 (데이터갯수, 이미지 크기 x, 이미지 크기 y, 채널수) 와 같은 형태를 가집니다. 이전 스텝에서 첫 번째 레이어에 input_shape=(28,28,1)로 지정했던 것을 기억하시나요?
그런데 print(x_train.shape) 을 해보면, (60000, 28, 28) 로 채널수에 대한 정보가 없습니다. 따라서 (60000, 28, 28, 1) 로 만들어 주어야 합니다 (여기서 채널수 1은 흑백 이미지를 의미합니다. 컬러 이미지라면 R, G, B 세 가지 값이 있기 때문에 3이겠죠?)
# 디렉토리 만들기
$ mkdir -p ~/aiffel/rock_scissor_paper/scissor
$ mkdir -p ~/aiffel/rock_scissor_paper/rock
$ mkdir -p ~/aiffel/rock_scissor_paper/paper
$ ls -l ~/aiffel/rock_scissor_paper
# 원하는 디렉토리로 이동 =3
$ cd ~/aiffel/rock_scissor_paper/rock
# 압축 해제 명령어 : unzip <파일명>.zip
$ unzip rock.zip
# 가위, 보에 대해서도 똑같이 실행!
$ cd ~/aiffel/rock_scissor_paper/scissor
$ unzip scissor.zip
$ cd ~/aiffel/rock_scissor_paper/paper
$ unzip paper.zip
* MaxPool2D = MaxPooling2D layers (stride를 설정해서 피처맵 차원을 축소시킨다)
: used to down-sample the feature maps obtained from the previous convolutional layers.
: The parameters (2, 2) indicate the size of the pooling window, and (2, 2) indicates the stride (the amount by which the window shifts after each pooling operation).
: helps reduce the spatial dimensions of the feature maps while preserving the most important information.
'Data Scientist Bootcamp' 카테고리의 다른 글
[3/8] 딥러닝 심화 (학습시킨 모델 저장, 관리/ 모델학습기술 optimizer, activation function 등) (1) | 2024.03.08 |
---|---|
[3/7] 딥러닝 기초 (퍼셉트론, 인공신경망) (1) | 2024.03.07 |
0304 _ Financial Time series 모델링 (0) | 2024.03.04 |
[2/27] 시계열 데이터 분석 (Time Series) (1) | 2024.02.27 |
[2/19] 전설의 포켓몬 예측하기!! (완전 신나게 한 프로젝트 ㅎㅎ) (0) | 2024.02.19 |