본문 바로가기
CS(Computer Science)/인공지능

7. 단일층 신경망

by 동욷 2023. 3. 19.

단일층 신경망(Single-layer neural network)

: 하나의 입력층과 하나의 출력층으로 구성된 인공신경망 모델

: 입력 데이터가 입력층으로 들어가면 출력층에서 결과가 출력된다.

: 연결층에는 여러 개의 뉴런이 존재한다.

 

각 뉴런은 입력 데이터와 연결된 가중치(Weight)와 편형(Bias) 값을 가지고 있습니다.

 

입력 데이터는 이 가중치와 편향 값에 따라 출력층으로 전달된다.

 

 

한계점

- XOR 문제와 같은 비선형 분류 문제는 해결할 수 없다 => 다층 신경망, 딥러닝

 

 

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt

cancer = load_breast_cancer()

x = cancer.data
y = cancer.target

x_train, x_test, y_train, y_test = train_test_split(x,y,stratify = y, test_size = 0.2 , random_state = 42)

np.unique(y_train, return_counts=True)

class SingleLayer:
    def __init__(self):
        self.w = None
        self.b = None
        self.losses = []
    def forpass(self, x):
        z = np.sum(x * self.w) + self.b
        return z
    def backprop(self, x, err):
        w_grad = x * err
        b_grad = 1 * err
        return w_grad , b_grad
    def activation(self, z):
        z = np.clip(z,-100,None)
        a = 1 / (1+np.exp(-z))
        return a
    def fit(self, x, y, epochs = 100):
        self.w = np.ones(x.shape[1])
        self.b = 0
        for i in range(epochs):
            loss = 0
            indexes = np.random.permutation(np.arange(len(x)))
            for i in indexes:
                z = self.forpass(x[i])
                a = self.activation(z)
                err = -(y[i]-a)
                w_grad, b_grad = self.backprop(x[i],err)
                self.w -= w_grad
                self.b -= b_grad
                a = np.clip(a,1e-10,1-1e-10)
                loss += -(y[i]*np.log(a)+(1-y[i])*np.log(1-a))
            self.losses.append(loss/len(y))
   
    def predict(self, x):
        z = [self.forpass(x_i) for x_i in x]
        return np.array(z) > 0
   
    def score(self, x, y):
        return np.mean(self.predict(x) == y)

layer = SingleLayer()
layer.fit(x_train, y_train)
layer.score(x_test, y_test)

plt.plot(layer.losses)
plt.show()
           

유방암 데이터를 사용하여 단일층 신경망을 학습하고, 학습과정에서 손실(loss) 값을 계산하여 시각화 하는 코드

=> 결과 그래프는 손실(loss) 값을 도식화 한다.

 

activation(self, z) => 가중치와 편향이 적용된 입력값 `z`를 받아 활성화 함수(시그모이드 함수)를 적용한 값을 반환한다.

z 값이 너무 작으면 np.clip을 사용하여 -100 이하의 값으로 잘라내고, 시그모이드를 적용한 결과를 반환한다.

 

fit(self,x,y,epochs=100) => epochs 수 만큼 반복하면서 데이터를 학습한다.

나머지 과정은 앞서 설명한 로지스틱 회귀와 동일하다.

로그 손실값을 계산하여 self.losses 리스트에 추가한다.

 

score(self,x,y) => 정확도를 계산해준다.

 

손실함수에 대한 도식화

 

 

 

사이킷런의 경사하강법

- 사이킷런에서 제공하는 SGDRegressor , SGDClassifier는 확률적 경사하강법을 기반으로 하는 모델

- 대규모 데이터 셋에 적합이 가능하다

- 규제를 사용하여 다양한 변종 알고리즘을 제공한다.

 

 

728x90