ML
혼자 공부하는 머신러닝 + 딥러닝 7장 심층 신경망 리뷰
혀내
2022. 6. 12. 00:41
반응형
심층 신경망
- 입력층(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
반응형