본문 바로가기
DeepLearning

Deep Learning | 기본 인공 신경망 구현

by daewooki 2021. 6. 24.
반응형

기본 신경망 구현

1.     인공 신경망

 

Artificial Neural Network? 생물학의 신경망()에서 영감을 얻은 통계학적 학습 알고리즘.

뉴런의 원리와 같다.

입력 신호에 weight를 곱하고, bias를 더한 후, neurons이 활성화 함수를 거쳐, 결과 y를 만들어 낸다.

 

Y = Sigmonid( X * W + b)

출력 = 활성화함수 ( 입력 * weight + bias) 

== 최적의 Weight bias를 찾아내는 것이 학습이다.

 

Activation function 이란 ?

인공신경망을 통과해 온 값을 최종적으로 어떤 값으로 만들지 결정하는 함수.

 

 

Activation function 종류 ?

-       Sigmoid

-       ReLU

-       tanH

 

최근에는 ReLU를 많이 사용한다.

입력값이 0보다 작으면 항상 0, 0보다 크면 항상 입력값을 그대로 출력한다.

 

인공 뉴런들을 연결해 구성한 인공신경망

 

 

심층신경망

 

다층 신경망 학습을 가능하게 한 알고리즘 => 역전파 backpropagation

 

What is  Backpropagation ?

 

출력층이 내놓은 결과의 오차를 신경망을 따라 입력층까지 역으로 전파하며 계산해나가는 알고리즘

입력층부터 가중치를 조절해가는 기존 방식보다 훨씬 빠르고 정확하다.

 

(출처 : https://m.blog.naver.com/PostView.nhn?blogId=samsjang&logNo=221033626685&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F)

 

기존에는 모든 조합의 경우의 수에 대해 가중치를 대입하고 계산했지만

역전파를 사용함으로써 결괏값의 오차를 앞쪽으로 전파하면서 가중치를 갱신한다. 

2.     간단한 분류 모델 구현

 

털과 날개가 있느냐를 기준으로 포유류와 조류를 구분하는 신경망 모델.

이미지 대신 간단한 이진 데이터.

 

A.     텐서플로와 Numpy 라이브러리를 임포트. Numpy는 행렬 조작과 연산에 필수이다.

 

     i.          import tensorflow as tf

     ii.          import numpy as np

 

B.     학습에 사용할 데이터 정의

    i.          x_data = np.array([[0,0],[1,0],[1,1],[0,0],[0,0],[0,1]])

                                        # 털과 날개가 있느냐를 담은 배열 있으면 1, 없으면 0.

 

                                         -핫 인코딩으로 레이블 데이터를 구성해야 한다.

 

What is one-hot encoding?

 데이터가 가질 수 있는 값들을 일렬로 나열한 배열을 만들고, 그 중 표현하려는 값을 뜻하는 

인덱스의 원소만 1로 표기하고 나머지 원소는 모두 0으로 채우는 기법.

 

          기타 = [1,0,0]

          포유류 = [0,1,0]

          조류 = [0,0,1]

         

 

 y_data = np.array([[1,0,0], # 기타

                          [0,1,0], # 포유류

                          [0,0,1], # 조류

                          [1,0,0],

                          [1,0,0]

                          [0,0,1]

])

 

       # 신경망 모델 구성.

 

          특징 x와 레이블 y의 관계를 알아내는 모델.

         

          X = tf.placeholder(tf.float32)

          Y = tf.placeholder(tf.float32)  실측값을 넣어서 학습시킬 것이기 때문.

 

          W = tf.Variable(tf.random_uniform([2,3],-1.,1.))

          b = tf.Variable(tf.zeros([3]))

 

          weight [입력층(특징 수), 출력층(레이블 수)]

           bias 는 레이블 수,  weight를 곱하고 bias를 더한 결과를 activation ReLU에 적용하면 신경망 구성 끝.

 

전체 코드 및 결과

 

 

손실값은 계속 줄어들지만 정확도는 크게 높아 지지 않는다

그 이유는 신경망이 한 층밖에 없기 때문이다

 

층 여러개를 늘리면 정확도가 늘어나게 된다. (무조건 그런 것은 아님. 오버피팅 될 수 있음)

반응형

댓글