본문 바로가기

코딩/텐서플로우

비전공자의 코딩 독학 - 파이썬&텐서플로우(9) <시그모이드 예제>

반응형

안녕하세요.

오늘의 파이썬 코딩 독학 주제는 시그모이드 예제 풀이 입니다.

 

심층 신경망 예제까지 풀이한 시점에서

시그모이드 예제에 대한 풀이를 하는 것은

순서가 조금 안 맞지만

시그모이드 함수 역시 중요한 활성화 함수이므로

한번 예제풀이에 도전해보겠습니다.

 

 

1. 텐서플로우 외에 필요한 라이브러리

 

numpy : 표 형식으로 이루어진 데이터를 효과적으로 이용할 수 있게 만든 라이브러리입니다. 

 

 

2. 전체 소스코드

import tensorflow as tf
import numpy as np


x_data = np.array([[0, 0],
                  [0, 1],
                  [1, 0],
                  [1, 1]], dtype=np.float32)
y_data = np.array([[0],
                  [0],
                  [0],
                  [1]], dtype=np.float32)

X = tf.placeholder(tf.float32, [None, 2], name='x-input')
Y = tf.placeholder(tf.float32, [None, 1], name='y-input')

W = tf.Variable(tf.random_normal([2, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')

hypothesis = tf.sigmoid(tf.matmul(X, W) + b)


cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis))
train = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)


predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))
actval = tf.cast(Y > 0.5, dtype=tf.float32)

with tf.Session() as sess:
    
    sess.run(tf.global_variables_initializer())

    for step in range(10001):
        sess.run(train, feed_dict={X: x_data, Y: y_data})
        
        if step % 100 == 0:
            print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}), sess.run(W))

    
    h, c, a, v = sess.run([hypothesis, predicted, accuracy, actval], feed_dict={X: x_data, Y: y_data})
    print("\nHypothesis: ", h, "\nActval: ", v, "\nCorrect: ", c, "\nAccuracy: ", a)

 

 

3. 소스코드의 목적

주어진 자료(X1, X2, y)를 갖고

//

X1은 [0,0,1,1]이고

X2는 [0,1,0,1]이며

y는 [0,0,0,1]입니다.

//

AND 연산을 학습하는것이 목적입니다.

 

아래의 그림에서 보이듯이

y = W * X + b식의

W b를 찾아내는 방식으로 학습을 진행합니다.

 

 

4. 소스코드 분석

아래의 코드에서

np.array()는 괄호 안의 데이터를 이용하여 배열을 생성하는 함수입니다.

np.float32는 데이터 타입을 지정해줍니다.

여기서는 float32라고 하였으므로 실수를 32비트로 표현하게됩니다.

x_data = np.array([[0, 0],
                  [0, 1],
                  [1, 0],
                  [1, 1]], dtype=np.float32)
y_data = np.array([[0],
                  [0],
                  [0],
                  [1]], dtype=np.float32)

 

아래의 코드에서

tf.placeholder()는 데이터를 받아들이기 위한 틀을 만드는 함수입니다.

tf.placeholder(dtype, shape, name)의 형태로 사용하며 각 인자의 의미는 다음과 같습니다.

dtype : 데이터타입을 지정해줍니다.

shape : 행렬의 차원을 지정해줍니다.

name : 해당 플레이스홀더의 이름을 지정해줍니다.

X = tf.placeholder(tf.float32, [None, 2], name='x-input')

Y = tf.placeholder(tf.float32, [None, 1], name='y-input')

 

아래는 우리가 찾고싶어하는 값인 W b를 변수로 선언하는 코드입니다.

tf.Variable()는 변수를 생성해주는 함수이며

변수가 생성되는 순간에 데이터 타입과 크기가 결정됩니다.

괄호 안의 name뒤에는 연산의 명칭을 입력해주면 됩니다.

tf.random_normal()는 난수값을 반환해줍니다.

W = tf.Variable(tf.random_normal([2, 1]), name='weight')

b = tf.Variable(tf.random_normal([1]), name='bias')

 

아래의 코드에서

tf.sigmoid()는 활성화 함수로 sigmoid를 사용하기 위한 함수입니다.

tf.matmul()은 행렬곱을 수행하는 함수입니다.

hypothesis = tf.sigmoid(tf.matmul(X, W) + b)

 

아래의 코드에서

tf.reduce_mean()은 변수가 가리키는 배열 전체 원소의 평균을 내줍니다.

*앞에 마이너스 부호가 붙어있는게 맞습니다.

tf.log()는 괄호 안에 있는 각 원소의 로그 값을 계산해줍니다.

cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis))

 

아래의 코드에서

tf.train.GradientDescentOptimizer()는 경사하강법을 이용하여 최적화를 시켜주는 함수입니다.

뒤의 minimize()를 통해 우리가 값을 줄이고자 하는 비용함수를 전달합니다.

train = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)

 

tf.cast()는 조건에 따라 데이터 타입을 변경할때 사용하는 함수입니다.

아래 코드에서는 sigmoid함수의 결과가 0.5를 넘으면 1을 반환하며

0.5를 넘지 못하면 0을 반환합니다.

predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)

 

tf.equal()은 두 값을 비교하여 같으면 True를, 다르면 False를 반환해주는 함수입니다.

accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))

 

텐서플로우는 말그대로 텐서의 흐름(flow)를 나타냅니다.

이때 학습을 수행하기 위해서는 Session을 시작해야 합니다.

(여기서 Session은 학습을 가이드하는 역할을 합니다.)

sess.run()으로 학습을 시작하며

tf.global_variables_initializer()로 초기화를 해줍니다.

이후 정확도(accuracy)를 출력합니다.

 

with tf.Session() as sess:

   

    sess.run(tf.global_variables_initializer())



    for step in range(10001):

        sess.run(train, feed_dict={X: x_data, Y: y_data})

        

        if step % 100 == 0:

            print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}), sess.run(W))
            
             
    h, c, a = sess.run([hypothesis, predicted, accuracy], feed_dict={X: x_data, Y: y_data})

    print("\nHypothesis: ", h, "\nCorrect: ", c, "\nAccuracy: ", a)

 

 

5. 결과 확인

위 사진과 같은 결과값이 출력되면 성공적으로 학습이 진행되었다는 뜻입니다.

 

 

 

오늘은 텐서플로우 예제에 대해 알아보았습니다.

여기까지 쭉 따라오셨다면 이런 의문이 드실수도 있을겁니다.

'그래서 대체 이걸로 뭘 어떻게한다는거지?'

머신러닝은 기계를 학습시켜

새로운 상황에 대한 판단을 가능하도록 만드는 과정입니다.

오늘 컴퓨터에 시그모이드 함수를 사용하는

신경망을 학습시켰으니

다음부터는 이러한 모델을 사용하는 연산과정에서

컴퓨터의 판단력이 과거보다 더 예리하게 작용할 것입니다.

아직은 많은 예제를 다뤄보지 못했지만

예제들을 하나씩 풀어내다 보면

여러분들이 원하는 상황에 알맞은 코드들을

짜실 수 있을 겁니다.

반응형