티스토리 뷰

반응형

심층 신경망

  • 입력층(784개): 입력 데이터의 개수와 동일함
  • 은닉층(100개): 정해진 개수는 없지만, 최소한 출력층의 개수보다 커야 손실이 발생하지 않음
  • 출력층(10개): 클래스의 개수와 동일함

 

먼저 이전 챕터와 동일하게 패션 MNIST 데이터셋을 준비한다.

  • 텐서플로우 객체 생성
import tensorflow as tf

tf.keras.utils.set_random_seed(42)
tf.config.experimental.enable_op_determinism()

 

  • 훈련 데이터셋과 테스트 데이터셋 준비
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_scaled.reshape(-1, 28*28)

train_scaled, val_scaled, train_target, val_target = train_test_split(
    train_scaled, train_target, test_size=0.2, random_state=42)

 

2개의 층

모델의 은닉층과 출력층을 미리 준비한다. 파라미터에는 뉴런의 개수, 활성화 함수 그리고 필요에 따라 입력 개수가 차례대로 들어간다.
# 은닉층(dense1)과 출력층(dense2) 준비하기
dense1 = keras.layers.Dense(100, activation='sigmoid', input_shape=(784,))
dense2 = keras.layers.Dense(10, activation='softmax')
 
 
 

심층 신경망 만들기

만들어두었던 은닉층과 출력층 객체를 넣어 머신러닝 모델을 생성한다.

model = keras.Sequential([dense1, dense2])

 

summary() 메소드는 모델의 레이어에 대한 설명을 출력하는 메소드이다.

model.summary()
# [결과]

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 100)               78500     
                                                                 
 dense_1 (Dense)             (None, 10)                1010      
                                                                 
=================================================================
Total params: 79,510
Trainable params: 79,510
Non-trainable params: 0
_________________________________________________________________
 
  • dense의 Param = 784(입력층에서 들어오는 입력 개수) * 100 + 100(절편 개수) = 78500
  • dense_1의 Param = 100(은닉층에서 들어오는 입력 개수) * 10 + 10(절편 개수) = 1010

 

 

위처럼 dense 클래스를 따로 만들지 않고 모델을 생성할 때 객체를 바로 넣어줄 수도 있다.

model = keras.Sequential([
    keras.layers.Dense(100, activation='sigmoid', input_shape=(784,), name='hidden'),
    keras.layers.Dense(10, activation='softmax', name='output')
], name='패션 MNIST 모델')

 

이미 생성한 모델에 층을 추가하고 싶을 때에는 다음과 같이 추가한다.

# 층을 추가하고 싶을 때 가장 많이 사용하는 방법
model = keras.Sequential()
model.add(keras.layers.Dense(100, activation='sigmoid', input_shape=(784,)))
model.add(keras.layers.Dense(10, activation='softmax'))

 

이제 모델을 학습시켜보자!

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')

model.fit(train_scaled, train_target, epochs=5)
# 결과
Epoch 1/5
1500/1500 [==============================] - 5s 3ms/step - loss: 0.5628 - accuracy: 0.8073
Epoch 2/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.4075 - accuracy: 0.8522
Epoch 3/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3741 - accuracy: 0.8652
Epoch 4/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3509 - accuracy: 0.8732
Epoch 5/5
1500/1500 [==============================] - 5s 3ms/step - loss: 0.3335 - accuracy: 0.8784
 

 

 

렐루 활성화 함수

  • relu(N) : 입력값이 0보다 작으면 0을 출력하고, 0보다 크다면 N을 출력한다. ( = max(0, 2))
  • activation 파라미터에 'relu'를 넣어 렐루 함수를 사용할 수 있다.
model = keras.Sequential()
# Flatten: 28*28 이미지 크기를 784 크기의 1차원으로 펼치는 역할
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.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')

model.fit(train_scaled, train_target, epochs=5)
Epoch 1/5
1500/1500 [==============================] - 7s 4ms/step - loss: 0.5336 - accuracy: 0.8090
Epoch 2/5
1500/1500 [==============================] - 5s 4ms/step - loss: 0.3934 - accuracy: 0.8579
Epoch 3/5
1500/1500 [==============================] - 6s 4ms/step - loss: 0.3554 - accuracy: 0.8717
Epoch 4/5
1500/1500 [==============================] - 6s 4ms/step - loss: 0.3342 - accuracy: 0.8801
Epoch 5/5
1500/1500 [==============================] - 5s 3ms/step - loss: 0.3177 - accuracy: 0.8866
 
 
model.evaluate(val_scaled, val_target)
375/375 [==============================] - 1s 2ms/step - loss: 0.3757 - accuracy: 0.8731
 

 

 

옵티마이저

옵티마이저 함수는 오차 범위를 줄이기 위해 값을 보정하는 역할을 수행한다. optimizer 파라미터를 통해 함수를 지정할 수 있으며 대표적으로 시그모이드아담 함수가 가장 많이 쓰인다.

# sgd: 확률적 경사
model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy', metrics='accuracy')

 

직접 함수 객체를 만들어 넣어줘도 된다.

sgd = keras.optimizers.SGD()
model.compile(optimizer=sgd, loss='sparse_categorical_crossentropy', metrics='accuracy')

 

객체를 생성할 때에는 파라미터를 이용해 학습률, 모멘텀, nesterov 등을 설정할 수 있다.

# 학습률 설정
sgd = keras.optimizers.SGD(learning_rate=0.1)
# 모멘텀이나 nesterov를 사용하고 싶은 경우에 설정
sgd = keras.optimizers.SGD(momentum=0.9, nesterov=True)

 

아담 함수도 같은 방법으로 사용된다.

# Adam 옵티마이저 사용법
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')

model.fit(train_scaled, train_target, epochs=5)
model.evaluate(val_scaled, val_target)
375/375 [==============================] - 1s 2ms/step - loss: 0.3526 - accuracy: 0.8716
 
반응형