ubunt GPU 설정 후 Keras 버전 테스트 MNIST

   ubunt GPU RTX3080 설정 후  Keras가 실행 되는지 확인 해봐야 한다.   RTX3080을  설치가 다 끝났는데,  케라스가 설치되어 있지 않아,  계속 재 설치 하였기 때문이다.  

그렇다고 무언가 대단한 것을 테스트 할 필요는 없다.   되는지 만 확인 해야 하기 때문이다.  

아래의 소스코드는 "케라스 창시자에게 배우는 딥러닝" 책에서 인용한 것이다. 

인공지능 처음 시작할때,  파이썬 라이브러리를 사용하여 손글씨를 분류하는 것은 거의  "Hello Python" 급이다.   어떠한 알고리즘으로 되어 있는지는,  나중에 차근히 하면서 볼 수 있다.


1) MNIST의 내용은 아래와 같다. 

 

MNIST

2)  소스코드는 아래와 같이 실행 한다. 


# 버전 확인이 매우 중요하다. 

>>>import tensorflow as tf

>>>tf.__version__

'2.4.0'

>>>import keras

>>>keras.__version__

'2.4.3'


 2.1)  MNIST 데이터는 이미 케라스에 포함되어 있다. 

>>> from keras.datasets import mnist

>>> triain_images, train_labels), (test_images, test_labels) = mnist.load_data()

이미지는 train_images, test images 로 되어있고 train_labels, test_labels는 분류(0,1,2.....9) 까지 되어 있는 라벨 데이터 셋이다. 


 2.2) 신경망의 구조 구현

   - 층(Layer) : 신경망의 핵심구성요소로서 일종의 필터이다. 

   - Dense : 조밀하게 연결된 신경망의 층이다. 

>>> from keras import models

>>> from keras import layers


>>> network = models.Sequential()

>>> network.add(layers.Dense(512, activation ='relu',  input_shape = (28*28,)))

>>> network.add(layers.Dense(10, activation ='softmax'))

>>> network.summary()

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 512)               401920    
_________________________________________________________________
dense_1 (Dense)              (None, 10)                5130      
=================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
_________________________________________________________________


 2.3) 손실함수와 옵티마이저 

     - 손실함수 (loss function) :  훈련 데이터에서 신경망의 성능을 측정하는 방법으로 네트워크가 옳은 방향으로 학습 될 수 있도록 한다.

    - 옵티마이저(optimizer) : 입력된 데이터와 손실 함수를 기반으로 네트워크를 업데이트 하는 것이다. 

   - 훈련과 테스트 과정을 모티터링 할 지표 


>>> # 데이터 컴파일 단계

>>> network.compile(optimizer='rmsprop',

                loss = 'categorical_crossentropy',

                metrics =['accuracy'])


 2.4) 이미지 데이터를 준비 

  이미지 데이터를 준비 할때는 0~1까지의 데이터로 scale 해야 하므로 255는 나눈다. 


>>> # 이미지 데이터 준비

>>> train_images = train_images.reshape((60000, 28 * 28))

>>> train_images = train_images.astype('float32') /255 


>>> test_images = test_images.reshape((10000, 28 * 28))

>>> test_images = test_images.astype('float32') /255 


2.5 ) 레이블을 범주형으로 인코딩

    데이터 학습에 있어서,  범주형으로 변환 하지 않으면 분류 할 수 없다. 

# 레이블을 범주형으로 해야 한다. 

>>> from keras.utils import to_categorical


>>> train_labels = to_categorical(train_labels)

>>> test_labels = to_categorical(test_labels)


2.6) 네트워크 학습 

    데이터가 준비 되어 있어,  훈련 데이터의 모델을 학습 시킨다. 

>>> # 모델을 학습한다. 

>>> network.fit(train_images, train_labels, epochs=5, batch_size = 128)

Epoch 1/5
469/469 [==============================] - 1s 2ms/step - loss: 0.4287 - accuracy: 0.8735
Epoch 2/5
469/469 [==============================] - 1s 2ms/step - loss: 0.1145 - accuracy: 0.9667
Epoch 3/5
469/469 [==============================] - 1s 2ms/step - loss: 0.0668 - accuracy: 0.9804
Epoch 4/5
469/469 [==============================] - 1s 2ms/step - loss: 0.0453 - accuracy: 0.9862
Epoch 5/5
469/469 [==============================] - 1s 2ms/step - loss: 0.0353 - accuracy: 0.9896
Out[10]:
<tensorflow.python.keras.callbacks.History at 0x7f93c54da310>

네트워크 훈련 하는 동안 2개의 정보가 출력된다.  첫번째는 손실값,  두번째는 정확도 이다. 


2.7)  모델평가 

>>> test_loss, test_acc = network.evaluate(test_images, test_labels)

313/313 [==============================] - 0s 428us/step - loss: 0.0723 - accuracy: 0.9780

테스트 세트의 정확도는 97.8% 나왔다.  훈련 세트 보다 정확도가 낮다. 

훈련 세트 보다 정확도나 낮은 상황은 과대적합(overfitting) 때문이다.  

어찌보면,  이 소스 코드 하나만으로, 딥러닝에 대한 설명이 끝난것 같다. 

  

댓글 없음:

댓글 쓰기

[주식 클로드 자동매매 프로젝트] 제2편. 데이터 인프라 구축 — 모델보다 데이터가 먼저다

 머신러닝 모델을 이야기하기 전에, 그 모델이 먹는 데이터가 어디서 어떻게 왔는지부터 정직하게 밝혀야 한다. 이 프로젝트에서 가장 많은 시간이 들어간 부분은 화려한 모델 튜닝이 아니라, "내가 정말 그 데이터를 갖고 있는가"를 확인하...