정지홍 2023. 1. 11. 21:58

신경망이란?

-우리 뇌의 뉴런이 구조를 컴퓨터상에서 모방한것으로 여러 층의 뉴런으로 형성된 네트워크 구조이다.

-즉, 컴퓨터상에서 모델링된 신경세포 네트워크이다.

-신경망은 입력층,은닉층,출력층 3개의 층으로 구분한다.

-입력으로부터 은닉 출력까지 순서대로 가는것은 순전파라고 한다.

-위의 과정을 거꾸로 가는 것을 역전파라고 한다.

-딥러닝으로 학습시 처음에는 가중치와 편향을 임의로 설정하고 학습하는 과정에서 이 값들을 변화시킨다.

 

뉴런 모델

-뉴런에는 다수의 입력이 있으며 출력은 하나다.

-각 입력에는 가중치가 곱해지며 이 값에 편향이라는 상수를 더한다. 다시 이 값을 활성화 함수에 의해 처리되어 출력된다.

-가중치가 클수록 많은 정보가 전달된다.

-이전층의 뉴런이 m개, 다음층의 뉴런이 n개이면 두 층 사이에는 mxn개의 가중치가 있다.

-편향은 뉴런의 감도를 나타낸다.

-하나의 뉴런에서 들어오는 모든 각각의 입력과 각각의 가중치를 곱하여 모두 더한다. 그리고 여기에 편향을 더하고 활성화 함수에 입력하면 출력이 나온다.

 

 

회귀

-데이터의 추세로 연속적인 수치를 예측하는 문제

 

활성화 함수의 종류

-계단 함수(입력값이 0이하면 출력값은 0, 0보다 크면 출력값은 1  )

-시그모이드 함수(입력값 x가 작을수록 출력은 0에 가까우며 x가 커질수록 1에 근접 y=1/(1+exp(-x))  )

-tanh 함수(-1과 1 사이에서 매끄러운 곡선으로 변화하는 함수, 0을 중심으로 대칭이여서 밸런스가 좋다.)

-ReLu 함수(x>0범위에서 우상향 방향으로 뻗어 올라간다. x<=0인 경우는 출력값은 0이다.)

-Leaky ReLu(ReLu의 단점인 0이 출력되어 더 이상 학습을 못하는 dying ReLu현상을 조금 개선한것으로 x가 음수인 구간에서 0.01x값을 가진다.)

-항등 함수(입력값이 그대로 반환된다. y=x)

-소프트맥스 함수(입력x값이 있다면 분모가 1부터 n개의 뉴런의 개수까지 exp(x)를 더한 것이며 분자는 exp(x)이다. 출력은 0과 1사이에서 이루어 지먀 분류문제를 다룰때 자주 쓰인다.)


import numpy as np
import matplotlib.pyplot as plt

def step_function(x):
    return np.where(x<=0,0,1)

x=np.linspace(-5,5)
y=step_function(x)
plt.plot(x,y)
plt.show()
계단 함수

import numpy as np
import matplotlib.pyplot as plt

def signoid_function(x):
    return 1/(1+np.exp(-x))

x=np.linspace(-5,5)
y=signoid_function(x)
plt.plot(x,y)
plt.show()
시그모이드 함수

import numpy as np
import matplotlib.pyplot as plt

def tanh_function(x):
    return np.tanh(x)

x=np.linspace(-5,5)
y=tanh_function(x)
plt.plot(x,y)
plt.show()

tanh함수


import numpy as np
import matplotlib.pyplot as plt

def relu_function(x):
    return np.where(x<=0,0,x)

x=np.linspace(-5,5)
y=relu_function(x)
plt.plot(x,y)
plt.show()
 

ReLu 함수


import numpy as np
import matplotlib.pyplot as plt

def leaky_relu_function(x):
    return np.where(x<=0,0.01*x,x)

x=np.linspace(-5,5)
y=leaky_relu_function(x)
plt.plot(x,y)
plt.show()
Leaky ReLu 함수

import numpy as np
import matplotlib.pyplot as plt

x=np.linspace(-5,5)
y=x
plt.plot(x,y)
plt.show()
항등함수

import numpy as np

def softmax_function(x):
    return np.exp(x)/np.sum(np.exp(x))

y=softmax_function(np.array([1,2,3]))
print(y)
 
-->[0.09003057 0.24472847 0.66524096]

import numpy as np
import matplotlib.pyplot as plt

x=np.arange(-1.0 , 1.0 , 0.2 )
y=np.arange(-1.0 , 1.0 , 0.2 )

z=np.zeros((10,10))

w_x=2.5 #가중치
w_y=3.0 #가중치
bias=0.1#편향

for i in range(10):
    for j in range(10):
        u=x[i]*w_x + y[j]*w_y +bias #입력값과 가중치 곱의 합+편향

        Y=1/(1+np.exp(-u))
        z[j][i]=Y
#vmin, vmax : float, optional
plt.imshow(z,"gray",vmin=0.0 , vmax=1.0)
plt.colorbar()
plt.show()

단일 뉴런의 출력값 시각화(검은색 출력값은 0, 흰색은 1이며 흰색으로 올수록 뉴런이 흥분된것)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(시그모이드 함수로 구현해서 색이 연속적으로 변한다)


#회귀문제에 관한 신경망 구현
import numpy as np
import matplotlib.pyplot as plt

X=np.arange(-1.0 , 1.0 , 0.2 )
Y=np.arange(-1.0 , 1.0 , 0.2 )
Z=np.zeros((10,10))

#input,middle의 가중치
w_im=np.array([[4.0 , 4.0],
                [4.0 , 4.0]])
#middle,output 사이의 가중치                
w_mo=np.array([[1.0],[-1.0]])

#bias input and middle
b_im=np.array([3.0,-3.0])
#bias middle and output
b_mo=np.array([0.1])

#middle layer
def middle_layer(x,w,b):
    u=np.dot(x,w)+b
    return 1/(1+np.exp(-u))#활성화함수로 시그모이드 함수 사용

#output layer
def output_layer(x,w,b):
    u=np.dot(x,w)+b
    return u #출력층의 활성화 함수는 회귀 문제에 적합한 항등 함수 사용

for i in range(10):
    for j in range(10):

        inp=np.array([X[i],Y[j]])   #입력층
        mid=middle_layer(inp, w_im , b_im)  #은닉층
        out=output_layer(mid , w_mo , b_mo) #출력층
        Z[j][i]=out[0]
plt.imshow(Z, "gray", vmin=0.0 , vmax=1.0)
plt.colorbar()
plt.show()
신경망 회귀 문제의 출력 값

 
#회귀문제에 관한 신경망 구현
import numpy as np
import matplotlib.pyplot as plt

X=np.arange(-1.0 , 1.0 , 0.1 )
Y=np.arange(-1.0 , 1.0 , 0.1 )
Z=np.zeros((10,10))

#input,middle의 가중치
w_im=np.array([[1.0 , 2.0],
                [2.0 , 3.0]])
#middle,output 사이의 가중치                
w_mo=np.array([[-1.0 , 1.0],
                [1.0 , -1.0]])

#bias input and middle
b_im=np.array([0.3 , -0.3])
#bias middle and output
b_mo=np.array([0.4 , 0.1])

#middle layer
def middle_layer(x,w,b):
    u=np.dot(x,w)+b
    return 1/(1+np.exp(-u))#활성화함수로 시그모이드 함수 사용

#output layer
def output_layer(x,w,b):
    u=np.dot(x,w)+b
    return np.exp(u)/np.sum(np.exp(u)) #출력층의 활성화 함수는 분류 문제에 적합한 소프트맥스 함수 사용
#분류시 큰 값 저장
x_1=[]
y_1=[]
#분류시 작은 값 저장
x_2=[]
y_2=[]

for i in range(20):
    for j in range(20):

        inp=np.array([X[i],Y[j]])   #입력층
        mid=middle_layer(inp, w_im , b_im)  #은닉층
        out=output_layer(mid , w_mo , b_mo) #출력층
       
        if out[0]>out[1]:
            x_1.append(X[i])
            y_1.append(Y[j])
        else:
            x_2.append(X[i])
            y_2.append(Y[j])
plt.scatter(x_1,y_1 , marker='+')
plt.scatter(x_2,y_2,marker='o')
plt.show()

분류문제 신경망(패턴으로 2개의 영역으로 나뉜다. 회귀문제와 다르게 연속적이지 않으며 경계가 명확히 구분된다)