Skip to content
aiegoo edited this page Oct 20, 2019 · 1 revision

LogisticRegression2

[01] Tensorflow를 이용한 여러개의 변수를 입력값으로 사용하는 Logistic Regression

  1. 여러개의 변수를 입력값으로 사용하는 Logistic Regression
    • 더 정확한 값을 산출하기위하여 변수가 2개 이상인것
    • tf.placeholder(데이터형, 행렬의 차원, 이름): 함수로 전달할 값을 저장하는 저장소
    • tf.matmul(행렬1, 행렬2): 행렬의 곱

/ws_python/notebook/machine/tsbasic/LogisticRegression2.ipynb

# 여러개의 변수를 입력값으로 사용하는 Logistic Regression
import tensorflow as tf
import numpy as np

# x 데이터 값, 7행 2열 배열
x = np.array([
                 [2, 3],
                 [4, 3],
                 [6, 4],
                 [8, 6],
                 [10, 7],
                 [12, 8],
                 [14, 9]
                 ]) # 데이터
# y 데이터 값, reshape(7, 1): 배열 1행 7열을 7행 1열로 변경한다.
yr = np.array([0, 0, 0, 1, 1, 1, 1]).reshape(7, 1)
# 행렬의 곱셈을 해야함으로 행의 수는 열의 수와 동일하게 1개 생성,
# 행의수는 변수의 열수와 동일하게 해야함, 행렬 곱셈: 1행 2열 * 2행 1열.
# 변수 2개: a1 * x + a2 * x + b, 2행 1열
# 변수 3개: a1 * x + a2 * x + a3 * x + b, 3행 1열
# 활용예
x_data = np.array([
                  [2, 3],
                  [4, 3],
                  [6, 4],
                  [8, 6],
                  [10, 7],
                  [12, 8],
                  [14, 9],
                  [1, 1],
                  [1, 10]
                  ])  # 데이터

print('x_data[index]:', x_data[0])
print('x_data[index]:', x_data[0].shape)
new_x = np.array(x_data[0]).reshape(1, 2)# [7, 6]은 각각 공부 시간과 과외 수업수, 1행 2열로 변경
print('x_data[index]:', new_x)
print('x_data[index]:', new_x.shape)
session.close()
# 기존 그래프 출력시 Jupyter Notebook, Tensorboard 재시작
LOG_DIR = '../../logs' # 폴더는 자동 생성됨. /ws_python/notebook/logs
graph = tf.get_default_graph()
with tf.summary.FileWriter(LOG_DIR) as writer:
    writer.add_graph(graph)

2. 로지스틱 회귀에서 퍼셉트론으로

  1. 로지스틱 회귀를 퍼셉트론 방식으로 표현한 예
    • x1과 x2가 입력되고, 각각 가중치 a1, a2를 만남
    • 여기에 b 값을 더한 후 시그모이드 함수를 거쳐 1 또는 0의 출력 값 y를 출력
    • 이 그림의 개념이 1957년, 코넬 항공 연구소의 프랑크 로젠블라트라는 사람이 발표한, ‘퍼셉트론(perceptron)’임
    • 이 퍼셉트론은 그 후 여러 학자들의 노력을 통해 인공 신경망, 오차 역전파 등의 발전을 거쳐 지금의 딥러닝으로 이어지게 됨 로지스틱

[01] Tensorflow 1.6(AVX/AVX2 지원 CPU), 1.5(AVX 미지원 구형 CPU)

  • Google이 2015년 아파치 라이센스 2.0으로 오픈소스 프레임워크로 공개되었다.
  • 데이터 흐름 그래프를 기반으로하는 수치 계산을 위한 소프트웨어 프레임워크이다.
  • 머신러닝 알고리즘 중에서도 심층신경망을 표현하고 구현하기 위한 인터페이스를 주 목적으로 설계되었다.
  • 내부는 C++로 개발되었으며 간결한 호출을위해 주로 파이썬을 이용하여 Tensorflow를 사용한다.
  • 텐서플로는 경사 하강법등 모든 미분을 개발자가 단순한 함수 호출로 자동 처리 할 수 있도록 지원한다.
  • 텐서플로는 미분 자동 계산기임.
  • 텐서플로 오차를 줄이기위해 미분을 사용하며 자동 미분 계산기 열활을 함.
  • 텐서플로는 파이썬 기반의 딥러닝 라이브러리인 케라스를 이용하여 더욱 적은 코드로 고성능의 최적화된 머신러닝 개발 환경을 구축할 수 있다.
  • Tensorflow + Keras를 결합하여 개발(2.0부터는 표준적인 방법으로 지정됨)
  • 데이터에 대하여 선형회귀, 이항 분류, 다중분류를 할것인지에 따라 활성화 함수가 달라진다.
  1. 텐서 구조
    • Tensor: 텐서플로에서의 자료형의 일종으로 배열과 비슷, 랭크와 셰이프로 구성됨 . Rank: 배열에서 데이터의 차원의 수

      . Rank 0: 스칼라(int 형등의 숫자하나), 각각의 한개의 요소를 이르는 말, 0차원 텐서 . Rank 1: 벡터, 어떤 방향성(목적, 성질)을 갖는 1차원 배열의 데이터, 1차원 텐서 . Rank 2: 행과 열로 구성된 행렬, 2차원 텐서, 2차원 배열 형태 . Rank 3: 3차원 텐서, 3차원 배열 . Rank 4이상: n-Tensor, n 차원 텐서라고 부름, 4차원 배열 이상, 이미지 처리시 주로 이용.

      . Shape: Rank에 따른 요소의 정보 예) Shape의 구분 Rank 1(1차원 배열의 내용): [1., 2., 3.]:

      Rank 2(2차원 배열), Shape [2, 3](2차원 배열의 내용): [ [1., 2., 3.], [1., 2., 3.] ]

      Rank 3(3차원 배열), Shape [2, 1, 3](3차원 배열의 내용): [ [ [1., 2., 3.] ], [ [7., 8., 9.] ] ]

[02] 텐서와 그래프 실행 절차

  1. 그래프 실행 준비 import tensorflow as tf

a = tf.constant(100) b = tf.constant(200) c = tf.constant(300)

d = tf.add(tf.multiply(a, b), c)

  1. 그래프의 생성 시작
  • tf.global_variables_initializer(): 세션 속의 tf.Variable 형태로 저장한 변수를 초기화 해주는 기능을 수행
  • 텐서플로우는 세션을 기준으로 성능을 향상시키기 위해 정의와 실행을 분리함

session = tf.Session() tf.global_variables_initializer()

  1. 실행 1 단계: 개발자가 코드 선언후 실행시에 텐서로 변환되어 그래프의 tree 형태로 구성됨, 내부적으로 방향성 그래프가 생성이됨
  2. 실행 2 단계: 하나의 Session이 생성되고 Session에 값을 할당하여 tree를 운행(실행)하게됨. image
  1. Session 객체의 run() 메소드를 이용한 연산 그래프 실행 및 결과 출력 print(session.run([a, b, c, d])) # [100, 2, 300, 500]

  2. 메모리 해제 session.close()

[03] 상수(constant), 변수(Variable), 텐서의 데이터 타입

  1. constant()

    • 상수 선언 함수
    • dtype: 데이터 타입
    • name: 그래프 노드의 이름, Tensorflow에서 사용되는 변수명, 생략 가능 선언 : tf.constant(값, dtype=데이터 타입, name=’그래프 노드의 이름’) 예) kor = tf.constant(5, dtype=tf.float32, name=’tf_kor’)
  2. Variables : 변수로 값의 변화는 Tensor가 연산되면서 바뀌게 됩니다. 선언 : tf.Variable(값, dtype=타입, name=’그래프 노드의 이름’) 데이터 타입: tf.float16, float32, float64, complex64, complex128등 예) x = tf.Variable(9, dtype=tf.float32, name=’tf_x’) weight = tf.Variable([1, 2, 3, 4, 5], name=’tf_weight’)

  3. 텐서의 데이터 타입

  • 텐서플로우는 텐서라는 기본 데이터 구조로 모든 데이터들을 표현합니다. 텐서는 동적 사이즈를 갖는 다차원 데이터 배열로 볼 수 있으며 불리언(boolean), 문자열(string)이나 여러 종류의 숫자형 같은 정적 데이터 타입을 가집니다.

    텐서플로우 타입 파이썬 타입 설명


    DT_FLOAT tf.float32 32비트 실수 DT_INT16 tf.int16 16비트 정수 DT_INT32 tf.int32 32비트 정수 DT_INT64 tf.int64 64비트 정수 DT_STRING tf.string 문자열 DT_BOOL tf.bool 불리언

[04] Tensorflow 기초 문법, 상수(constant), 변수(Variable), 텐서의 데이터 타입 실습

  • 텐서플로는 텐서들의 연산을 먼저 정의하여 그래프를 만들어 놓고, 이후 연산을 실행하는 코드를 넣어 '원하는 시점'에 실제 연산을 수행함(지연 실행: Lazy evaluation).
  • 그래프의 실행은 Session안에서 이루어지며 Session 객체의 run 메소드를 이용하여 수행
  • shape: 데이터의 차원, 갯수
  1. 경고 메시지 숨기기 import warnings warnings.filterwarnings(action='ignore')

warnings.filterwarnings(action='default') # 메시지 출력, 기본값

▷ /ws_python/notebook/machine/tsbasic/TSbasic.ipynb

import warnings warnings.filterwarnings(action='ignore')

warnings.filterwarnings(action='default')

import matplotlib.pyplot as plt %matplotlib inline

.....

placeholder: 파이썬의 값을 텐서플로의 그래프로 전달

a = tf.placeholder(dtype=tf.int32, name='a') # 연산을 실행 할 수 없음. b = tf.constant(1, name='b') c = a + b

with tf.Session() as session: # print(session.run(c)) # ERROR print('a+b=', session.run(c, feed_dict={a: 1})) # python --> tensorflow 값 대입

..... a = tf.constant([1, 2, 3], name='a') b = tf.constant([4, 5, 6], name='b') c = a + b

with tf.Session() as session: print('a+b:', session.run(c))

..... a = tf.constant(1, 2], [3, 4, name='a') b = tf.constant(1], [2, name='b')

행렬의 곱의 결과: 첫번째 행렬의 행, 두번째 행렬의 열, 2행 2열 * 2행 1열 = 2행 1열

행렬의 곱의 조건: 첫번째 행렬의 열과 두번째 행렬의 행의 값이 같아야함.

c = tf.matmul(a, b)
d = tf.constant([1, 2, 3], name='d')

print('shape of a:', a.shape) print('shape of b', b.shape) print('shape of c', c.shape) print('shape of d', d.shape)

with tf.Session() as session: print(session.run(a)) print(session.run(b)) print('--------------------') print(session.run(c)) print('--------------------') print(session.run(d))

.....

2차원 배열, 행의수는 무제한, 열의 수는 2 고정

a = tf.placeholder(shape=(None, 2), dtype=tf.int32, name='a')

with tf.Session() as session: # print('a=', session.run(a, feed_dict={a: [1]})) # ERROR # print('a=', session.run(a, feed_dict={a: [1, 2]})) # ERROR print('a=', session.run(a, feed_dict={a: 1, 2})) print('a=', session.run(a, feed_dict={a: 1, 2], [3, 4})) print('a=', session.run(a, feed_dict={a: 1, 2], [3, 4], [5, 6})) # print('a=', session.run(a, feed_dict={a: 1], [3], [5})) # ERROR, 열의 수가 틀림

.....

Tensorboard 사용

그래프 초기화는 커널을 Restart 할 것

(machine) C:\Windows\system32> tensorboard --logdir=C:/ai_201909/ws_python/notebook/logs

import tensorflow as tf

a = tf.constant(1, name='a') b = tf.constant(1, name='b') c = a + b

LOG_DIR = '../../logs' # 폴더는 자동 생성됨. /ws_python/notebook/logs graph = tf.get_default_graph() with tf.summary.FileWriter(LOG_DIR) as writer: writer.add_graph(graph)

[05] Tensorboard의 사용

  1. Tensorboard 용 log 파일 기록 script # 기존 그래프 출력시 Jupyter Notebook, Tensorboard 재시작 LOG_DIR = '../../logs' # 폴더는 자동 생성됨. /ws_python/notebook/logs graph = tf.get_default_graph() with tf.summary.FileWriter(LOG_DIR) as writer: writer.add_graph(graph)

  2. 실행 (base) C:\Windows\system32>activate machine (machine) C:\Windows\system32> tensorboard --logdir=C:/ai_201909/ws_python/notebook/logs

  3. 접속 http://soldesk-PC:6006

Clone this wiki locally