인공 신경망은 층을 추가함으로써 입력 데이터에 대해 연속적인 학습을 하는데 강력한 성능을 발휘한다
은닉층은 입력층과 출려층사이에 위치한 층으로, 입력 데이터를 받아들여 다양한 연산을 수행한다.
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)
_________________________________________________________________
# 층을 추가하는 다른 방법
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)
_________________________________________________________________
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]