* 심층신경망
- 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
렐루 활성화 함수
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)
[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)
[0.351207435131073, 0.8755833506584167]
'Programming > Machine Learning' 카테고리의 다른 글
[혼공머신] 07-1 인공 신경망 Cont. (0) | 2022.04.09 |
---|---|
[혼공머신] 07-1 인공 신경망 (0) | 2022.04.09 |
[혼공머신] 용어 05장 (0) | 2022.04.09 |
[혼공머신] 06-3 주성분 분석 (0) | 2022.03.27 |
[혼공머신] 용어 04장 (0) | 2022.02.28 |
[혼공머신] 06-2 k-평균 (0) | 2022.02.20 |
[혼공머신] 06-1 군집 알고리즘(비지도학습) (0) | 2022.02.19 |
[혼공머신] 05-3 트리의 앙상블 (0) | 2022.02.13 |
[혼공머신] 05-2 교차 검증과 그리드 서치 (0) | 2022.02.12 |
[혼공머신] 05-1 결정트리 (0) | 2022.02.06 |