심층 신경망을 통해 딥러닝의 성능을 더 높혀보자
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)
우선 Mnist 정보를 받아왔다
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_4"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_8 (Dense) (None, 100) 78500
dense_9 (Dense) (None, 10) 1010
=================================================================
Total params: 79,510
Trainable params: 79,510
Non-trainable params: 0
_________________________________________________________________
"""
각각의 밀집에서 뉴런의 개수가 784->100->10으로 줄어들도록 밀집층을 구성하였다
dense1 = keras.layers.Dense(100,activation='sigmoid', input_shape=(784,))
dense2 = keras.layers.Dense(10,activation='softmax')
model = keras.Sequential()
model.add(dense1)
model.add(dense2)
model.summary()
위와 같은 방식으로도 밀집층을 추가 할 수 있다
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
model.fit(train_scaled, train_target, epochs=5)
"""
Epoch 1/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.5697 - a
ccuracy: 0.8057
Epoch 2/5
1500/1500 [==============================] - 2s 2ms/step - loss: 0.4114 -
accuracy: 0.8518
Epoch 3/5
1500/1500 [==============================] - 2s 2ms/step - loss: 0.3771 -
accuracy: 0.8641
Epoch 4/5
1500/1500 [==============================] - 2s 2ms/step - loss: 0.3534 -
accuracy: 0.8732
Epoch 5/5
1500/1500 [==============================] - 2s 2ms/step - loss: 0.3379 -
accuracy: 0.8776
"""
층이 추가되고 성능이 향상했음을 알 수 있다
이태까지 우리는 시그모이드 함수
를 통해 값을 나타내었으나, 시그모이드 함수
는 기울기 소실
등의 문제점을 가지고 있다
이를 보완하기 위해 렐루 함수
가 만들어졌다
음수일때는 0을 반환, 양수일때는 자기 자신을 반환하는 함수이다
출처
flatten0 = keras.layers.Flatten(input_shape=(28,28))
dense1 = keras.layers.Dense(100,activation='relu')
dense2 = keras.layers.Dense(10,activation='softmax')
model = keras.Sequential()
model.add(flatten0)
model.add(dense1)
model.add(dense2)
이때 Flatten
을 이용하여 데이터를 1차원으로 구성 가능하다