12. 심층 신경망

yellowsubmarine372·2024년 8월 1일
0

머신러닝

목록 보기
12/18
post-thumbnail

colab link
Deep Neural Network.ipynb

1. 2개의 층

지난 시간의 인공신경망 모델에 층을 2개 추가(은닉층과 활성화 함수)
은닉층은 입력층과 출력층 사이에 있는 모든 층이다. 출력층에 적용하는 활성화함수는 시그모이드 함수와 소프트맥스 함수로 제한되어 있지만 은닉층의 활성화 함수는 비교적 자유롭다.대표적으로 시그모이드 함수렐루 함수 를 사용한다.

특징

  • 은닉층은 반드시 활성화 함수가 있어야 된다(없을 경우 선형적인 사슬이나 다름없기 때문에 수행 역할이 없는 셈이다. (선형 계산을 적당하게 비선형적으로 비틀어 주어야 한다)
  • 은닉층은 적어도 출력층의 뉴런보다는 많게 만들어야 한다. (출력층 개수보다 적다면 부족한 정보가 전달될 것)
dense1 = keras.layers.Dense(100, activation='sigmoid', input_shape=(784,)) #은닉층
dense2 = keras.layers.Dense(10, activation='softmax') #출력층

2. 심층 신경망 만들기
여러 가지의 dense를 Sequential 클래스에 추가해 심층 신경망을 만들어 볼 것. 인공 신경망의 성능은 층을 추가하여 입력 데이터에 대해 연속적인 학습을 진행하는 능력에서 나온다.

odel: "sequential_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃ Layer (type)                         ┃ Output Shape                ┃         Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩
│ dense_2 (Dense)(None, 100)78,500 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense_3 (Dense)(None, 10)1,010 │
└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
 Total params: 79,510 (310.59 KB)
 Trainable params: 79,510 (310.59 KB)
 Non-trainable params: 0 (0.00 B)
  • Output Shape

출력크기를 보면 (None, 100). 샘플 개수가 아직 정의되어 있지 않기 때문에 None이다. 미니배치 경사 하강법을 사용해 데이터를 한 번에 모두 사용하지 않고 잘게 나누어 여러 번에 걸쳐 경사 하강법 단계를 수행한다.

  • Param

가중치와 절편의 개수를 더해서 Param의 개수 출력

100개의 은닉층 뉴런과 10개의 출력층 뉴런이 모두 연결된다면
100*10개의 가중치 + 10개의 절편

3. 층을 추가하는 다른 방법

  • dense 객체를 따로 저장하여 쓸 일이 없기 때문에 Sequential 클래스 안에서 바로 Dense 클래스의 객체를 만드는 경우가 많다
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'))

4. 렐루 함수

시그모이드 함수는 올바른 출력을 만드는데 신속하게 대응하지 못하고, 심층 신경망일수록 그 효과가 누적되어 학습을 더 어렵게 만든다. 이를 개선하기 위해 렐루 함수 활성화 함수가 제안되었다.

렐루 함수
입력이 양수일 경우 마치 활성화 함수가 없는 것처럼 그냥 입력을 통과시키고 음수일 경우에는 0으로 만든다.


  • Flatten 층

케라스에만 있는 유틸리티로배치 차원을 제외하고 나머지 입력 차원을 모두 일렬로 펼치는 역할만 수행. 인공신경망의 성능을 위해 기여하는 바는 없기 때문에 깊이에 포함시키지는 않지만 입력층과 은닉층 사이에 추가하기 때문에 이를 층이라 부름.

model = keras.Sequential()
model.add(keras.layers.Flatten(input_shape=(28, 28)))
model.add(keras.layers.Dense(100, activation='relu'))

5. 옵티마이저

케라스는 다양한 종류의 경사하강법 알고리즘을 제공한다. 이들을 옵티마이저라고 부른다. 대표적으로는 SGD(확률적 경사 하강법)이다.

외에도 다양한 옵티마이저들이 있다.

적응적 학습률
한번에 빠르게 하강할 경우 최적화 값을 놓칠수도 있기 때문에 꼭대기에서는 빠르게 하강하고 최적점에 갈 수록 천천히 접근해야 한다. 즉, 모델이 최적점에 가까이 갈수록 학습률을 낮춰 안정적으로 최적점에 수렴하도록 하는 학습률을 적응적 학습률이다.
(적응적 학습률을 사용하는 3개의 클래스는 learning_rate 매개변수의 기본값으로 모두 0.001을 사용한다.

  • Adam 클래스를 사용한 예제
model.compile(optimizer='adam', loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])
model.fit(train_scaled, train_target, epochs=5)

[참고]
교재에서는 metrics='accuracy' 라 작성해놓았지만 케라스 내 변경으로 인해
list.tuple.dict라는 에러가 발생한다. (['accuracy'])로 변경해 리스트 형태로 입력해주어야 한다.

profile
for well-being we need nectar and ambrosia

0개의 댓글