이숭간 공부기록

밑바닥부터 시작하는 딥러닝 3장(1)_신경망 본문

공부공부/딥러닝

밑바닥부터 시작하는 딥러닝 3장(1)_신경망

이숭간 2020. 8. 2. 17:04
728x90

2장에서 배웠던 퍼셉트론에서는 원하는 결과를 출력하도록 가중치값을 적절하게 정하는 작업을 사람이 수동으로 해야했음. 

신경망은 가중치값을 기계가 데이터로부터 자동으로 학습하는 능력을 가질수있게함

 

( 퍼셉트론 복습 - 두 신호 x1,x2를 입력받아 y를 출력하는 퍼셉트론.

각신호에 가중치를 곱한값을 모두 더한값에 편향(뉴런이 얼마나 쉽게 활성화되는지를 제어)함을 더한값이 0보다 크면1, 작거나 같으면 0을 출력)

 

3장의 목표

  • 신경망의 개요
  • 신경망이 입력데이터가 무엇인지 식별하는 처리과

# 활성화함수 : 입력 신호의 총합을 출력신호로 변환하는 함수 h(x)

 b+w1x1+w2x2를 a라하면 y=h(a)

활성화함수는 입력신호의 총합이 활성화를 일으키는지 정하는 역할을 함.

 

활성화함수의 종류

퍼셉트론과 신경망의 차이는 어떤 활성화함수를 쓰느냐의 차이뿐.

함수를 이용하여 신호를 변환하고, 변환된 신호를 다음 뉴런에 전달함.

 

# 계단함수 : 임계값을 경계로 출력이 바뀌는 함수 (퍼셉트론에서 쓰임)

# 계단함수 구현하기

def step_function(x):
   if x>0:
     return(1)
   else 
     return(0)    --- x에는 실수만 들어갈수있음

x에 np.array[-1.0, 1.0, 2.0]과 같은 넘파이배열 넣고싶으면?? -->

def step_function(x)
   y = x>0  # x>0이면 ture, 아님 false를 반환 
    # y에는 array([false, true, true])가 들어있음.
   return y.astype(np.int)  # 불린값을 정수형태로 변환

--> 넘파이배열에 부등호연산을 수행하면 배열의 원소 각각에 부등호연산을 수행한 bool배열이 생성됨!!

# 계단함수 그래프그리기

import numpy as np
import matplotlib.pylab as plt

def step_function(x):
    return np.array(x > 0, dtype=np.int)

x = np.arange(-5.0, 5.0, 0.1) # -5.0에서 5.0 직전까지 0.1간격의 넘파이배열 생성
y = step_function(x)

plt.plot(x,y)
plt.ylim(-0.1, 1.1) # y축 범위지정
plt.show()

 

계단함수 그래프

# 시그모이드함수 구현하기 

(여기서는 x가 실수뿐만 아니라 넘파이 배열일때도 삽입가능한데 이는 넘파이의 브로드캐스트때문)

@넘파이의 브로드캐스트? 넘파이배열과 스칼라값의 연산을 배열원소 각각과 스칼라값의 연산으로 바꿔수행 

  시그모이드 함수에서는 np.exp(-1)이 넘파이배열을 반환하기때문에 스칼라값과 수행한결과도 넘파이배열임

 

# 파이썬의 기본배열구조인 리스트대신 넘파이배열을 쓰는이유? numpy.array클래스에서 제공하는 유용한 기능들을 사용하기 위해서 예를들면 위와같은 브로드캐스트같은!

import numpy as np

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

# 시그모이드함수 그래프

import numpy as np
import matplotlib.pylab as plt

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

x = np.arange(-5.0, 5.0, 0.1) # -5.0에서 5.0 직전까지 0.1간격의 넘파이배열 생성
y = sigmoid(x)
plt.plot(x,y)
plt.ylim(-0.1, 1.1) # y축 범위지정
plt.show()

시그모이드 함수

# 계단함수와 시그모이드 함수 비교

매끈함과 끊김!

퍼셉트론의 뉴런사이에는 0또는 1이 흐르지만, 신경망에서는 연속적인 실수가 흐른다.

 

공통점 - 입력이 작을때 출력은 0에 가깝고 입력이 커지면 출력이 1에가까워짐, 즉 중요도가 높을수록 큰값출력

             출력값은 0과 1사이

             비선형함수 

 

# 비선형함수  - 직선이 아닌 함수

신경망에서는 활성화 함수로 비선형함수를 사용해야함 (선형함수를 사용하면 층을 아무리 깊게해도 결국 처음의 선형함수와 같은 구조를띔, 즉 은닉층이 없는 네트워크로도 똑같은 기능을 할수있다는뜻)

 

# ReLU함수 (렐루함수) 

렐루함수는 입력이 0을 넘으면 그입력 그대로 출력하고 0이하면 0을 출력함.

렐루함수

# 렐루함수 구현 (두가지방식 모두가능)

def relu(x):
    if x>0:
        return x
    else:
        return 0
        
or

def relu2(x):
    return np.maximum(0, x)

 

'공부공부 > 딥러닝' 카테고리의 다른 글

밑바닥부터 시작하는 딥러닝 3장(2)_신경망  (0) 2020.08.02