티스토리 뷰
분류모델은 패턴을 파악하여 여러종류로 구분하는 작업입니다.
예를 들어 어떤 사진을 보고 고양이인지, 강아지인지, 자동차인지 비행기인지 분류하는 모델입니다
● 학습데이터 정의
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] ]) 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])) L = tf.add(tf.matmul(X,W), b) L = 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. 신경망 모델 구성
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])) L = tf.add(tf.matmul(X,W), b) L = 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] ]) X = tf.placeholder(tf.float32) Y = 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분 딥러닝 - 텐서플로맛' 을 공부하며 정리하는 내용입니다.
'machineLearning' 카테고리의 다른 글
Relu를 이용한 신경망 mnist (0) | 2018.05.09 |
---|---|
선형 회귀 분석(Linear Regression) (0) | 2018.04.17 |
텐서플로우 구조 및 자료형 (0) | 2018.04.12 |
ubuntu에 파이썬, anaconda, jupyter notebook 설치 (0) | 2018.04.10 |