밑바닥부터 시작하는 딥러닝 p.132 참고
학습률(learning rate) 이란?
한번의 학습으로 얼마만큼 매개변수(가중치와 바이어스)를 갱신할 지를 결정하는 하이퍼 파라미터
가중치 = 가중치 - 학습률*기울기
학습률을 잘 조절해야하는 이유
학습률이 너무 ↑ : 학습은 빠르지만 global minimum을 지나칠 수 있습니다.
학습률이 너무 ↓ : global minum을 지나칠 염려는 없지만 학습이 너무 느려서 수렴을 못합니다.
[실습 ]
학습률이 너무 큰 경우와 작은 경우를 텐써플로우를 이용해 확인해보자
경사하강법은 RMSprop 을 사용하는 코드를 가지고 확인해보았다.
1. 학습률이 너무 큰 경우
■ 기존의 코드에서 러닝레이트를 조절하는 부분
from tensorflow.keras import backend as k
# 하이퍼파라미터를 직접 조정하고 싶을 때 사용하는 모듈이다(텐써플로우는 자동으로 셋팅되어있으니)
k.set_value(model.optimizer.learning_rate, 0.5)
# 학습률을 0.5로 줘보겠다.
from tensorflow.keras import backend as K # 상세한 하이퍼 파라미터를 셋팅하고자 하기위한 모듈
# 직접 커스터마이징 하여 파라미터 조정하고 싶을 때 사용
#6. 모델을 훈련 시킵니다.
K.set_value(model.optimizer.learning_rate, 0.5) #러닝레이트 크게 주기 # 파라미터 커스터마이징
print(model.optimizer.learning_rate.numpy())
model.fit( x_train, y_train, epochs=30, batch_size=100)
전체 코드
#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 하는 모듈
from tensorflow.keras import backend as K # 상세한 하이퍼 파라미터를 셋팅하고자 하기위한 모듈
# 직접 커스터마이징 하여 파라미터 조정하고 싶을 때 사용
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. 모델을 훈련 시킵니다.
K.set_value(model.optimizer.learning_rate, 0.5) #러닝레이트 크게 주기 # 파라미터 커스터마이징
print(model.optimizer.learning_rate.numpy())
model.fit( x_train, y_train, epochs=30, batch_size=100)
# 7.모델을 평가합니다. (오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test)
0.5
[4.290281295776367, 0.3456000089645386]
설명: 학습률을 너무 크게 주니까 발산을 해버리면서 정확도가 0.34 가 나왔다.
2. 학습률이 너무 작은 경우
학습률 0.000001 로 주었다.
#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 하는 모듈
from tensorflow.keras import backend as K # 상세한 하이퍼 파라미터를 셋팅하고자 하기위한 모듈
# 직접 커스터마이징 하여 파라미터 조정하고 싶을 때 사용
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. 모델을 훈련 시킵니다.
K.set_value(model.optimizer.learning_rate, 0.000001) #러닝레이트 작게 주기 # 파라미터 커스터마이징
print(model.optimizer.learning_rate.numpy())
model.fit( x_train, y_train, epochs=30, batch_size=100)
# 7.모델을 평가합니다. (오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test)
1e-06
[1.0210216045379639, 0.8087000250816345]
설명 : 30 에폭으로는 수렴하지 못했다. 에폭수를 늘리면 수렴할 수 있으나 시간이 오래걸린다.
학습률이 너무 크면 발산하여 정확도가 안나오고,
학습률이 너무 작으면 수렴하지 못한다!
'딥러닝' 카테고리의 다른 글
| 4장 11 신경망 활용 사용자 인터 페이스 만들기 (2) | 2022.10.05 |
|---|---|
| 4장 10. fashion mnist 신경망에 사진 넣고 예측하는지 확인해보기 (1) | 2022.10.05 |
| 4강 8-2 경사하강법으로 필기체 데이터를 학습시켜보자 (텐써플로우) (2) | 2022.10.05 |
| 4강 - 8. 경사하강법의 개념과 종류(p.129) (1) | 2022.10.05 |
| 밑바닥부터 시작하는 딥러닝 4장 - 1. 오차함수 (1) | 2022.10.04 |