kang's study
15일차 : 인공신경망 ANN, Artificial neural network 본문
인공 신경망 데이터 이해¶
패션 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개의 클래스로 숫자를 표현
테스트데이터 크기¶
In [5]:
print(test_input.shape, test_target.shape)
입력과 타깃 샘플¶
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)])
In [8]:
import numpy as np
print(np.unique(train_target, return_counts=True)) # 타깃의 분포
정규화¶
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)
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'])) #훈련데이터만 주었으므로 검증변수로 이해하자
각 클래스인 픽셀784개와 곱하는 가중치와 절편은 구해지는 클래스마다 다르게 계산된다.
10개의 클래스에 대한 선형 방정식을 모두 계산한 다음에 소프트맥스 함수를 통과하여 각 클래스에 대한 확률을 얻는다.
인공신경망¶

텐서플로와 케라스¶
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)
In [17]:
print(val_scaled.shape, val_target.shape)
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')
In [21]:
print(train_target[:10])
In [22]:
model.fit(train_scaled, train_target, epochs=5)
Out[22]:
In [23]:
model.evaluate(val_scaled, val_target)
Out[23]:

출처 : 박해선, 『혼자공부하는머신러닝+딥러닝』, 한빛미디어(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