2.5 Jupyter Notebook  사용 가이드

2.5.1 Jupyter Notebook 

Jupyter Notebook은 데이터 과학 분야에서 인기있는 open source web application으로 데이터 클리닝과 변형, 수치 시물레이션, 통계 모델링, 머신러닝에 사용합니다. 이를 활용해서 라이브 코드, 등식, 시각화와 설명을 위한 텍스트 등을 포함한 문서를 만들고 활용할 수 있습니다.

ㅁ Jupyter Notebook 접속 하기 

ㅇ 웹 브라우저를 이용해서 공인 IP 주소:8888(포트 포워딩)에 접속합니다.
- 공인 IP 주소는 콘솔의 Server 네트워킹 메뉴에서 확인할 수 있습니다.
- 8888포트는 포트포워딩 규칙에 의해 설정된 것으로 향후 포트포워딩 메뉴를 통해 변경할 수 있습니다.

ㅇ 초기 Password는 'jupyter'를 입력하고 Log in을 클릭합니다.

ㅁ Jupyter Notebook 비밀번호 변경 

ㅇ Jupyter Notebook에 접속할 수 있는 기본 비밀번호를 변경합니다.
- KT Cloud Deep Learning Server 이용방법의 터미널 접속방법을 이용하여 터미널에 접속합니다.
- 터미널에서 'dlspasswd'를 입력하여 비밀번호를 변경합니다.
- 비밀번호 변경 작업을 완료한 후에는 자동으로 Jupyter 프로세스가 재시작됩니다.

ㅁ MNIST 예제(basic_mnist.ipynb)

ㅇ TensorFlow 홈페이지에서 제공하는 TensorFlow MNIST 기초 예제를 활용해서 Jupyter를 이용한 TensorFlow 예제를 설명합니다. 
- MNIST 데이터셋을 이용하면 소프트맥스 회귀(softmax regression), 합성곱 신경망(Convolutional Neural Network) 분류 모델을 만들어 모델이 이미지 데이터를 사용해서 얼마나 잘 예측하는지 모델 성능 평가를 해볼 수 있습니다.

ㅇ MNIST 데이터셋
 - MNIST 데이터셋은 다음과 같이 손으로 쓰여진 이미지로 구성되어 있습니다. 이것은 그 숫자가 어떤 숫자인지 알려주는 각 이미지에 관한 lable을 포함하고 있습니다. 예를 들어 아래의 이미지의 경우 label은 5, 0, 4, 1입니다.



 - MNIST 데이터셋은 55,000개의 학습 데이터(mnist.train), 10,000개의 테스트 데이터(mnist.text), 그리고 5,000개의 검증 데이터(mnist.validation)로 구성되어 있으며, 이미지와 그에 따른 label로 나뉩니다.
 - 각 이미지는 28x28 픽셀로 되어 있으며 이를 큰 배열로 볼 수 있습니다. 이 배열을 펼치면 784(28x28)개의 벡터로 저장이 되어 있습니다. 

 - 이처럼 데이터를 펼친 결과 mnist.train.images는 [55000, 784]의 형태를 가진 텐서(n차원 배열)가 됩니다. 첫번째 차원은 이미지를 가르키며, 두번째 차원은 각 이미지의 픽셀을 가르킵니다. 이 처럼 텐서의 모든 성분은 특정 이미지의 특정 픽셀을 특정하는 0과 1 사이의 픽셀 강도입니다.

ㅇ MNIST Data Donload and Extract MNIST Dataset
 - 관련 데이터를 다운받고 train 데이터와 test 데이터를 확인할 수 있습니다.




 - 예제: MNIST Dataset을 활용해서 임의로 뽑은 숫자와 동일한 숫자 이미지 찾기


 - 결과
                 

ㅁ classification 예제(basic_classification.ipynb) 

ㅇ 본 예제는 운동화나 티셔츠와 같은 옷 이미지를 분류하는 신경망 모델을 확인하는 예제입니다. 본 예제를 통해서 신경망 모델에 대해 이해할 수 있습니다.

ㅇ Fashion MNIST 데이터셋
 - Fashion MNIST 데이터셋은 10개의 category와 70,000개의 흑백 이미지로 구성되어 있습니다. 이미지 해상도는 28x28 pixcel로 구성되어 있습니다. 


ㅇ 데이터 전처리
 - Traning 데이터에서 첫 번째 이미지를 보면 pixcel 범위가 0~255사이 인것을 확인 할 수 있습니다. 이를 신경망 모델에 투입하기 전에 0~1사이로 조정합니다. 이러한 작업을 통해서 처음 25개 이미지와 그 클래스 이름을 확인해 보겠습니다.



ㅇ 모델 구성
 - 신경망 모델을 만들기 위해 layer를 구성합니다. 2차원 배열(28x28)의 이미지 포멧을 784픽셀의 1차원 배열로 변환합니다. 그리고 128개의 노드(뉴런)를 만든 후, 두 번째 층은 10개의 소프트맥스 layer를 만듭니다. 이를 수행한 다음 모델을 컴파일하고 트레이닝 합니다.

WARNING: Logging before flag parsing goes to stderr.
W0524 23:29:09.848980 140086252517120 deprecation.py:323] From /home/kbuilder/.local/lib/python3.5/site-packages/tensorflow/python/ops/math_grad.py:1250: add_dispatch_support.<locals>.wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.where in 2.0, which has the same broadcast rule as np.where

Epoch 1/5
60000/60000 [==============================] - 4s 70us/sample - loss: 0.4988 - accuracy: 0.8264
Epoch 2/5
60000/60000 [==============================] - 4s 68us/sample - loss: 0.3792 - accuracy: 0.8629
Epoch 3/5
60000/60000 [==============================] - 4s 66us/sample - loss: 0.3394 - accuracy: 0.8766
Epoch 4/5
60000/60000 [==============================] - 4s 66us/sample - loss: 0.3142 - accuracy: 0.8859
Epoch 5/5
60000/60000 [==============================] - 4s 65us/sample - loss: 0.2977 - accuracy: 0.8907

<tensorflow.python.keras.callbacks.History at 0x7f67f1b71a58>

모델을 트레이닝 하면 loss와 accuracy가 출력되는데 이 모델을 트레이닝하니 약 0.88%(88%)의 정확도를 달성했습니다.

ㅇ 정확도 평가
 - 위에서 트레이닝한 데이터를 가지고 모델의 성능을 평가합니다.

10000/10000 [==============================] - 1s 51us/sample - loss: 0.3653 - acc: 0.8671
Test accuracy: 0.8671
테스트 데이터를 통한 정확도가 트레이닝 한 결과의 정확도보다 조금 낮는데, 이러한 차이는 overfiting 때문입니다. 

ㅇ 예측 모델 만들기
 - 트레이닝한 결과를 가지고 이미지에 대한 예측 모델을 만듭니다. 본 예제에서는 테스트데이터에 있는 각 이미지의 레이블을 예측했습니다. 확인을 위해 출력한 첫 번째 예측 모델은 이 이미지가 94%로 앵클 부츠라고 확신하고 있습니다.
 - 또 다른 모델에서는 잘못된 예측을 보여줍니다. 올바르게 예측된 레이블이 파란색이고 잘못된 예측이 빨간색입니다. 
     




ㅇ 결과
 - 마지막으로 트레이닝된 모델을 사용하여 하나의 이미지에 대해서 예측해보겠습니다. 선택된 하나의 이미지(첫번째 Ankle boot)에 대해서 예측을 해보면 아래와 같이 Ankle boot로 확인되는 것을 확인할 수 있습니다. 





(참고 : www. tensorflow.org)