59doit
다층신경망(2) 미니배치 본문
반응형
(2) 미니배치
# 필요한 모듈 및 임포트
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split |
# breast cancer 데이터 활용
cancer = load_breast_cancer() x = cancer.data y = cancer.target x_train_all, x_test, y_train_all, y_test = train_test_split(x, y, stratify=y, test_size=0.2, random_state=42) x_train, x_val, y_train, y_val = train_test_split(x_train_all, y_train_all, stratify=y_train_all, test_size=0.2, random_state=42) |
# 신경망
class MinibatchNetwork(RandomInitNetwork): def __init__(self, units=10, batch_size=32, learning_rate=0.1, l1=0, l2=0): super().__init__(units, learning_rate, l1, l2) self.batch_size = batch_size # 배치 크기 def fit(self, x, y, epochs=100, x_val=None, y_val=None): y_val = y_val.reshape(-1, 1) # 타깃을 열 벡터로 바꿉니다. self.init_weights(x.shape[1]) # 은닉층과 출력층의 가중치를 초기화합니다. np.random.seed(42) # epochs만큼 반복합니다. for i in range(epochs): loss = 0 # 제너레이터 함수에서 반환한 미니배치를 순환합니다. for x_batch, y_batch in self.gen_batch(x, y): y_batch = y_batch.reshape(-1, 1) # 타깃을 열 벡터로 바꿉니다. m = len(x_batch) # 샘플 개수를 저장합니다. a = self.training(x_batch, y_batch, m) # 안전한 로그 계산을 위해 클리핑합니다. a = np.clip(a, 1e-10, 1 - 1e-10) # 로그 손실과 규제 손실을 더하여 리스트에 추가합니다. loss += np.sum(-(y_batch * np.log(a) + (1 - y_batch) * np.log(1 - a))) self.losses.append((loss + self.reg_loss()) / len(x)) # 검증 세트에 대한 손실을 계산합니다. self.update_val_loss(x_val, y_val) # 미니배치 제너레이터 함수 def gen_batch(self, x, y): length = len(x) bins = length // self.batch_size # 미니배치 횟수 if length % self.batch_size: bins += 1 # 나누어 떨어지지 않을 때 indexes = np.random.permutation(np.arange(len(x))) # 인덱스를 섞습니다. x = x[indexes] y = y[indexes] for i in range(bins): start = self.batch_size * i end = self.batch_size * (i + 1) yield x[start:end], y[start:end] # batch_size만큼 슬라이싱하여 반환합니다. |
# 훈련하기
minibatch_net = MinibatchNetwork(l2=0.01, batch_size=32) minibatch_net.fit(x_train_scaled, y_train, x_val=x_val_scaled, y_val=y_val, epochs=500) minibatch_net.score(x_val_scaled, y_val) |
# 0.978021978021978 |
# 시각화
plt.plot(minibatch_net.losses) plt.plot(minibatch_net.val_losses) plt.ylabel('loss') plt.xlabel('iteration') plt.legend(['train_loss', 'val_loss']) plt.show() |
반응형
'인공지능' 카테고리의 다른 글
다중분류 신경망(2) (0) | 2023.01.12 |
---|---|
다중분류 신경망(1) (0) | 2023.01.12 |
다층신경망(1) (3) | 2023.01.11 |
신경망 알고리즘 (7) | 2023.01.10 |
규제적용하기 (1) | 2023.01.10 |
Comments