Chapter 7 : 딥러닝을 시작합니다 - 패션 럭키백을 판매합니다!
7-1 인공 신경망
<패션 MNIST>
패션 MNIST ? 크기, 개수가 동일하지만 숫자 대신 패션 아이템으로 이루어진 데이터
- 텐서플로에서 해당 데이터를 불러올 수 있음
↓ 패션 MNIST 데이터 준비하기 코드
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)
# (60000, 28, 28) (60000,)
: 훈련 데이터는 6만개의 이미지로 이루어져 있으며, 각 이미지는 28 X 28 크기
타깃 데이터는 6만개의 원소가 있는 1차원 배열
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)])
# [9, 0, 0, 3, 0, 2, 7, 2, 5, 5]
import numpy as np
print(np.unique(train_target, return_counts=True))
# (array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8), array([6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000]))
각 레이블에 6000개의 샘플이 들어 있음
<로지스틱 회귀로 패션 아이템 분류하기>
6만개의 샘플이므로, 전체 데이터를 한꺼번에 사용하여 모델을 훈련하는 것보다
샘플을 하나씩 꺼내서 모델을 훈련하는 것이 좋음
=> 확률적 경사 하강법 사용하면 되겠다~!
↓ 로지스틱 회귀로 패션 아이템 분류하기 코드
# 1차원 배열로 만들어줌
train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28*28)
from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier
sc = SGDClassifier(loss='log_loss', max_iter=5, random_state=42)
scores = cross_validate(sc, train_scaled, train_target, n_jobs=-1)
print(np.mean(scores['test_score'])) # 0.8196000000000001
로지스틱 회귀 공식에 MNIST 데이터에 맞게 변형
<방법!!>
첫 번째 픽셀1이 w1과 곱해져서 z_티셔츠에 더해짐
두 번째 픽셀2가 w2와 곱해져서 z_티셔츠에 더해짐
.
.
마지막 픽셀784가 w784와 곱해져서 z_티셔츠에 더해짐
절편 b 더함
z_바지도 똑같은 방식이 적용됨!!
<인공 신경망>
입력층(input layer) ? x1 ~ x784
- 픽셀값 자체이고 특별한 계산을 수행하지 않음
출력층(output layer) ? z1~z10을 계산하고 이를 바탕으로 클래스를 예측하기 때문에 신경망의 최종 값을 만든다는 의미
뉴런(neuron) ? 인공 신경망에서 z 값을 계산하는 단위
- 유닛(unit)이라고 칭함
텐서플로(tensorflow) ? 구글이 2015년 11월 오픈소스로 공개한 딥러닝 라이브러리
- 저수준 API : 케라스(Keras)
- 고수준 API : 프랑소와 숄레(Francois Chollet)
딥러닝 라이브러리는 그래픽 처리 장치인 GPU를 사용하여 인공 신경망을 훈련함
- 케라스는 GPU 연산 대시 이를 수행하는 다른 라이브러리를 백엔드(Backend)로 사용함
- 이외에도 다른 딥러닝 라이브러리를 케라스 백엔드로 사용하는데, 이를 멀티-백엔드 케라스라고 부름
<인공 신경망으로 모델 만들기>
인공 신경망에서는 모델을 평가할 때 교차 검증을 잘 사용하지 않고 검증 세트를 별도로 덜어내어 사용함
- 이유 1 : 딥러닝 분야의 데이터셋은 충분히 크기 때문에 검증 점수가 안정적임
- 이유 2 : 교차 검증을 수행하기에는 훈련 시간이 너무 오래 걸림
↓ 인공 신경망으로 모델 만들기 코드
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) # (48000, 784) (48000,)
print(val_scaled.shape, val_target.shape) # (12000, 784) (12000,)
밀집층(dense layer) ? 입력층과 출력층 사이에 위치한 여러 개의 연결된 선이 있는 층
- 양쪽의 뉴런이 모두 연결하고 있기 때문에 완전 연결층(fully connected layer) 이라고도 부름
↓ 밀집층 만들기
# 케라스의 Dense 클래스를 사용해 밀집층 만들기
dense = keras.layers.Dense(10, activation='softmax', input_shape=(784,))
10 : 뉴런 개수
activation : 뉴런의 출력에 적용할 함수
input_shape : 입력의 크기
# 신경망 모델 만들기 - 케라스의 Sequential 클래스 사용
model = keras.Sequential(dense)
활성화 함수(activation function) ? 소프트맥스와 같이 뉴런의 선형 방정식 계산 결과에 적용되는 함수
<인공 신경망으로 패션 아이템 분류하기>
keras 모델의 경우, 훈련하기 전에 설정 단계가 존재함
-> model 객체의 compile() 메서드에서 수행
※ 반드시 손실 함수의 종류를 지정해줘야 함!! ※
- 다중 분류에서는 크로스 엔트로피 함수를 사용함
- 이진 분류 : loss = 'binary_crossentropy'
- 다중 분류 : loss = 'categorical_crossentropy'
다중 분류의 경우, 각 클래스에 대한 확률이 모두 출력되기 때문에
타깃에 해당하는 확률만 남겨 놓기 위해서 나머지 확률에는 0을 곱함
ex) 티셔츠일 확률을 구하려면 티셔츠의 확률을 제외한 나머지 확률에는 0을 곱함
=> 신경망은 티셔츠 샘플에서 손실을 낮추려면
첫 번째 뉴런의 활성화 출력 a1의 값을 가능한 1에 가깝게 만들어야 함
이와 같이 타깃값을 해당 클래스만 1이고 나머지는 모두 0인 배열로 만드는 것 => 원-핫 인코딩(one-hot encoding)
해당 데이터의 타깃값은 모두 정수
BUT! 텐서플로에서는 정수로 된 타깃값을 원-핫 인코딩으로 바꾸지 않고 사용 가능
=> sparse_categorical_crossentropy에서 가능!!!
케라스는 모델이 훈련할 때 기본으로 에포크마다 손실 값을 출력 (with 정확도)
=> metrics = 'accuracy' 사용 -> 정확도 지표 확인
- 모델 훈련은 사이킷런처럼 fit() 메서드를 사용
+ 에포크 횟수를 epochs로 지정
- 모델 성능 평가는 evaluate() 메서드를 사용
↓ 모델 훈련 코드
model.fit(train_scaled, train_target, epochs=5)
'''
Epoch 1/5
1500/1500 ━━━━━━━━━━━━━━━━━━━━ 3s 1ms/step - accuracy: 0.7381 - loss: 0.7783
Epoch 2/5
1500/1500 ━━━━━━━━━━━━━━━━━━━━ 2s 1ms/step - accuracy: 0.8381 - loss: 0.4811
Epoch 3/5
1500/1500 ━━━━━━━━━━━━━━━━━━━━ 3s 1ms/step - accuracy: 0.8469 - loss: 0.4530
Epoch 4/5
1500/1500 ━━━━━━━━━━━━━━━━━━━━ 3s 1ms/step - accuracy: 0.8533 - loss: 0.4351
Epoch 5/5
1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 2ms/step - accuracy: 0.8571 - loss: 0.4219
<keras.src.callbacks.history.History at 0x7ab6de73fca0>
'''
정확도 약 85%
model.evaluate(val_scaled, val_target)
'''
375/375 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - accuracy: 0.8487 - loss: 0.4370
[0.4449218809604645, 0.8484166860580444]
'''
기본 숙제(필수): Ch.07(07-1) 확인 문제 풀고, 풀이 과정 정리하기
1. 어떤 인공 신경망의 입력 특성이 100개이고 밀집층에 있는 뉴런 개수가 10개일 때 필요한 모델 파라미터의 개수는 몇 개일까요?
A. 1010개
풀이 : 밀집층에 있는 10개의 뉴런이 100개의 입력 특성과 연결되면 1000개의 가충치가 있는 것임, 여기에서 뉴런 개수만큼 bias가 더해지므로 1010개
2. 케라스의 Dense 클래스를 사용해 신경망의 출력층을 만들려고 합니다. 이 신경망이 이진 분류 모델이라면 activation 매개변수에 어떤 활성화 함수를 지정해야 하나요?
A. 'softmax'
풀이 : 이진분류 모델에서는 sigmoid 함수를, 다중 분류 모델에서는 softmax 함수를 활성화 함수로 사용함
3. 케라스 모델에서 손실 함수와 측정 지표 등을 지정하는 메서드는 무엇인가요?
A. compile()
풀이 : compile() 메서드 내에 있는 loss, metrics 매개변수를 통해 손실 함수와 측정 지표 등을 지정할 수 있음
4. 정수 레이블을 타깃으로 가지는 다중 분류 문제일 때 케라스 모델의 compile() 메서드에 지정할 손실 함수로 적절한 것은 무엇인가요?
A. 'sparse_categorical_crossentropy'
풀이 : 텐서플로에서는 sparse_categorical_crossentropy을 통해 정수로 된 타깃값을 원-핫 인코딩으로 바꾸지 않고 사용 가능
7-2 심층 신경망
추가 숙제(선택): Ch.07(07-2) 확인 문제 풀고, 풀이 과정 정리하기
1. 다음 중 모델의 add() 메서드 사용법이 올바른 것은 어떤 것인가요?
A. model.add(keras.layers.Dense(10, activation='relu'))
풀이 : 모델의 add() 메서드는 layers의 객체를 전달해야 함
2. 크기가 300 X 300인 입력을 케라스 층으로 펼치려고 합니다. 다음 중 어떤 층을 사용해야 하나요?
A. Flatten
풀이 : Flatten은 다차원의 입력 데이터를 1차원으로 만들어 줌
3. 다음 중에서 이미지 분류를 위한 심층 신경망에 널리 사용되는 케라스의 활성화 함수는 무엇인가요?
A. relu
풀이 : relu는 이미지 처리 작업에 널리 사용되는 활성화 함수로, 입력값이 0보다 작으면 0을 출력하고, 양수의 경우 입력값을 그대로 출력함
4. 다음 중 적응적 학습률을 사용하지 않는 옵티마이저는 무엇인가요?
A. SGD
풀이 : Adagrad, RMSprop, Adam은 적응적 학습률을 사용하는 옵티마이저이며, SGD는 일정한 학습률을 사용함
'혼공머신' 카테고리의 다른 글
[혼공머신] 5주차 : ch6) 비지도 학습 (0) | 2024.08.11 |
---|---|
[혼공머신] 4주차 : ch5) 트리 알고리즘 (0) | 2024.07.28 |
[혼공머신] 3주차 : ch4 (0) | 2024.07.21 |
[혼공머신] 2주차 : ch3 (11) | 2024.07.14 |
[혼공머신] 1주차 : ch1, ch2 (0) | 2024.07.06 |