코딩걸음마

[딥러닝] TensorFlow1.0 기초 + 회귀모델 예제 본문

딥러닝_TensorFlow

[딥러닝] TensorFlow1.0 기초 + 회귀모델 예제

코딩걸음마 2022. 6. 28. 17:11
728x90

 

딥러닝 기법을 다루기 위한 텐서플로우 기초를 다뤄보기 위해

tf.version 1부터 알아보자

import tensorflow.compat.v1 as tf  #compatablity
tf.disable_v2_behavior()
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

 

tf.add(a, b) 는  a+b를 출력하는 함수입니다.

a =tf.add(3,5)
a

그럼 다음 코드의 결과를 봅시다. 

<tf.Tensor 'Add:0' shape=() dtype=int32>

3 + 5 의 결과로 0을 반환했습니다

왜 그러는걸까요?

연산만 입력을 했지, 가동(run)하지 않았기 때문입니다

tf.Session 클래스의 객체로 sess를 선언하고 실행시켜봅시다.

sess = tf.Session()
print(sess.run(a))

드디어 3+5의 합인 8이 나왔습니다.

8

그리고 tf에서 중요한 과정이 있습니다.

tf.Session 클래스의 객체로 sess를 선언했던 것을 닫아주어야합니다.

닫는 코드는 다음과 같습니다.

sess.close()

다음 과정을 요약하면 아래와 같습니다.

 

매번 이렇게 열고 닫고를 하기 어려우니 with 접속어를 사용하여 구문 종료와 동시에 닫아주는 기능을 활용합니다.

with tf.Session() as sess:
    print(sess.run(a))

 

 

다음 예제로 넘어가 봅시다.

이번엔 연결된 tf를 작성하고 실행해봅시다.

x = 1
y = 2
op1 = tf.add(x,y)
op2 = tf.multiply(x, y)
op3 = tf.pow(op1, op2)
with tf.Session() as sess:
    op3 = sess.run(op3)
    print(op3)

실행결과를 봅시다.

9

op1과 op2를 연결 했을 뿐인데 op1과 op2를 실행한 값이 적용된 것을 확인할 수 있습니다.

 

단계가 많아져도 똑같이 작동합니다.

x = 1
y = 2
op4 = tf.add(x,y)  #3
op5 = tf.multiply(x, y) #2
op6 = tf.add(op4,op5) #5 
op7 = tf.add(op5,op6) #7
op8 = tf.add(op6,op7) #12
with tf.Session() as sess:
    op8 = sess.run(op8)
    print(op8)
12

다음으로 진도를 나가기 전에 

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

위 코드를 입력하여, 에러코드 출력을 제어해줍니다.

 

이제 실전 딥러닝 분석으로 넘어갑시다.

load_breast_cancer Data를 활용하여

예제 모델을 회귀식으로 구현해봅시다.

방의 개수 data만 이용하여 집 값을 예측해봅시다

.

1. 데이터 준비

x_data = datasets.load_breast_cancer().data[:, 6] # mean concavity
y_data = datasets.load_breast_cancer().data[:, 7] # concave points
df = pd.DataFrame([x_data, y_data]).transpose()
df.head()

 

2. 파라미터 초기화

# parameter theta setting 
# initializing
w = tf.Variable(tf.random_normal([1]))  #[1]개의 랜덤 값 (a, b) 
b = tf.Variable(tf.random_normal([1]))

y_predicted = w * x_data + b

추정값 y_predicted는 x_data값에 w라는 임의 값을 곱하고 b라는 임의 값을 더하여 구합니다.

w,b와 같은 것은 파라미터라고 부릅니다.

 

3. 모델 정의

tf.square(y_predicted - y_data) 는 MSE(Mean Squared Error)입니다.

오차제곱의 합을 줄여야하는 error function 즉 타겟으로 설정합니다.

tf.reduce_mean() 으로 이 오차를 줄이는 쪽으로 작동하게 만들 겁니다.

다음으로, optimizer를 설정해줄겁니다.  최적화 함수로는 경사하강법을 사용할 겁니다.

경사하강법은  error function 을 미분하여 구한 최소값을 구하는 과정인데,

한번의 학습으로 파라미터를 0.001씩 옮겨가며 재학습할 것입니다.

 tf.train.GradientDescentOptimizer(0.001)로 위에서 약술한 내용을 적용할 수 있습니다.

loss = tf.reduce_mean(tf.square(y_predicted - y_data))  #  =MSE
optimizer = tf.train.GradientDescentOptimizer(0.001)
train = optimizer.minimize(loss)

 

4. 모델 학습

이제 50000번의 반복학습을 진행해봅시다.

 w_out, b_out = sess.run([w, b])는 최종 파라미터가 담깁니다.

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

    for step in range(50000):
        sess.run(train)
        if step % 5000 == 0:
            print('Step {}: w {} b {}'.format(step, sess.run(w), sess.run(b)))
            print('loss {}'.format(sess.run(loss)))
            print()

    w_out, b_out = sess.run([w, b])

결과를 확인해봅시다.

Step 0: w [-1.4834067] b [-0.48761797]
loss 0.019444124623795214

Step 5000: w [-1.4834067] b [-0.48761797]
loss 0.00021405852535711186

....


Step 45000: w [-1.4834067] b [-0.48761797]
loss 0.0002138343825807955

Step 50000: w [-1.4834067] b [-0.48761797]
loss 0.00021383327513967477

 

5. 시각화

구현한 모델을 시각화해봅시다.

plt.figure(figsize = (10,10))
plt.plot(x_data, y_data, 'bo', label='Real data')
plt.plot(x_data, x_data * w_out + b_out, 'go', label='Prediction')
plt.legend()
plt.show()

만족스럽지 못한 결과를 얻었네요.. 다음은 loss를 더 줄일방법에 대해서 이야기해봅시다.

 

6. 모델 수정

사실 x_data,y_data의 shape는 애매한 상태였습니다.

((569,), (569,))

_x_data = tf.reshape(x_data, [len(x_data),1])
_y_data = tf.reshape(y_data, [len(x_data),1])

(TensorShape([Dimension(569), Dimension(1)]),
 TensorShape([Dimension(569), Dimension(1)]))

위 코드를 입력하여 차원을 정확히 정의해줍시다.

 

또한 딥러닝의 꽃 은닉층을 추가하여 모델을 더이상 선형이 아닌 정교한 모델을 만들것입니다.

은닉층에는 더이상 하나의 파라미터가 아니라 더 많은 파라미터를 부여할것입니다.

또한 활성화함수로 elu함수를 사용합니다.

elu 함수

 

_x_data = tf.reshape(x_data, [len(x_data),1])
_y_data = tf.reshape(y_data, [len(x_data),1])


# parameter theta setting 
# initializing
W1 = tf.Variable(tf.random_normal([1, 5],dtype =tf.float64))  #[1,5] 5개의 랜덤 값 (a, b) 
W2 = tf.Variable(tf.random_normal([5, 3],dtype =tf.float64))  #[5, 3] 15개의 랜덤 값 (a, b) 
W_out = tf.Variable(tf.random_normal([3, 1],dtype =tf.float64))  #[3, 1] 3개의 랜덤 값 (a, b) 

hidden1 = tf.nn.elu(tf.matmul(_x_data,W1))  #lelu 
hidden2 = tf.nn.elu(tf.matmul(hidden1,W2))  #lelu
output = tf.matmul(hidden2,W_out)

loss = tf.reduce_mean(tf.square(output - _y_data))
optimizer = tf.train.AdamOptimizer(0.001)
train = optimizer.minimize(loss)

모델을 다시 실행해봅시다.

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

    for step in range(50000):
        sess.run(train)
        if step % 5000 == 0:
            print('Step {}:'.format(step))
            print('loss {}'.format(sess.run(loss)))
            print()

    output = sess.run(output)
Step 0:
loss 0.09586163805218881

Step 5000:
loss 0.0002146719423880633

...

Step 40000:
loss 0.0002127702555024712

Step 45000:
loss 0.00021186375895448142
plt.figure(figsize = (10,10))
plt.plot(x_data, y_data, 'bo', label='Real data')
plt.plot(x_data, output, 'go', label='Prediction')
plt.legend()
plt.show()

7. 템플릿

x_data = datasets.load_breast_cancer().data[:, 6] # 주변 이웃 중 하위 계층의 비율
y_data = datasets.load_breast_cancer().data[:, 7] # 집의 가격 (in $1,000s)

_x_data = tf.reshape(x_data, [len(x_data),1])
_y_data = tf.reshape(y_data, [len(x_data),1])


# parameter theta setting 
# initializing
W1 = tf.Variable(tf.random_normal([1, 5],dtype =tf.float64))  #[1]개의 랜덤 값 (a, b) 
W2 = tf.Variable(tf.random_normal([5, 3],dtype =tf.float64))  #[1]개의 랜덤 값 (a, b) 
W_out = tf.Variable(tf.random_normal([3, 1],dtype =tf.float64))  #[1]개의 랜덤 값 (a, b) 

hidden1 = tf.nn.elu(tf.matmul(_x_data,W1))  #lelu 
hidden2 = tf.nn.elu(tf.matmul(hidden1,W2))  #lelu
output = tf.matmul(hidden2,W_out)


#error func 정의 activaition 정의 모델 훈련
loss = tf.reduce_mean(tf.square(output - _y_data))
optimizer = tf.train.AdamOptimizer(0.001)
train = optimizer.minimize(loss)

#모델 실행
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer()) 

    for step in range(50000):
        sess.run(train)
        if step % 5000 == 0:
            print('Step {}:'.format(step))
            print('loss {}'.format(sess.run(loss)))
            print()

    output = sess.run(output) 
    
# 시각화
plt.figure(figsize = (10,10))
plt.plot(x_data, y_data, 'bo', label='Real data')
plt.plot(x_data, output, 'go', label='Prediction')
plt.legend()
plt.show()



# 반복 실행
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer()) 

    for step in range(50):
        sess.run(train)
        if step % 10 == 0:
            print('Step {}: w {} b {}'.format(step, sess.run(w), sess.run(b)))
            print('loss {}'.format(sess.run(loss)))
            
            
            plt.figure(figsize = (10,10))
            plt.plot(x_data, y_data, 'bo', label='Real data')
            plt.plot(x_data, output, 'go', label='Prediction')
            plt.legend()
            plt.show()
            
            print()

    w_out, b_out = sess.run([w, b])
728x90
Comments