AI/혼자 공부하는 머신러닝+딥러닝 책

챕터 07 - 2

codehunter 2023. 8. 19. 14:55

앞 챕터에서 사용한 인공 신경망은 사실 층이 1개짜리인데도 불구하고 로지스틱 회귀보다 높은 성능을 보여줬다.

 

이 인공 신경망은 층을 더 추가해서 성능을 높일수 있는데 그걸 알아보자.

 

역시 패션 데이터를 불러와서 테스트세트와 검증세트를 분리하는것까지 수행하자.

이제 전 챕터에서 만든 모델에서 중간에 밀집층이 추가한다. 이렇게 입력층과 출력층 사이에 있는 모든 층을 은닉층이라고 부른다.

 

그런데 은닉층에는 활성화 함수가 포함되는데 왜냐하면 은닉층에서 선형적인 산술 계산만 수행한다면 수행 역할이 없는 셈이라서 선형 계산을 적당하게 비선형적으로 비틀어 주어야 하는데 이 역활을 활성화 함수가 수행한다. 많이 사용하는 활성화 함수 중 하나는 시그모이드이다.

 

그럼 시그모이드 활성화 함수를 사용한 은닉층과 소프트맥스 함수를 사용한 출력층을 케라스의 Dense 클래스로 만들어보자.

앞에서 만든 dense1, dense2를 Sequential 클래스에 추가하여 심층 신경망을 만들었다.

케라스의 summary() 메서드를 호출해서 층에 대한 유용한 정보를 얻을 수 있다.

 

맨 첫 줄에 모덜의 이름이 나오고  그다음 이 모델에 들어 있는 층이 순서대로 나열된다. 

층마다 층 이름, 클래스, 출력 크기, 모델 파라미터 개수가 출력된다. 

 

Output Shape에 있는 첫번째 출력 크기를 보면(None, 100)으로 표시된다. 첫 번째 차원은 샘플의 개수를 나타낸다. 첫번째 dense 는 샘플 개수가 아직 정의되어 있지 않기 때문에 None이다.

두 번재 100은 출력 갯수이다. 샘플마다 784개의 픽셀값이 은닉층을 통과하면서 100개의 특성으로 압축된다.

 

두 번째 출력 크기를 보면 (None, 10) 으로 나오는데 역시 배치 차원은 None이고 출력 뉴런 개수가 10개 이기 때문이다.

 

이렇게 summary()는 전체적인 정보를 적절하게 출력하는걸 알 수있다.

더 진행하기 전에 층을 추가하는 다른 방법을 알아보자.

이렇게 Sequential 에 한번에 추가하는 방법도 있지만 아주 많은 층을 추가하려면 클래스 생성자가 매우 길어질수 있다.

그래서 널리 사용하는 방법이 add 이다.

이제 Sequential 에 데이터를 추가하는 여러가지 방법은 여기서 정리하고 모델을 훈련해보자.

정확도를 보면 전 챕터보다 추가된 층으로 인해 성능이 향상되었다는것을 알 수 있다. 

 

다음에는 이미지 분류 문제에서 높은 성능을 낼 수 있는 활성화 함수에 대해 알아보자. 

 

렐루 함수

초창기 인공 신경망의 은닉층에 많이 사용된 활성화 함수는 시그모이드였는데 올바른 출력을 만드는데 신속하게 대응하지 못하는 단점이 있다. 이를 개선하기 위해 여러 종류의 활성화 함수가 제안되었는데 그중에 렐루 라는 함수가 있다. 렐루 함수는 특히 이미지 처리에 좋은 성능을 낸다고 알려져 있다고 함.

 

렐루함수를 사용하기 전에 케라스에서 제공하는 편리한 층 하나를 더 살펴보면 

패션 데이터를 인공 신경망에 주입하기 위해 넘파이 배열의 reshape() 메서드를 사용해 1차원으로 펼쳤다. 이렇게 직접 1차원으로 펼치지 말고 케라스에서 이를 위해 Flatten 층을 제공한다.

Flatten 클래스는 배치 차원을 제외하고 나머지 입력 차원을 모두 일렬로 펼치는 역할만 한다. 인공 신경망의 성능을 위해 기여하는 바는 없다. 하지만 입력층과 은닉층 사이에 추가하기 때문에 이를 층이라 부른다.

위 소스가 Flatten층을 추가한 모델의 요약정보이다.

 

그럼 훈련 데이터를 다시 준비해서 모델을 훈련해보자.

시그모이드와 비교하면 성능이 조금 향상된걸 볼수 있다. 검증 세트도 마찬가지로 점수가 조금 높아진걸 확인할수 있다.

 

지금까지는 훈련시 에포크를 5번만 훈련했는데 좋은 점수를 위해서 더 훈련할수도 있고 다른 옵션값을 조정해 볼수도 있는데 이 챕터를 마무리하기전에 다른 옵션에 대해 알아보자.

 

위에서 모델 compile시에 케라스의 기본 경사 하강법 알고리즘이 RMSprop을 사용했는데 케라스는 다양한 경사 하강법 알고리즘을 제공한다. SGD, Adam등이 있는데 Adam 으로 옵티마이저값을 주고 훈련해보자.

기본 RMSprop을 사용했을 때와 거의 같은 성능을 보여주는걸 볼수있다.

 

참고코드

from tensorflow import keras
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()

print(train_input.shape, train_target.shape)

import matplotlib.pyplot as plt
fig, axs = plt.subplots(1, 10, figsize=(10,10))
for i in range(10):
  axs[i].imshow(train_input[i], cmap='gray_r')
  axs[i].axis('off')
plt.show()

print([train_target[i] for i in range(10)])

import numpy as np
print(np.unique(train_target, return_counts=True))

train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28 * 28)

print(train_scaled.shape)

from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier
sc = SGDClassifier(loss='log', max_iter=20, random_state=42)
scores = cross_validate(sc, train_scaled, train_target, n_jobs=-1)
print(np.mean(scores['test_score']))

## 인공신경망

import tensorflow as tf
#print(tf.__version__)

from tensorflow import keras
#print(keras.__version__)

from sklearn.model_selection import train_test_split
train_scaled, val_scaled, train_target, val_target = train_test_split(
    train_scaled, train_target, test_size=0.2, random_state=42 )

print(train_scaled.shape, train_target.shape)

print(val_scaled.shape, val_target.shape)

dense = keras.layers.Dense(10, activation='softmax', input_shape=(784, ))

model = keras.Sequential(dense)

## 인공 신경망으로 패션 아이템 분류하기

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')

print(train_target[:10])

model.fit(train_scaled, train_target, epochs=5)

model.evaluate(val_scaled, val_target)

 

확인문제

1. 다음 중 모델의 add() 메서드 사용법이 올바른 것은 어떤 것인가요?

1-1. model.add(keras.layers.Dense)

1-2. model.add(keras.layers.Dense(10, activation='relu'))

1-3. model.add(keras.layers.Dense, 10, activation='relu')

1-4. model.add(keras.layers.Dense) (10, activation='relu')

 

풀이 1번은 활성화함수가 빠진채 기본 옵션으로 생성, 3번은 매개변수들을 add에 전달, 4번은 문법오류

답 2번

 

2. 크기가 300x300인 입력을 케라스 층으로 펼치려고 합니다. 다음 중 어떤 층을 사용해야 하나요?

2-1. Plate

2-2. Flatten

2-3. Normalize

2-4. Dense

 

풀이 1, 3번 클래스는 없습니다. 4번은 기본적인 밀집층입니다.

답 2번

 

3. 다음 중에서 이미지 분류를 위한 심층 신경망에 널리 사용되는 케라스의 활성화 함수는 무엇인가요?

3-1. linear

3-2. sigmoid

3-3. relu

3-4. tanh

 

풀이 1번은 회귀작업을 위한 신경망의 출력층에 사용, 2번은 초창기 신경망에 사용, 4번은 순환 신경망에 사용

답 3번

 

4. 다음 중 적응적 학습률을 사용하지 않는 옵티마이저는 무엇인가요?

4-1. SGD

4-2. Adagrad

4-3. RMSprop

4-4. Adam

 

풀이 1번은 일정한 학습률을 사용 나머지는 적응적 학습률 옵티마이저

답 1번

 

 

'AI > 혼자 공부하는 머신러닝+딥러닝 책' 카테고리의 다른 글

혼공학습단 10기(혼자 공부하는 머신러닝)를 끝내면서....  (0) 2023.08.23
챕터 07 - 3  (0) 2023.08.19
챕터 07 - 1  (0) 2023.08.11
챕터 06 - 3  (0) 2023.08.05
챕터 06 - 2  (0) 2023.08.04