텐써플로우를 이용하여 경사하강법으로 필기체 데이터를 학습시켜보자
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을 쓰라.~
'딥러닝' 카테고리의 다른 글
4장 11 신경망 활용 사용자 인터 페이스 만들기 (2) | 2022.10.05 |
---|---|
4장 10. fashion mnist 신경망에 사진 넣고 예측하는지 확인해보기 (1) | 2022.10.05 |
4장 9. 학습률(learning rate) p.132 (2) | 2022.10.05 |
4강 - 8. 경사하강법의 개념과 종류(p.129) (1) | 2022.10.05 |
밑바닥부터 시작하는 딥러닝 4장 - 1. 오차함수 (1) | 2022.10.04 |