본문 바로가기

ML,DL

[DL] 인공 신경망 - 단일 신경망

  • Dense 층을 구성, 입력데이터모양, 활성화 함수, 출력뉴런의 개수
  • Sequence로 층을 연결
    • model = keras, Sequencial(dense)
  • compile : 손실함수, 평가방법
    • model.compile(loss= , metrics='acc')
  • 학습 : fit, 에포크수
    • model.fit(x,y,epochs=50, validation_data=(XX_val, yy_val))

1. 딥러닝으로 패션 데이터 분류하기

keras.datasets를 통해 패션 데이터를 불러온다.

from tensorflow import keras
(X_train, y_train),(X_test, y_test) = keras.datasets.fashion_mnist.load_data()

이 데이터는 이미지 데이터들이다. 

시각화

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

Scaling

X_train_scaled = X_train / 255.0
X_train_scaled = X_train_scaled.reshape(-1, 28*28)
X_test_scaled = (X_test / 255.0).reshape(-1,28*28)
print(X_train_scaled.shape)

패션 MNIST의 경우 각 픽셀은 0~255 사이의 정숫값을 가진다. 따라서 255로 나누어 0~1 사이의 값으로 정규화한다.

reshape() 메서드를 사용해 2차원 배열인 각 샘플을 1차원 배열로 펼친다.

SGDClassifier는 2차원 입력을 다루지 못한다.

SGDClassifier

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, X_train_scaled, y_train, n_jobs=-1)
print(np.mean(scores['test_score']))

cross_validate 함수를 사용해 이 데이터에서 교차 검증으로 성능을 확인해본다.

인공신경망

1) 훈련 세트, 검증 세트로 데이터 분리하기

from sklearn.model_selection import train_test_split
XX_train, XX_val, yy_train, yy_val = train_test_split(X_train_scaled, y_train, stratify=y_train, random_state=42)

2) dense, sequential

케라스의 레이어 패키지 안에는 다양한 층이 있는데, 가장 기본이 되는 층 : 밀집층

dense = keras.layers.Dense(10, activation='softmax', input_shape= (XX_train.shape[1],))
model = keras.Sequential(dense)

Dense(뉴런 개수, 뉴런의 출력에 적용할 함수, 입력의 크기)

10개의 패션 아이템을 분류하기 때문에 첫 번재 매개변수로 뉴런 개수 = 10으로 지정

10개의 뉴런에서 출력되는 값을 확률로 바꾸기 위해서 소프트맥스 함수 사용

  • 만약 2개의 클래스를 분류하는 이진 분류라면 : 시그모이드 함수 

keras.Sequential(dense)

Sequential 클래스의 객체를 만들 때 밀집층의 객체 dense 전달

3) compile

# 이진분류 binary_crossentropy
# 다중분류 categorical_crossentropy --> 레이블이 one hot으로 처리되었을 때
# 다중분류 sparse_categorical_crossentropy --> 레이블이 one hot으로 처리되지 않았을 때
model.compile(loss = 'sparse_categorical_crossentropy',metrics='acc') # acc -> accuracy

꼭 손실 함수의 종류를 지정해줘야 한다.

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

다중 분류에서 크로스 엔트로피 손실 함수를 사용하려면 원-핫 인코딩으로 변환 필요

텐서플로에서는 정수로 된 타깃값을 원-핫 인코딩으로 바꾸지 않고 그냥 사용 가능

-> sparse_categorical_crossentropy

4) fit, evaluate

model.fit(XX_train, yy_train, epochs=10,validation_data= (XX_val, yy_val))
model.evaluate(X_test_scaled, y_test)

2. iris 데이터 분류하기

from sklearn.datasets import load_iris
data = load_iris()
X = data.data
y = data.target
np.unique(y,return_counts=True)
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
plt.scatter(X_pca[:,0],X_pca[:,1],c=y)
plt.show()

from tensorflow.keras.layers import Dense
from tensorflow.keras import Sequential
from tensorflow import keras

X_train, X_test, y_train, y_test = train_test_split(X,y,stratify=y, random_state=42)

dense = Dense(3, activation='softmax', input_shape= (4,))
model = Sequential(dense)

model.compile(loss = keras.losses.sparse_categorical_crossentropy ,metrics='acc') # acc -> accuracy
model.fit(X_train, y_train, validation_split=0.2,epochs=100)

model.evaluate(X_test, y_test)