본문 바로가기

딥러닝

4강 8-2 경사하강법으로 필기체 데이터를 학습시켜보자 (텐써플로우)

 

텐써플로우를 이용하여 경사하강법으로 필기체 데이터를 학습시켜보자

1. SGD (확률적 경사하강법)

#2. Adam 으로 필기체 데이터 학습시키는 텐써 플로우 코드 


# 1. 필요한 패키지 가져오는 코드 

import tensorflow as tf   # 텐써 플로우 2.0 
from tensorflow.keras.datasets.mnist import load_data  # 텐써플로우에 내장되어있는 
                                                       # mnist 데이터를 가져온다.
from tensorflow.keras.models import Sequential  # 모델을 구성하기 위한 모듈
from tensorflow.keras.layers import Dense,Flatten  # 완전 연결계층을 구성하기 위한 모듈
from tensorflow.keras.utils import to_categorical   # one encoding 하는 모듈

tf.random.set_seed(777)

#2. 입력데이터 불러오고 정규화 진행
(x_train, y_train), (x_test, y_test) = load_data(path='mnist.npz')  # mnist 데이터 로드
    
# 정규화 진행 
# 3차원 ---> 2차원으로 차원축소하고서 정규화 진행  ( 한 픽셀이 0~255 로 되어있는데)
# 0 ~ 1 사이로 변경 
x_train = (x_train.reshape((60000, 28 * 28))) / 255 
x_test = (x_test.reshape((10000, 28 * 28))) / 255

# 3. 정답 데이터를 준비한다. 

# 하나의 숫자를 one hot encoding 한다. (예:  4 ---> 0 0 0 0 1 0 0 0 0 0 ) 
y_train = to_categorical(y_train)  # 훈련 데이터의 라벨(정답)을 원핫 인코딩
y_test = to_categorical(y_test)    # 테스트 데이터의 라벨(정답)을 원핫 인코딩 

# 4. 모델을 구성합니다. 2층 신경망으로 구성
model = Sequential()
model.add(Flatten(input_shape = (784,)))   # 0층
model.add(Dense(100, activation = 'relu'))  # 1층
model.add(Dense(10, activation = 'softmax'))   #2층 

# 5. 모델을 설정합니다. ( 경사하강법, 오차함수를 정의해줍니다. )
model.compile(optimizer='SGD', 
              loss = 'categorical_crossentropy', 
              metrics=['acc'])  # 학습과정에서 정확도를 보려고 

#6. 모델을 훈련 시킵니다.
model.fit( x_train, y_train, epochs=30, batch_size=100)

# 7.모델을 평가합니다. (오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test)

[0.17040188610553741, 0.9503999948501587]

SGD 속도 (49초) 정확도 0.95 나왔다. 

 

2. Adam

#2. Adam 으로 필기체 데이터 학습시키는 텐써 플로우 코드 


# 1. 필요한 패키지 가져오는 코드 

import tensorflow as tf   # 텐써 플로우 2.0 
from tensorflow.keras.datasets.mnist import load_data  # 텐써플로우에 내장되어있는 
                                                                         # mnist 데이터를 가져온다.
from tensorflow.keras.models import Sequential  # 모델을 구성하기 위한 모듈
from tensorflow.keras.layers import Dense,Flatten  # 완전 연결계층을 구성하기 위한 모듈
from tensorflow.keras.utils import to_categorical # one encoding 하는 모듈

tf.random.set_seed(777)

#2. 입력데이터 불러오고 정규화 진행
(x_train, y_train), (x_test, y_test) = load_data(path='mnist.npz')  # mnist 데이터 로드
    
# 정규화 진행 
# 3차원 ---> 2차원으로 차원축소하고서 정규화 진행  ( 한 픽셀이 0~255 로 되어있는데)
# 0 ~ 1 사이로 변경 
x_train = (x_train.reshape((60000, 28 * 28))) / 255 
x_test = (x_test.reshape((10000, 28 * 28))) / 255

# 3. 정답 데이터를 준비한다. 

# 하나의 숫자를 one hot encoding 한다. (예:  4 ---> 0 0 0 0 1 0 0 0 0 0 ) 
y_train = to_categorical(y_train)  # 훈련 데이터의 라벨(정답)을 원핫 인코딩
y_test = to_categorical(y_test)    # 테스트 데이터의 라벨(정답)을 원핫 인코딩 

# 4. 모델을 구성합니다. 2층 신경망으로 구성
model = Sequential()
model.add(Flatten(input_shape = (784,)))   # 0층
model.add(Dense(100, activation = 'relu'))  # 1층
model.add(Dense(10, activation = 'softmax'))   #2층 

# 5. 모델을 설정합니다. ( 경사하강법, 오차함수를 정의해줍니다. )
model.compile(optimizer='Adam', 
              loss = 'categorical_crossentropy', 
              metrics=['acc'])  # 학습과정에서 정확도를 보려고 

#6. 모델을 훈련 시킵니다.
model.fit( x_train, y_train, epochs=30, batch_size=100)

# 7.모델을 평가합니다. (오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test)

[0.11097248643636703, 0.9749000072479248] 

Adam 도 속도는 SGD 와 똑같이 49초이다. 정확도는 0.97로 개선되었다.

 

3. RMSprop

#3. RMSprop 으로 필기체 데이터 학습시키는 텐써 플로우 코드 


# 1. 필요한 패키지 가져오는 코드 

import tensorflow as tf   # 텐써 플로우 2.0 
from tensorflow.keras.datasets.mnist import load_data  # 텐써플로우에 내장되어있는 
                                                                         # mnist 데이터를 가져온다.
from tensorflow.keras.models import Sequential  # 모델을 구성하기 위한 모듈
from tensorflow.keras.layers import Dense,Flatten  # 완전 연결계층을 구성하기 위한 모듈
from tensorflow.keras.utils import to_categorical # one encoding 하는 모듈

tf.random.set_seed(777)

#2. 입력데이터 불러오고 정규화 진행
(x_train, y_train), (x_test, y_test) = load_data(path='mnist.npz')  # mnist 데이터 로드
    
# 정규화 진행 
# 3차원 ---> 2차원으로 차원축소하고서 정규화 진행  ( 한 픽셀이 0~255 로 되어있는데)
# 0 ~ 1 사이로 변경 
x_train = (x_train.reshape((60000, 28 * 28))) / 255 
x_test = (x_test.reshape((10000, 28 * 28))) / 255

# 3. 정답 데이터를 준비한다. 

# 하나의 숫자를 one hot encoding 한다. (예:  4 ---> 0 0 0 0 1 0 0 0 0 0 ) 
y_train = to_categorical(y_train)  # 훈련 데이터의 라벨(정답)을 원핫 인코딩
y_test = to_categorical(y_test)    # 테스트 데이터의 라벨(정답)을 원핫 인코딩 

# 4. 모델을 구성합니다. 2층 신경망으로 구성
model = Sequential()
model.add(Flatten(input_shape = (784,)))   # 0층
model.add(Dense(100, activation = 'relu'))  # 1층
model.add(Dense(10, activation = 'softmax'))   #2층 

# 5. 모델을 설정합니다. ( 경사하강법, 오차함수를 정의해줍니다. )
model.compile(optimizer='RMSprop', 
              loss = 'categorical_crossentropy', 
              metrics=['acc'])  # 학습과정에서 정확도를 보려고 

#6. 모델을 훈련 시킵니다.
model.fit( x_train, y_train, epochs=30, batch_size=100)

# 7.모델을 평가합니다. (오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test)

 

 

[0.11944146454334259, 0.9764000177383423]

설명: 속도는 더 느려졌습니다(53초) 정확도는 0.97로 Adam과 차이가 없습니다.

결론은 adam을 쓰라.~