2021. 7. 1. 21:00ㆍICT 멘토링/혼자 공부하는 머신러닝+딥러닝
18강 - 심층 신경망 ▶️인공 신경망에 층을 추가하여 심층 신경망 만들어 보기
지난 시간에
2개의 층
층이 3개 존재하지만 입력층은 고려X.
입력 데이터와 은닉층 사이 수학 계산 사용.
입력층 - 28*28 = 784개의 뉴런
은닉층 - 출력층보다 적은 개수를 가지면 손실 존재하므로 출력층보다 많은 개수를 가짐.
다중 분류라 소프트맥스 함수 사용.
이진 분류면 시그모이드 함수 사용하면 됨.
은닉층에도 활성화 함수가 사용되어야 함.
가운데 은닉층이 활성화함수 없이 산술 연산만(x * w) 표현한다면 뒤의 출력층과 합쳐서 하나의 층으로 표현 가능함.
따라서 은닉층을 둔다는 것은 활성화 함수를 거쳐서 비선형 함수로 데이터를 변형해서 선형식이 합쳐지지 않도록 해야함.
시그모이드 함수 외에도 relu, tanh 같은 함수들 존재함.
심층 신경망
dense1 = keras.layers.Dense(100, activation='sigmoid', input_shape=(784,))
dense2 = keras.layers.Dense(10, activation='softmax')
model = keras.Sequential([dense1, dense2])
은닉층을 dense1으로 출력층을 dense2로 만듦.
keras에 Dense 클래스를 2번 호출 후 Sequential 사용.
은닉층 - sigmoid
출력층 - softmax
활성화 함수 사용
summary() 메서드
model.summary()
결과
Model: "sequential"
_________________________________________________________________
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 _________________________________________________________________
100개의 출력, 10개의 출력
None은 fit(... batchsize=32) 미니배치경사하강법 배치사이즈 지정함.
미니배치 사이즈 64, 128 등 사이즈 변화 가능.
한 배치의 샘플 개수를 None으로 해서 어떤 것으로든 지정할 수 있도록 함.
Param은 파라미터 개수.
은닉층은 784 * 100 + 100(절편 개수) = 78500 개
출력층은 100 * 10 + 10(절편 개수) = 1010 개
층을 추가하는 다른 방법
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 = keras.Sequential()
model.add(keras.layers.Dense(100, activation='sigmoid', input_shape=(784,)))
model.add(keras.layers.Dense(10, activation='softmax'))
바로 Sequential에 Dense를 추가할 수 있지만 많아지면 보기 어려움.
방법으로 Sequential로 객체를 만들고 add할 수 있음.
렐루 함수와 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.summary()
결과
Model: "sequential_2"
_________________________________________________________________
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
_________________________________________________________________
시그모이드 함수의 단점은 선형출력 값이 너무 크거나 작은 값은 시그모이드 함수 값의 변화가 굉장히 작아지게 됨.
1이나 0의 값과 거의 같아짐. 이런 것을 포화되었다고 함.
완만하게 이어지는 구간은 신경망 모델이 빠른 변화에 대응해 학습하기 어려워 깊은 학습이 불가했음.
하지만 렐루 함수는 0보다 크면 그냥 z를 출력하고 0보다 작으면 버림.
시그모이드의 단점 극복!
새로운 층 - Flatten
알고리즘에 실제론 쓰이지 않고 편의상 필요한 층이 있음.
파라미터가 0으로 가중치가 없음.
입력층이 이런 Flatten 층으로 만들 수 있음.
옵티마이저
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)
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)
결과
375/375 [==============================] - 1s 2ms/step - loss: 0.3584 - accuracy: 0.8694
[0.3584301769733429, 0.8694166541099548]
옵티마이저 - sgd 쓰면 확률적 경사 하강법 사용함. 실제론 미니배치경사하강법임.
적응적 확습률 옵티마이저 - 경사가 급할 때 epoch를 크게, 강사가 완면하면 epoch를 작게!
sgd 객체 만들어서 optimizer로 전달하는 것과 'sgd'로 바로 전달하는 것 동일함.
옵티마이저도 하이퍼 파라미터 중 하나라 하나씩 적용해보면서 적절한 것을 고르면 됨.
신경망 모델은 층을 추가하는 특징을 가짐.
앙상블 vs 신경망 모델
앙상블 모델에서 Random Forest가 여러 개의 모델을 가지고 앙상블 했음.
신경망 모델도 이와 유사하게 생각할 수 있음.
앙상블(Random Forest) | 신경망 모델 |
독립적으로 훈련 | 은닉층 유닛들이 한 번에 훈련 |
결과 위에 쌓을 수 없음 | 쌓아서 단계별 학습 가능 |
db, 엑셀같은 정형화된 데이터에 적합 | 이미지, 텍스트같은 비정형화된 데이터에 적합 |
GB, 스태킹도 단계별 학습 하지만 순차적 훈련, 신경망 모델은 여러 개의 층이 동시에 훈련함.
표현학습 - 데이터의 특징(패턴)을 스스로 찾아냄
참고 자료
https://www.youtube.com/watch?v=JskWW5MlzOg&list=PLVsNizTWUw7HpqmdphX9hgyWl15nobgQX&index=18
'ICT 멘토링 > 혼자 공부하는 머신러닝+딥러닝' 카테고리의 다른 글
20강 - 합성곱 신경망의 개념과 동작 원리 배우기 (0) | 2021.07.08 |
---|---|
19강 - 신경망 모델 훈련 ▶️인경 신경망 모델 훈련의 모범 사례 학습하기 (0) | 2021.07.08 |
17강 - 인공 신경망 ▶️ 간단한 인공 신경망 모델 만들기 (0) | 2021.06.24 |
11강 - 로지스틱 회귀로 와인 분류하기 & 결정 트리 (0) | 2021.06.24 |
10강 - 확률적 경사 하강법 알아보기 (0) | 2021.06.24 |