안녕하세요.
오늘의 파이썬 코딩 독학 주제는 시그모이드 예제 풀이 입니다.
심층 신경망 예제까지 풀이한 시점에서
시그모이드 예제에 대한 풀이를 하는 것은
순서가 조금 안 맞지만
시그모이드 함수 역시 중요한 활성화 함수이므로
한번 예제풀이에 도전해보겠습니다.
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. 결과 확인
위 사진과 같은 결과값이 출력되면 성공적으로 학습이 진행되었다는 뜻입니다.
오늘은 텐서플로우 예제에 대해 알아보았습니다.
여기까지 쭉 따라오셨다면 이런 의문이 드실수도 있을겁니다.
'그래서 대체 이걸로 뭘 어떻게한다는거지?'
머신러닝은 기계를 학습시켜
새로운 상황에 대한 판단을 가능하도록 만드는 과정입니다.
오늘 컴퓨터에 시그모이드 함수를 사용하는
신경망을 학습시켰으니
다음부터는 이러한 모델을 사용하는 연산과정에서
컴퓨터의 판단력이 과거보다 더 예리하게 작용할 것입니다.
아직은 많은 예제를 다뤄보지 못했지만
예제들을 하나씩 풀어내다 보면
여러분들이 원하는 상황에 알맞은 코드들을
짜실 수 있을 겁니다.
'코딩 > 텐서플로우' 카테고리의 다른 글
비전공자의 코딩 독학 - 파이썬&텐서플로우(11) <과적합> (0) | 2020.04.30 |
---|---|
비전공자의 코딩 독학 - 파이썬&텐서플로우(10) <MNIST> (0) | 2020.03.11 |
비전공자의 코딩 독학 - 파이썬&텐서플로우(8) <텐서보드> (0) | 2020.01.15 |
비전공자의 코딩 독학 - 파이썬&텐서플로우(7) <예제3 심층신경망> (1) | 2020.01.14 |
비전공자의 코딩 독학 - 파이썬&텐서플로우(6) <예제2 신경망> (0) | 2020.01.06 |