AI/Deep Learning

[Tensorflow 2.x / Keras] 기본 -3 MNIST 셋 활용 / 인공신경망-3 / Relu + Optimizer

Jeong Jeon
반응형

지난 게시글에 이어 오늘은 Relu함수와 Optimizer에 대해 공부해보려고 한다.

 

자세한 내용은 생략하고 코드로 보자~!

 

1). 데이터셋 가져오기, 훈련세트, 테스트세트, 검증세트로 나누기

from tensorflow import keras
(train_input, train_target), (test_input,test_target) = keras.datasets.fashion_mnist.load_data()

from sklearn.model_selection import train_test_split
train_scaled = train_input/255.0
train_scaled = train_input.reshape(-1,28*28)# -1 : 첫번째 차원은 그대로두고 나머지 차원만 바꾼다.
train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled,train_target,test_size=0.2,random_state=42)

2). 모델 만들기

#출력층을 마지막에 꼭 둬야한다.
model=keras.Sequential()
model.add(keras.layers.Dense(100, activation='sigmoid',input_shape=(784,)))
model.add(keras.layers.Dense(10, activation='softmax'))
model.summary()
print(train_target)

  • Dense-1 : 뉴런 100개 sigmoid 활성화 함수 적용 / 784픽셀
  • Dense-2 : 뉴런 10개 softmax 활성화 함수 적용

3). 훈련

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
model.fit(train_scaled,train_target, epochs=5)
  • sparse_categorical_crossentropy => 손실함수 적용 : 원-핫 코딩으로 타깃이 준비되있어야한다.
  • 훈련횟수 = 5회

4). 모델 변경 : sigmoid => relu

model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28,28)))
model.add(keras.layers.Dense(100,activation='relu'))
model.add(keras.layers.Dense(10,activation='softmax'))
model.summary()

  • Flatten : 기존에는 인공신경망에 주입하기 위해 Numpy의 reshape함수를 이용하여 1차원으로 데이터를 변환하였지만, keras에서 제공하는 함수로 1차원으로 변경하였다.
  • sigmoid를 적용했던 Dense-1층을 relu함수로 변경
    • sigmoid는 함수그래프를 보면 끝과 끝으로 갈수록 그래프가 누워있어 정확한 출력을 만드는데 빠르지 못하다. 이런 부분을 개선하기 위해 relu함수를 적용한다.

Relu함수란?

  • 입력이 양수일 경우 활성화함수가 없는 것 처럼 데이터를 통과시키고, 음수면 0으로 만든다.

5). 다시 훈련데이터 준비 및 변경한 모델 실행

#다시 데이터 준비해서 지금 만든 모델을 훈련시켜보자.
(train_input, train_target), (test_input,test_target) = keras.datasets.fashion_mnist.load_data()

train_scaled = train_input/255.0
train_scaled = train_input.reshape(-1,28*28)# -1 : 첫번째 차원은 그대로두고 나머지 차원만 바꾼다.
train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled,train_target,test_size=0.2,random_state=42)
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
model.fit(train_scaled,train_target, epochs=5)

=> 조금더 성능이 좋아진것을 확인 할 수 있다.

 

6). 검증

model.evaluate(val_scaled,val_target)

loss가 왜이렇게 높지...? 따로, 알아봐야겠다...

 

7). 옵티마이저 적용

##1 확률적 경사하강법

sgd = keras.optimizers.SGD()
model.compile(optimizer=sgd, loss='sparse_categorical_crossentropy', metrics='accuracy')
#확률적 경사하강법 사용시 learning_rate 설정하는방법
#sgd = keras.optimizers.SGD(learning_rate=0.1)
#네스테로프 모멘텀 사용시 => 확률적 경사하강법 보다 더 좋은 성능을 낸다고 한다.
sgd = keras.optimizers.SGD(momentum=0.9,nesterov=True)

#다른 적응적 학습률을 사용하는 옵티마이저

##2. adagrad
adagrad = keras.optimizers.Adagrad()
model.compile(optimizer=adagrad, loss='sparse_categorical_crossentropy', metrics='accuracy')

##3. rmsprop
adagrad = keras.optimizers.Adagrad()
model.compile(optimizer=adagrad, loss='sparse_categorical_crossentropy', metrics='accuracy')

8). 옵티마이저를 적용하고, 다시 모델을 만들어준다.

model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28,28)))
model.add(keras.layers.Dense(100,activation='relu'))
model.add(keras.layers.Dense(10,activation='softmax'))8). 옵티마이저를 적용하고, 다시 모델을 만들어준다.

9). 다시 훈련해보자

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy',metrics='accuracy')
model.fit(train_scaled,train_target,epochs=5)

성능은 조금더 나아졌다.

검증도 한번 해보자

10). 재검증

model.evaluate(val_scaled,val_target)

후하 문제없이 끝났다.

성능도 괜찮게 나왔고, 손실도 적게 나온것 같다....?;

여기까지..!

반응형