Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

kang's study

15일차 : 인공신경망 ANN, Artificial neural network 본문

[학습 공간]/[혼공머신러닝]

15일차 : 인공신경망 ANN, Artificial neural network

보끔밥0302 2022. 3. 3. 06:57

인공 신경망 데이터 이해

패션 MNIST
In [3]:
from tensorflow import keras

(train_input, train_target), (test_input, test_target) = \
keras.datasets.fashion_mnist.load_data()
 
훈련데이터 크기
In [4]:
print(train_input.shape, train_target.shape) 
# 6만개의 샘플과 28픽셀*28픽셀로 구성된 3차원 데이터, 흑백이미지
# 타겟은 0~9까지의 10개의 클래스로 숫자를 표현
 
(60000, 28, 28) (60000,)

 

            테스트데이터 크기

 

In [5]:
print(test_input.shape, test_target.shape)
 
(10000, 28, 28) (10000,)
 

입력과 타깃 샘플

In [6]:
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 [7]:
print([train_target[i] for i in range(10)])
 
[9, 0, 0, 3, 0, 2, 7, 2, 5, 5]
In [8]:
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],
      dtype=int64))

로지스틱 회귀로 분류

 

 

 
정규화
In [9]:
train_scaled = train_input / 255.0 # 이미지 데이터
 
분석을 위한 배열로 변환
In [10]:
train_scaled = train_scaled.reshape(-1, 28*28) 
# 3차원 데이터를 1차원으로 펼침
In [11]:
print(train_scaled.shape)
 
(60000, 784)
In [12]:
from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier

sc = SGDClassifier(loss='log', max_iter=5, random_state=42) # 5-fold
# 다중분류인데 왜 log인가 
# 사이킷런에는 crossentropy 기능이 없다
# 사이킷런은 10개(속성)의 이진분류를 수행한다.
# 10개의 z값 softmax로 확률로 바꾼다

scores = cross_validate(sc, train_scaled, train_target, n_jobs=-1)
print(np.mean(scores['test_score'])) #훈련데이터만 주었으므로 검증변수로 이해하자
 
0.8192833333333333
 

각 클래스인 픽셀784개와 곱하는 가중치와 절편은 구해지는 클래스마다 다르게 계산된다.
10개의 클래스에 대한 선형 방정식을 모두 계산한 다음에 소프트맥스 함수를 통과하여 각 클래스에 대한 확률을 얻는다.

 

인공신경망

 
출력층 : 신경망의 최종값
뉴런 / 유닛 : Z값을 계산하는 단위
입력층 : 각 픽셀의 값 자체, 계산을 수행하지 않는다.

 

 

 

 

텐서플로와 케라스

In [13]:
import tensorflow as tf
In [14]:
from tensorflow import keras
 

케라스 모델

데이터가 많아 검증 안정, 계산비용이 많이 든다. 그래서 교차검증을 사용하지 않는다.
검증데이터만 따로 떼어놓고 사용한다.
In [15]:
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 [16]:
print(train_scaled.shape, train_target.shape)
 
(48000, 784) (48000,)
In [17]:
print(val_scaled.shape, val_target.shape)
 
(12000, 784) (12000,)
In [18]:
dense = keras.layers.Dense(10, activation='softmax', input_shape=(784,)) 
# 가장 기본이 되는 층
# 밀집층, 완전연결층(fully connected layer)
# 10개의 뉴런(출력층 유닛) 항상 클래스의 개수와 같다(분류)
# 다중 분류이므로 softmax를 사용한다. 이진분류이면 sigmoid
# 첫번째 모델에 추가되는 층에는 인풋shape을 지정해야한다.= 샘플하나의 크기
In [19]:
model = keras.Sequential(dense) # 모델의 출력층을 넣어준다
 

훈련 전 모델 설정

손실함수 지정과 계산하고자 하는 측정값 지정
 

이진분류 : loss = 'binary_crossentropy'
다중분류 : loss = 'categorical_crossentropy'

In [20]:
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy') 
 
원-핫 인코딩 : 타깃값을 해당 클래스만 1이고 나머지는 모두 0인 배열로 만드는 것
타깃값이 정수에 샘플의 확률을 로그취한 값을 곱하여 one-hot encoding
타깃에 해당하는 뉴런만 손실에 반영해야한다.
다중 분류에서 손실 함수를 사용하려면 정수로 된 타깃값을 원-핫인코딩 해야한다.
텐서플로 기능으로 정수로된 타깃값을 사용해 크로스 엔트로피 손실을 계산함 'sparse_categorical_crossentropy'
타깃값을 정수로 준비하였기에 sparse_를 붙여준다.
In [21]:
print(train_target[:10])
 
[7 3 5 8 6 9 3 3 9 9]
In [22]:
model.fit(train_scaled, train_target, epochs=5)
 
Epoch 1/5
1500/1500 [==============================] - 2s 938us/step - loss: 0.6060 - accuracy: 0.7947
Epoch 2/5
1500/1500 [==============================] - 1s 925us/step - loss: 0.4774 - accuracy: 0.8399
Epoch 3/5
1500/1500 [==============================] - 1s 923us/step - loss: 0.4561 - accuracy: 0.8475
Epoch 4/5
1500/1500 [==============================] - 1s 920us/step - loss: 0.4442 - accuracy: 0.8518
Epoch 5/5
1500/1500 [==============================] - 1s 923us/step - loss: 0.4372 - accuracy: 0.8553
Out[22]:
<keras.callbacks.History at 0x2f22e2a3c10>
In [23]:
model.evaluate(val_scaled, val_target)
 
375/375 [==============================] - 0s 780us/step - loss: 0.4504 - accuracy: 0.8497
Out[23]:
[0.4503522515296936, 0.8497499823570251]

 

출처 : 박해선, 『혼자공부하는머신러닝+딥러닝』, 한빛미디어(2021), p340-363

'[학습 공간] > [혼공머신러닝]' 카테고리의 다른 글

17일차 : 신경망 모델  (0) 2022.03.03
16일차 : 심층 신경망  (0) 2022.03.03
14일차 : 차원축소  (0) 2022.03.03
13일차 : k-평균  (0) 2022.03.03
12일차 : 군집 알고리즘  (0) 2022.03.03
Comments