7. 딥러닝¶
데이터 준비하기: 패션 MNIST
In [1]:
from tensorflow import keras
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
29515/29515 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26421880/26421880 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
5148/5148 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4422102/4422102 [==============================] - 0s 0us/step
In [2]:
# 데이터의 크기
# 60000개의 샘플, 각 샘플은 28*28
print(train_input.shape, train_target.shape)
# 10000개의 샘플, 각 샘플은 28*28
print(test_input.shape, test_target.shape)
(60000, 28, 28) (60000,)
(10000, 28, 28) (10000,)
In [3]:
# 샘플 확인하기
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()
In [4]:
# 타깃값은?
print([train_target[i] for i in range(10)])
[9, 0, 0, 3, 0, 2, 7, 2, 5, 5]
In [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]))
7-1. 인공 신경망¶
아는 것: 로지스틱 회귀로 패션 아이템 분류하기¶
- SGDClassifier 확률적 경사 하강법
- 샘플 일부를 꺼내서 학습시키기
In [6]:
# 데이터 전처리하기
# 0~255 정숫값인 데이터를 0~1로 정규화
train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28*28) # 샘플을 1차원 배열로 변환
print(train_scaled.shape)
(60000, 784)
In [7]:
# 교차 검증하기
# SGD Classifier 원리는 잘 모름 -> 밑바닥부터 시작하는 딥러닝으로 메꾸기
from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier
sc = SGDClassifier(loss="log", 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
인공 신경망 ANN Artificial Neural Network
- 입력층 input layer: 위 사례에서는 픽셀값 그 자체, x1, x2, ..., xn에 해당
- 출력층 output layer: 계산 끝에 도출된 값. 출력층을 바탕으로 신경망의 최종 값을 도출해낸다. z1, z2, ..., zn에 해당
- 뉴런/유닛 unit: z를 계산하는 단위
- ANN: 가장 간단한(hidden layer가 없는) 인공 신경망은 로지스틱 회귀와 같다
- 매컬러-피츠 뉴런
- 인공 신경망은 기존의 알고리즘보다 높은 성능을 발휘하는 새로운 종류의 머신러닝 알고리즘일 뿐임.
- 딥러닝은 DNN deep neural network, 역시 머신러닝 알고리즘 중 하나
텐서플로와 케라스
- 텐서플로 tensorflow: 구글이 개발한 딥러닝 라이브러리(2015.11)
- 저수준 API와 고수준 API로 나뉨
- 케라스 keras가 텐서플로의 고수준 API
In [8]:
from tensorflow import keras
인공신경망으로 모델 만들기
- 인공 신경망에서는 교차 검증을 사용하지 않고 검증 세트를 별도로 덜어낸다
- 이유 1. 데이터셋이 이미 충분히 큼
- 이유 2. 교차 검증을 여러 번 하기에는 훈련 시간이 너무 오래 걸림
In [9]:
# 검증 데이터셋 덜어내기
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
)
In [10]:
print(train_scaled.shape, train_target.shape)
print(val_scaled.shape, val_target.shape)
(48000, 784) (48000,)
(12000, 784) (12000,)
- keras.layers에는 다양한 층 준비됨
- 가장 기본은 dense layer: 왼쪽의 입력층(784개 픽셀값)과 오른쪽의 출력층(10개의 유닛)은 모두가 모두와 연결되어있다
- 이를 fully connected layer라고 함
In [11]:
# keras.layers.Dense(뉴련 개수, 활성화 함수, 입력층 크기)
dense = keras.layers.Dense(10, activation="softmax", input_shape=(784,))
In [13]:
# 각 층마다 선형 계산(가중치, 절편) 수행
model = keras.Sequential(dense)
인공 신경망으로 패션 아이템 분류하기
- 다중 클래스 분류를 위해 사용되는 손실 함수
-
- categorical crossentropy: 훈련 데이터를 원핫 인코딩으로 처리한 경우
-
- sparse categorical crossentropy: 훈련 데이터를 int(1~9)로 처리한 경우
- cf) 원-핫 인코딩: 해당 정수 위치만 1이고, 나머지는 0으로 변환하는 것
In [16]:
# 손실 함수 지정하기
model.compile(loss="sparse_categorical_crossentropy", metrics="accuracy")
In [14]:
print(train_target[:10])
[7 3 5 8 6 9 3 3 9 9]
In [17]:
model.fit(train_scaled, train_target, epochs=5)
Epoch 1/5
1500/1500 [==============================] - 7s 2ms/step - loss: 0.6061 - accuracy: 0.7934
Epoch 2/5
1500/1500 [==============================] - 4s 3ms/step - loss: 0.4747 - accuracy: 0.8393
Epoch 3/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4500 - accuracy: 0.8476
Epoch 4/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4365 - accuracy: 0.8535
Epoch 5/5
1500/1500 [==============================] - 3s 2ms/step - loss: 0.4288 - accuracy: 0.8547
Out[17]:
<keras.callbacks.History at 0x7fb5bd9e3f70>
In [18]:
model.evaluate(val_scaled, val_target)
375/375 [==============================] - 1s 2ms/step - loss: 0.4395 - accuracy: 0.8513
Out[18]:
[0.439459890127182, 0.8513333201408386]
7-2. 심층 신경망¶
In [ ]:
7-3. 신경망 모델 훈련¶
In [ ]:
'Data Science > AI' 카테고리의 다른 글
[에러 해결] RuntimeError: You must compile your model before training/testing. Use `model.compile(optimizer, loss)`. 해결하기 (0) | 2023.03.09 |
---|---|
인공지능 #7-2 | 심층 신경망 DNN, ReLU, 옵티마이저 (0) | 2023.03.08 |
인공지능 #6-3 | 비지도학습 - 차원 축소, PCA(주성분 분석) (0) | 2023.03.07 |
인공지능 #6-2 | 비지도학습 - K Means 알고리즘, 센트로이드, 엘보우 방법 (0) | 2023.03.07 |
인공지능 #6-1 | 비지도학습 - 클러스터링, 히스토그림 (0) | 2023.03.07 |