본문 바로가기

코딩/텐서플로우

비전공자의 코딩 독학 - 파이썬&텐서플로우(7) <예제3 심층신경망>

반응형

안녕하세요.

오늘의 파이썬 코딩 독학 주제는 심층 신경망 예제 풀이 입니다. 

 

앞서 단층 신경망 예제를 알아보았는데

정확도가 생각보다 많이 낮았던 것이 기억나시나요?

2020/01/06 - [코딩/파이썬] - 비전공자의 코딩 독학 - 파이썬[15] 텐서플로우(6) <예제2 신경망>

 

비전공자의 코딩 독학 - 파이썬[15] 텐서플로우(6) <예제2 신경망>

안녕하세요. 오늘의 파이썬 코딩 독학 주제는 신경망 예제 풀이입니다. 1. 추가로 필요한 라이브러리 오늘은 텐서플로우 외에 추가로 numpy라는 라이브러리가 필요합니다. numpy는 행렬형태의 데이터를 조작, 연산..

bebutae.tistory.com

이번에는 레이어를 추가해 심층 신경망을 만들어

정확도를 올려보도록 하겠습니다.

 

 

1. 이론

앞서 공부한 신경망은

단층으로 구성되어 효과적인 학습이 어려웠습니다.

하지만 이번엔 층을 추가하여

심층신경망(Deep Learning)을 구현해보도록 하겠습니다.

심층 신경망을 만들기 위해서는

가중치와 편향을 추가해주면 됩니다.

 

 

2. 전체 소스코드

import tensorflow as tf
import numpy as np

#자료형 설정 ex) [여성, 남성]
x_data = np.array([
    [0, 0], 
    [1, 0], 
    [1, 1], 
    [0, 0], 
    [0, 0], 
    [0, 1]
    ])
#자료형 설정 ex) [유아기, 청년기, 장년기]    
y_data = np.array([
    [1, 0, 0], 
    [0, 1, 0], 
    [0, 0, 1], 
    [1, 0, 0],
    [1, 0, 0],
    [0, 0, 1]
    ])

#플레이스홀더 설정
X = tf.placeholder(tf.float32, name='X-input')
Y = tf.placeholder(tf.float32, name='Y-input')

#가중치와 편향값 설정
W1 = tf.Variable(tf.random_uniform([2, 10], -1., 1.))
W2 = tf.Variable(tf.random_uniform([10, 3], -1., 1.))

b1 = tf.Variable(tf.zeros([10]))
b2 = tf.Variable(tf.zeros([3]))

#활성화 함수 설정
Relu = tf.add(tf.matmul(X, W1), b1)
Relu = tf.nn.relu(Relu)

#출력값 다듬기
model = tf.add(tf.matmul(Relu, W2), b2)

#비용함수 설정
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=Y, logits=model))

#Adam으로 최적화
optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
train_op = optimizer.minimize(cost)

#세션 초기화
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)


#학습 100번 진행
for step in range(100):
    sess.run(train_op, feed_dict={X: x_data, Y: y_data})
    #학습 10번 당 1번씩 손실값 출력
    if (step + 1) % 10 == 0:
        print(step + 1, sess.run(cost, feed_dict={X: x_data, Y: y_data}))

#학습결과 확인
predict = tf.argmax(model, 1)
actval = tf.argmax(Y, 1)
print('예상:', sess.run(predict, feed_dict={X: x_data}))
print('실제:', sess.run(actval, feed_dict={Y: y_data}))

#정확도 출력
corr = tf.equal(predict, actval)
accu = tf.reduce_mean(tf.cast(corr, tf.float32))
print('Accuracy: %.2f' % sess.run(accu * 100, feed_dict={X: x_data, Y: y_data}))

 

3. 소스코드의 목적

앞서 만든 신경망 예제와 같이

성별에 따라

유아기인지 청년기인지, 장년기인지

예측해주는 신경망을 만드는 예제입니다.

 

ReLU함수를 사용하여 학습을 진행하며

최적의 W와 b값을 찾아주는게 목표입니다.

 

덧붙여 레이어를 추가해

심층 신경망을 만들어주었습니다.

 

 

4. 소스코드 설명

(1) 필요한 라이브러리를 탑재합니다.

import tensorflow as tf
import numpy as np

 

(2) 학습을 위한 데이터를 구성합니다.

x_data = np.array([
    [0, 0], 
    [1, 0], 
    [1, 1], 
    [0, 0], 
    [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]
    ])

 

(3) 플레이스 홀더를 생성합니다.

X = tf.placeholder(tf.float32, name='X-input')
Y = tf.placeholder(tf.float32, name='Y-input')

 

(4) 임의의 W와 b값을 입력받습니다.

W1 = tf.Variable(tf.random_uniform([2, 10], -1., 1.))
W2 = tf.Variable(tf.random_uniform([10, 3], -1., 1.))

b1 = tf.Variable(tf.zeros([10]))
b2 = tf.Variable(tf.zeros([3]))

여기서 레이어를 추가해주기 위해

가중치와 편향값을 한번 더 입력해주었습니다.

첫번째 가중치(W1)의 형태는 [2,10]으로,

두번째 가중치(W2)의 형태는 [10,3]으로

설정해주었는데

입력층과 출력층은 각각

특징과 분류의 개수로 설정하였고

두 층의 사이에 새로만든 레이어는

연결된 두 층의 뉴런 수와 맞추어줍니다.

 

이어 첫번째 편향값(b1)은 [10]으로

두번째 편향값(b2)은 [3]으로

설정해주었는데

각각 새로만든 레이어의 뉴런수와

분류 수로 맞추어준 값입니다.

 

(5) 활성화 함수를 구성해줍니다.

Relu = tf.add(tf.matmul(X, W1), b1)
Relu = tf.nn.relu(Relu)

성별 입력값에 첫번째 가중치와 편향을 대입하고

역시 ReLU함수를 활성화 함수로 사용합니다.

 

(6)신경망을 통해 출력된 값을 다듬어줍니다.

model = tf.add(tf.matmul(Relu, W2), b2)

은닉층에 두번째 가중치와 편향을 대입하여

출력층을 만들어줍니다.

 

(7) 비용함수를 설정합니다.

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=Y, logits=model))

이번에도 교차 엔트로피 함수를

손실함수로 사용할 예정이지만

복잡한 수식을 제거하기 위해

텐서플로우가 제공하는

교차 엔트로피 함수를 적용하였습니다.

 

(8) 최적화를 진행합니다.

optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
train_op = optimizer.minimize(cost)

이번에는 Adam을 최적화함수로 사용했습니다.

경사하강법보다 성능이 뛰어나므로

더 정확한 값을 찾아줄 것입니다.

 

(9) 세션을 초기화합니다.

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)


(10) 학습 횟수를 지정해줍니다.

for step in range(100):
    sess.run(train_op, feed_dict={X: x_data, Y: y_data})

    if (step + 1) % 10 == 0:
        print(step + 1, sess.run(cost, feed_dict={X: x_data, Y: y_data}))

이번에는 100번의 학습을 진행하여

10번의 학습마다 손실값을 출력합니다.

 

(11) 학습결과를 출력합니다.

predict = tf.argmax(model, 1)
actval = tf.argmax(Y, 1)
print('예상:', sess.run(predict, feed_dict={X: x_data}))
print('실제:', sess.run(actval, feed_dict={Y: y_data}))

 

(12) 정확도를 출력합니다.

corr = tf.equal(predict, actval)
accu = tf.reduce_mean(tf.cast(corr, tf.float32))
print('Accuracy: %.2f' % sess.run(accu * 100, feed_dict={X: x_data, Y: y_data}))

 

 

5. 결과분석

코드를 실행 시

아래와 같은 결과가 나타납니다.

이번에는 정확도가 100%로 나타났습니다.

이처럼 여러 조작을 통해

머신러닝의 성능을 끌어올릴 수 있습니다.

반응형