[혼공머신]7-2
심층 신경망 (Deep Neural Networks)
심층 신경망은 두 개 이상의 층을 포함한 신경망으로, 이러한 구조는 입력 데이터의 복잡한 패턴을 학습할 수 있게 해줍니다. 각 층은 주로 여러 뉴런으로 구성되며, 각 뉴런은 이전 층의 모든 뉴런과 연결되어 있을 수 있습니다.
1. 심층 신경망 만들기
케라스(Keras)를 사용하여 심층 신경망을 만드는 방법은 간단합니다. 기본적으로 Sequential
모델을 사용하여 여러 층을 쉽게 추가할 수 있습니다. 각 층은 특정한 역할과 파라미터를 가지고 있으며, 예를 들어 Dense
층은 완전 연결 층을 의미합니다.
층을 추가하는 다른 방법
층을 추가하는 또 다른 방법으로는 함수형 API를 사용하는 것입니다. 이 방법은 보다 복잡한 모델 아키텍처를 구성할 때 유용하며, 층 간의 다양한 연결을 가능하게 합니다. 예를 들어, 입력 데이터를 여러 층에 동시에 연결하거나 층의 출력을 다시 입력으로 사용할 수 있습니다.
초기 설정
import tensorflow as tf
# 실행마다 동일한 결과를 얻기 위해 랜덤 시드를 설정합니다.
tf.keras.utils.set_random_seed(42)
# 텐서플로 연산을 결정적으로 만듭니다.
tf.config.experimental.enable_op_determinism()
데이터 로드 및 전처리
from tensorflow import keras
from sklearn.model_selection import train_test_split
# Fashion MNIST 데이터셋을 로드합니다.
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
# 픽셀 값을 0과 1 사이로 정규화합니다.
train_scaled = train_input / 255.0
# 입력 데이터를 1D 배열로 변환합니다.
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)
신경망 층 설정 및 모델 구성
dense1 = keras.layers.Dense(100, activation='sigmoid', input_shape=(784,))
dense2 = keras.layers.Dense(10, activation='softmax')
# Sequential 모델을 사용하여 층을 구성합니다.
model = keras.Sequential([dense1, dense2])
# 모델 구조를 출력합니다.
model.summary()
2. 렐루 함수 (ReLU Function)
렐루(ReLU) 함수는 신경망의 은닉층에서 가장 널리 사용되는 활성화 함수 중 하나입니다. 이 함수는 입력이 0보다 클 경우 입력을 그대로 출력하고, 0 이하일 경우 0을 출력합니다. 이 특성 때문에 렐루 함수는 비선형성을 추가하면서도 계산이 매우 간단하고, 기울기 소실 문제를 효과적으로 줄여줍니다.
model = keras.Sequential()
# 이미지 데이터를 평탄화하는 층을 추가합니다.
model.add(keras.layers.Flatten(input_shape=(28, 28)))
# ReLU 활성화 함수를 사용하는 은닉층을 추가합니다.
model.add(keras.layers.Dense(100, activation='relu'))
# 소프트맥스 활성화 함수를 사용하는 출력 층을 추가합니다.
model.add(keras.layers.Dense(10, activation='softmax'))
# 모델 구조를 출력합니다.
model.summary()
3. 옵티마이저 (Optimizer)
신경망의 학습에서 중요한 부분은 옵티마이저의 선택입니다. 옵티마이저는 네트워크의 가중치를 업데이트하는 방법을 결정하며, 여러 종류가 있습니다:
- SGD (Stochastic Gradient Descent): 가장 기본적인 형태의 경사 하강법.
- Nesterov Accelerated Gradient: 모멘텀을 기반으로 하며, 더 빠른 수렴을 도모합니다.
- RMSprop: 그레이디언트의 제곱근을 사용하여 학습률을 조절합니다.
- Adam: 모멘텀과 RMSprop의 장점을 결합한 방법으로, 일반적으로 가장 효과적인 성능을 보입니다.
SGD 옵티마이저
sgd = keras.optimizers.SGD(learning_rate=0.1)
# SGD 옵티마이저를 사용하여 모델을 컴파일합니다.
model.compile(optimizer=sgd, loss='sparse_categorical_crossentropy', metrics='accuracy')
Adagrad 옵티마이저
adagrad = keras.optimizers.Adagrad()
# Adagrad 옵티마이저를 사용하여 모델을 컴파일합니다.
model.compile(optimizer=adagrad, loss='sparse_categorical_crossentropy', metrics='accuracy')
RMSprop 옵티마이저
rmsprop = keras.optimizers.RMSprop()
# RMSprop 옵티마이저를 사용하여 모델을 컴파일합니다.
model.compile(optimizer=rmsprop, loss='sparse_categorical_crossentropy', metrics='accuracy')
Adam 옵티마이저
# 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)
댓글남기기