machineLearning

Relu를 이용한 분류 모델과 신경망을 이용한 딥러닝

탄생 2018. 4. 19. 11:47

분류모델은 패턴을 파악하여 여러종류로 구분하는 작업입니다.

예를 들어 어떤 사진을 보고 고양이인지, 강아지인지, 자동차인지 비행기인지 분류하는 모델입니다


● 학습데이터 정의

1. 우리가 판별하고자 하는 개체의 종류는 기타, 포유류, 조류 세가지이다

2. 기타는 털과 날개가 없다

   포유류는 털은 있고 날개는 없다

   조류는 털과 날개가 모두 있다 라고 특징을 정의한다

3. 위의 내용을 디지털로 정의한다

   [털, 날개] -> [기타, 포유류, 조류]

   [0, 0] -> [1, 0, 0] # 기타

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

   [1, 1] -> [0, 0, 1] # 조류


● Relu를 이용한 분류모델

import tensorflow as tf
import numpy as np
 
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]
])
 
= tf.placeholder(tf.float32)
= tf.placeholder(tf.float32)
 
= tf.Variable(tf.random_uniform([2,3], -1.1.))
= tf.Variable(tf.zeros([3]))
 
= tf.add(tf.matmul(X,W), b)
= tf.nn.relu(L)
 
model = tf.nn.softmax(L)
cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(model), axis = 1))
 
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.01)
train_op = optimizer.minimize(cost)
 
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
 
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}))
 
prediction = tf.argmax(model, axis = 1)
target = tf.argmax(Y, axis = 1)
print('예측값:', sess.run(prediction, feed_dict={X: x_data}))
print('실제값:', sess.run(target, feed_dict={Y: y_data}))
 
is_correct = tf.equal(prediction, target)
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
print('정확도: %.2f' % sess.run(accuracy*100, feed_dict={X:x_data, Y:y_data}))

- 실행결과

10 0.9145522
20 0.90968376
30 0.9048907
40 0.9002771
50 0.8957351
60 0.8913885
70 0.8871555
80 0.8830299
90 0.87900597
100 0.87507814
 
예측값: [2 1 2 2 2 2]
실제값: [0 1 2 0 0 2]
 
정확도: 50.00



● 분류보델 설명

1. 학습데이터 정의

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]
])
 


x_data 행의 패턴은 y_data의 행의 결과로 이루어져있다

x_data의 1행 [0,0]은 털과 날개가 없다 

그 결과는 y_data 1행 [1,0,0] 1열은 기타이므로 털과 날개가 없는 것은 기타로 학습하게 된다

이와 같은 방법으로 학습데이터를 정의한다


2. 신경망 모델 구성

= tf.placeholder(tf.float32)
= tf.placeholder(tf.float32)
 
= tf.Variable(tf.random_uniform([2,3], -1.1.))
= tf.Variable(tf.zeros([3]))
 
= tf.add(tf.matmul(X,W), b)
= tf.nn.relu(L)
 
model = tf.nn.softmax(L)
cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(model), axis = 1))

X와 Y값은 placeholder로 정의

W값은 [2,3]배열의 -1~1까지 랜덤한 값을 넣는다

W값의 배열값은 x_data의 열값(2)과 y_data의 열값(3)으로 정의된다

b값은 y_data의 열값(3)으로 정의되니 x값과 y값이 변경되면 해당 값들도 변경되어야 한다

L은 W * X + b의 식을 Relu를 적용한것입니다.

Relu는 분류모델의 활성화 함수중 하나입니다


Relu의 자세한 설명은 아래 링크를 통해 학습하기 바랍니다 

http://pythonkim.tistory.com/40


3. 학습

optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.01)
train_op = optimizer.minimize(cost)
 
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
 
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}))
 
prediction = tf.argmax(model, axis = 1)
target = tf.argmax(Y, axis = 1)
print('예측값:', sess.run(prediction, feed_dict={X: x_data}))
print('실제값:', sess.run(target, feed_dict={Y: y_data}))
 
is_correct = tf.equal(prediction, target)
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
print('정확도: %.2f' % sess.run(accuracy*100, feed_dict={X:x_data, Y:y_data}))

학습하여 예측값과 결과값을 비교합니다

예측값과 결과값의 비교하여 모델의 정확도를 판단합니다

판단 결과는 정확도는 50%가 나왔습니다


● 딥러닝 구현

딥러닝 결과 정확도가 50% 예측하는 다소 실망한 결과가 나왔습니다. 학습 횟수를 늘려도 정확도는 크게 늘어나지 않습니다.

그 이유는 신경망이 한 층밖에 안되기 때문입니다. 여러 모델층을 늘려 심층 신경망 즉, 딥러닝을 구현해 보겠습니다.

import tensorflow as tf
import numpy as np
 
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]
])
 
= tf.placeholder(tf.float32)
= tf.placeholder(tf.float32)
 
W1 = tf.Variable(tf.random_uniform([2,10], -1.1.))
W2 = tf.Variable(tf.random_uniform([10,10], -1.1.))
W3 = tf.Variable(tf.random_uniform([10,3], -1.1.))
 
b1 = tf.Variable(tf.zeros([10]))
b2 = tf.Variable(tf.zeros([10]))
b3 = tf.Variable(tf.zeros([3]))
 
L1 = tf.add(tf.matmul(X, W1), b1)
L1 = tf.nn.relu(L1)
 
L2 = tf.add(tf.matmul(L1, W2), b2)
L2 = tf.nn.relu(L2)
 
model = tf.add(tf.matmul(L2, W3), b3)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=Y, logits=model))
 
optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
train_op= optimizer.minimize(cost)
 
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
 
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}))
 
prediction = tf.argmax(model,1)
target = tf.argmax(Y, 1)
print('예측값:', sess.run(prediction, feed_dict={X:x_data}))
print('실제값:', sess.run(target, feed_dict={Y:y_data}))
 
is_correct = tf.equal(prediction, target)
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
print('정확도: %.2f' % sess.run(accuracy * 100, feed_dict={X:x_data, Y:y_data}))


- 결과

10 0.74157935
20 0.595714
30 0.4631858
40 0.34065557
50 0.22845586
60 0.13811733
70 0.071769156
80 0.03712898
90 0.020974167
100 0.013323269
 
예측값: [0 1 2 0 0 2]
실제값: [0 1 2 0 0 2]
 
정확도: 100.00


다층 신경망을 만드는 것은 간단합니다

가중치와 편향을 추가하여 여러번 모델을 추가하면 됩니다

W1 = tf.Variable(tf.random_uniform([2,10], -1.1.))
W2 = tf.Variable(tf.random_uniform([10,10], -1.1.))
W3 = tf.Variable(tf.random_uniform([10,3], -1.1.))
 
b1 = tf.Variable(tf.zeros([10]))
b2 = tf.Variable(tf.zeros([10]))
b3 = tf.Variable(tf.zeros([3]))
 
L1 = tf.add(tf.matmul(X, W1), b1)
L1 = tf.nn.relu(L1)
 
L2 = tf.add(tf.matmul(L1, W2), b2)
L2 = tf.nn.relu(L2)
 
model = tf.add(tf.matmul(L2, W3), b3)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=Y, logits=model))


# '골빈해커의 3분 딥러닝 - 텐서플로맛' 을 공부하며 정리하는 내용입니다.