728x90

* 심층신경망

 - 2개 이상의 층을 포함한 신경망(다층 인공 신경망, 딥러닝)

* 렐루함수

 - 이미지 분류 모델의 은닉층에서 많이 사용하는 활성화 함수. 시그모이드 함수는 층이 많을수록 활성화 함수의 양쪽 끝에서 변화가 작기 때문에 학습이 어려워진다. 렐루함수는 이런 문제가 없으며 계산도 간단.

* 옵티마이저

 - 신망의 가중치와 절편을 학습하기 위한 알고리즘 또는 방법. 케라스에는 다양한 경사 하강법 알고리즘이 구현되어 있음. (SGD, 네스테로프 모멘텀, RMSprop, Adam)

 

package and method

* TensorFlow

 - add() : keras.layers 아래 있음. 호출하여 전달 한 순서대로 층이 차례대로 늘어남

 - summary() : 추가된 층의 종류/순서/parameter 개수를 출력. 층을 만들 때 name을 변수로 지정하면 구분이 쉽다

 - SGD : 기본 경사 하강법 옵티마이저 클래스

   : learning_rate : 학습률 지정 (default 0.01)

   : momentum : 0 이상의 값을 지정하면 모멘텀 최적화 수행

   : nesterov : True로 설정하면 네스테로프 모멘텀 최적화 수행

 - Adagrad

   : learning_rate : default 0.001

   : initial_accumulator_value : 그레이디언트 제곱을 누적하여 학습률을 나눔. 누적 추깃값을 지정할 수 있으며 default 0.1

 - RMSprop

   : learning_rate : default 0.001

   : rho : default 0.9 : Adagrad처럼 그레이디언트 제곱으로 학습률 나눔. 최근의 그레이디언트를 사용하기 위해 지수 감소를 사용

 - Adam

   : learning_rate : default 0.001

   : beta_1 : default 0.9 : 모멘텀 최적화에 있는 크레이디언트의 지수 감소 평균을 조절

   : beta_2 : default 0.999 : RMSprop에 있는 크레이디언트의 지수 감소 평균을 조절

 

심층 신경망

 

2개의 층

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)

dense1 = keras.layers.Dense(100, activation='sigmoid', input_shape=(784,))
dense2 = keras.layers.Dense(10, activation='softmax')

Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz 32768/29515 [=================================] - 0s 0us/step 40960/29515 [=========================================] - 0s 0us/step Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz 26427392/26421880 [==============================] - 0s 0us/step 26435584/26421880 [==============================] - 0s 0us/step Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz 16384/5148 [===============================================================================================] - 0s 0us/step Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz 4423680/4422102 [==============================] - 0s 0us/step 4431872/4422102 [==============================] - 0s 0us/step

 

픽셀값은 0~255 => 0~1로 변환

28*28의 2차원 배열을 784 크기의 1차원 배열로 변환

 

 

image array에서 784개의 특징이 10개로 줄어드는 과정에서 이번에는 은닉층이 추가되었다. 

출력층 활성화 함수

 - 이진 분류 : 시그모이드 함수를 많이 사용

 - 다중 분류 : 소프트맥스 함수 사용

은닉층 활성화 함수

 - 출력층보다 자유로움(시그모이드함수, 렐루 함수 등)

심층 신경망 만들기

model = keras.Sequential([dense1, dense2])
model.summary()

Model: "sequential_1" _________________________________________________________________

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 _________________________________________________________________

층을 추가하는 다른 방법

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: 79,510 Trainable params: 79,510 Non-trainable params: 0 _________________________________________________________________

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

model.summary()

Model: "sequential_2" _________________________________________________________________

Layer (type) Output Shape Param # =================================================================

dense_2 (Dense) (None, 100) 78500 dense_3 (Dense) (None, 10) 1010 =================================================================

Total params: 79,510 Trainable params: 79,510 Non-trainable params: 0 _________________________________________________________________

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.5681 - accuracy: 0.8076
Epoch 2/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.4077 - accuracy: 0.8526
Epoch 3/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3726 - accuracy: 0.8658
Epoch 4/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3504 - accuracy: 0.8728
Epoch 5/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3341 - accuracy: 0.8788
에포크5번 동안 훈련을 진행했다.
추가된 층이 성능을 향상시키는 것을 볼 수 있다.

렐루 활성화 함수

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.summary()

Model: "sequential_3"

_________________________________________________________________

Layer (type)               Output  Shape                Param # =================================================================

flatten (Flatten)            (None, 784)                   0

dense_4 (Dense)          (None, 100)                   78500

dense_5 (Dense)          (None, 10)                    1010 =================================================================

Total params: 79,510

Trainable params: 79,510

Non-trainable params: 0

_________________________________________________________________

렐루함수는 0보다 작으면 0으로 만들고 양수면 그대로 출력

 

(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.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')

model.fit(train_scaled, train_target, epochs=5)
Epoch 1/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.5310 - accuracy: 0.8126
Epoch 2/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.3963 - accuracy: 0.8570
Epoch 3/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.3581 - accuracy: 0.8714
Epoch 4/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.3353 - accuracy: 0.8801
Epoch 5/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.3207 - accuracy: 0.8856
model.evaluate(val_scaled, val_target)
375/375 [==============================] - 1s 2ms/step - loss: 0.3550 - accuracy: 0.8782
[0.3549554944038391, 0.878166675567627]

옵티마이저

케라스는 다양한 경사 하강법 알고리즘을 제공한다.(optimizer)

model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy', metrics='accuracy')
sgd = keras.optimizers.SGD()
model.compile(optimizer=sgd, loss='sparse_categorical_crossentropy', metrics='accuracy')

sgd = keras.optimizers.SGD(learning_rate=0.1)

sgd = keras.optimizers.SGD(momentum=0.9, nesterov=True)

adagrad = keras.optimizers.Adagrad()
model.compile(optimizer=adagrad, loss='sparse_categorical_crossentropy', metrics='accuracy')

rmsprop = keras.optimizers.RMSprop()
model.compile(optimizer=rmsprop, loss='sparse_categorical_crossentropy', metrics='accuracy')

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)
Epoch 1/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.5223 - accuracy: 0.8193
Epoch 2/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3921 - accuracy: 0.8601
Epoch 3/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3499 - accuracy: 0.8733
Epoch 4/5
1500/1500 [==============================] - 4s 2ms/step - loss: 0.3241 - accuracy: 0.8809
Epoch 5/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3033 - accuracy: 0.8883
model.evaluate(val_scaled, val_target)
375/375 [==============================] - 1s 1ms/step - loss: 0.3512 - accuracy: 0.8756
[0.351207435131073, 0.8755833506584167]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

+ Recent posts