심층 신경망

Jaeseok Han·2024년 5월 13일

머신러닝&딥러닝

목록 보기
16/22

인공 신경망은 층을 추가함으로써 입력 데이터에 대해 연속적인 학습을 하는데 강력한 성능을 발휘한다

2개의 층

은닉층

은닉층은 입력층과 출려층사이에 위치한 층으로, 입력 데이터를 받아들여 다양한 연산을 수행한다.

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

# 이미지 픽셀값 변경 (0~255 -> 0~1)
train_scaled = train_input / 255.0
# 2차원 배열 -> 1차원 배열로 변경(28 x 28 -> 784)
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')

심층 신경망 생성

# 심층 신경망 생성
model= keras.Sequential([dense1, dense2])

# 케라스 모델 요약 정보
model.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_1 (Dense)             (None, 100)               78500     
                                                                 
 dense_2 (Dense)             (None, 10)                1010      
                                                                 
=================================================================
Total params: 79510 (310.59 KB)
Trainable params: 79510 (310.59 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________

층을 추가하는 다른 방법

1. Sequential 클래스의 생성자 안에 바로 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.summary()
_________________________________________________________________
Model: "패션 MNIST 모델"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 hidden (Dense)              (None, 100)               78500     
                                                                 
 output (Dense)              (None, 10)                1010      
                                                                 
=================================================================
Total params: 79510 (310.59 KB)
Trainable params: 79510 (310.59 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________

2. add() 메서드 사용

model = keras.Sequential()
model.add(keras.layers.Dense(100, activation='sigmoid', input_shape=(784,)))
model.add(keras.layers.Dense(10, activation='softmax'))

렐루 함수

시그모이드함수는 그래프 양 끝으로 갈수록 기울기가 매우 작아져 올바른 출력을 만들어내는데 시간이 오래걸린다. 이를 해결하기 위해 렐루(Rectified Linear Unit, ReLU)함수를 사용한다.
렐루 함수는 양수 입력에 대해 그래도 값을 출력하고, 음수 입력에 대해서는 0을 출력하는 함수이다.

from tensorflow import keras
from sklearn.model_selection import train_test_split
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data();
train_scaled = train_input / 255.0
train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled, train_target, test_size=0.2, random_state=42)

# Flatten 클래스 사용
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.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
model.fit(train_scaled, train_target, epochs=5)
# 검증 세트 성능
model.evaluate(val_scaled, val_target)
#출력 [0.3870340883731842, 0.8669166564941406]

옵티마이저

옵티마이저는 모델이 손실 함수를 기반으로 가중치를 업데이트하는 방법을 결정한다.

[참고] 옵티마이저

여러 옵티마이저중 아담(Adam)옵티마이저를사용하여 모델을 훈련한다.

from tensorflow import keras
from sklearn.model_selection import train_test_split
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data();
train_scaled = train_input / 255.0
train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled, train_target, test_size=0.2, random_state=42)

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.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
model.fit(train_scaled, train_target, epochs=5)

model.evaluate(val_scaled, val_target)
Epoch 1/5
1500/1500 [==============================] - 6s 3ms/step - loss: 0.5210 - accuracy: 0.8186
Epoch 2/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3943 - accuracy: 0.8583
Epoch 3/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3553 - accuracy: 0.8699
Epoch 4/5
1500/1500 [==============================] - 5s 3ms/step - loss: 0.3261 - accuracy: 0.8820
Epoch 5/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3074 - accuracy: 0.8871
375/375 [==============================] - 1s 2ms/step - loss: 0.3399 - accuracy: 0.8781
[0.33991050720214844, 0.878083348274231]

0개의 댓글