35. Tensorflow 기초
35.1 머신러닝 / 인공지능
35.1.1 인간이 코딩 등으로 사전에 정의 내린 행동이 아닌 행동을 하도록 하는 것에 가까운 개념(Arthur Samuel, 1959)
35.1.2 스팸필터, 상품추천, 자율주행차 등의 다양한 분야에서 활용되고 있음
35.1.3 머신러닝은 러닝, 즉 "학습"의 개념이 포함됨
35.2 학습
머신러닝을 코딩한다는 것은 결국 "학습"하는 방법을 코딩한다는 것
어떻게 학습을 시킬 것인가? = 어떻게 시행착오를 거치게 할 것인가?
35.2.1 어떤 목표를 정해 놓고 목표를 달성하게 할 경우 의도된 결과를 도출하도록 하는 것
35.2.2 손실 함수, 비용 함수(cost function, loss function)
학습을 통해 그 값을 최소로 만드는 것을 목표로 하는 함수
35.3 Supervised vs. Unsupervised
35.3.1 지도학습(Supervised learning)
35.3.1.1 학습 데이터에 답(labeled data)이 함께 제공
35.3.1.2 고양이 그림에 고양이라고 표시해 주는 것
35.3.1.3 대부분의 머신러닝 알고리즘이 해당됨
35.3.2 비지도학습(Unsupervised learning)
35.3.2.1 학습데이터에 답이 없음(unlabeled data)
35.3.2.2 미리 답을 줄 수 없는 데이터
35.3.2.3 일부 머신러닝 기법에서 사용
35.4 예측과 분류(Prediction / Regression, Classification)
35.4.1 예측(Prediction, Regression)
답을 알고 있는 데이터로 학습을 시킨 후 새로운 데이터가 들어왔을 때 가장 유사한 결과값을 예상하도록 하는 것
35.4.2 분류(Classification)
레이블이 있는 데이터로 분류하는 것을 학습시킨 후 레이블이 없는 새로운 데이터가 들어왔을 때 레이블을 부여하는 것
35.5 딥러닝(Deep Learning)
35.5.1 인공신경망에 기반하여 설계된 개념
35.5.2 1989년 얀 르쿤의 연구킴에 의해 제안된 알고리즘
우편물에 손으로 쓰여진 우편번호를 인식하는 심층 신경망(Deep Neural Network)을 소개함
성공적으로 동작했으나 10개의 숫자를 인식하기 위하여 학습에 소요되는 시간이 3일 정도 걸림
당시에는 컴퓨팅 자원의 한계로 인해 주목을 받지 못함
35.5.3 최근 하드웨어의 발전에 힘입어 다시 주목을 받게 됨
35.5.4 은닉층이 1개인 단순한 인공신경망과 달리 다수의 은닉층을 사용함
35.6 텐서플로
35.6.1 구글에서 만든 오픈소스 머신러닝 프레임웍
35.6.2 다양한 언어를 제공하며 파이썬이 가장 많이 사용됨
35.6.3 2019년 현재 최신 버전은 2.0
35.7 케리스(keras)
35.7.1 파이썬으로 개발된 오픈 소스 신경망 라이브러리
35.7.2 Deeplearning4j, 텐서플로 등의 기존 딥러닝 라이브러리를 기반으로 더 직관적이고 간결한 코드로 빠른 실험이 가능하도록 구현됨
35.7.3 공식 사이트
35.8 텐서플로의 특징
35.8.1 기본적으로 텐서를 활용한 그래프 수치 연산을 하는 도구
35.8.2 수학적인 의미에서의 그래프: 노드와 엣지로 구성된 기하 모형
35.8.3 노드(node): 연산 및 데이터를 정의하는 것
35.8.4 엣지(edge): 노드들을 연결하는 것(데이터의 흐름)
35.8.5 텐서(Tensor): 다차원 데이터 배열
35.8.6 텐서플로 - 텐서가 노드에서 연산되고 엣지를 통해 돌아다닌다
35.9 텐서플로의 기본 문법
35.9.1 Session
35.9.1.1 그래프를 만드는 작업(실행하는 것은 아님)
노드로 연산 및 데이터를 정의하고 코드 흐름으로 엣지를 구성함
35.9.1.2 그래프를 만든 이후 Session을 생성하여 실행을 시켜야 그래프의 시작점부터 모든 연산을 하게 되고 동작을 하게 됨
35.9.1.3 session을 실행시키면 엣지를 통해 데이터들이 출력됨
35.9.1.4 그래프를 만들고(모델링) Session을 만들어 실행시켜야 노드가 엣지를 타고 이동하면서 원하는 형태로 코드가 동작됨)
sess = tf.Session()
sess.run(실행할 코드)
# 또는
with tf.Session() as sess:
35.9.2 Fetch: 코드에서 데이터 값을 미리 정하는 것
35.9.2.1 Feed: Placeholder 등을 통해 데이터 값 없이 구조를 만들고 세션을 실행할 경우 feed_dict을 통해 데이터를 전달
35.9.2.2 placeholder: 노드에 들어갈 데이터의 형식을 미리 정해 놓는 형태
input01 = tf.placeholder(tf.float32)
35.9.3 변수와 상수
35.9.3.1 variable: 학습시키면서 최적화하는 변수의 용도로 사용됨
학습과정에서 지속적으로 바뀔 수 있는 중요한 값
35.9.3.2 constant: 상수
35.9.3.3 변수의 선언
tf.Variable(초기값, 타입)
35.9.3.4 변수의 초기화
tf.global_variables_initializer()를 통해 초기화할 수 있음
변수는 반드시 초기화를 해야 함
초기화는 노드에 값을 입력한다는 의미
35.9.4 placeholder: 주로 입력 데이터를 활용하는 용도로 사용됨
feed_dict을 통해 그래프에 데이터를 흐르게 하기 위한 용도
35.9.5 텐서플로 자료형의 종류
tf.float16: 표준 16비트 부동소수점
tf.float32: 표준 32비트 부동소수점
tf.float64: 표준 64비트 부동소수점
tf.bfloat16: 텐서플로만의 16비트 truncated 부동소수점
tf.complex64: 표준 64비트 복소수
tf.complex128: 표준 128비트 복소수
tf.int8: 표준 8비트 정수
tf.uint8: 표준 8비트 무부호정수(양수 정수)
tf.uint16: 표준 16비트 무부호정수(양수 정수)
tf.int16: 표준 16비트 정수
tf.int32: 표준 32비트 정수
tf.int64: 표준 64비트 정수
tf.bool: 불린(Boolean)
tf.string: 문자열
tf.qint8: 텐서플로만의 Quantized 8비트 정수
tf.quint8: 텐서플로만의 Quantized 8비트 무부호정수(양수)
tf.qint16: 텐서플로만의 Quantized 16비트 정수
tf.quint16: 텐서플로만의 Quantized 16비트 무부호정수(양수)
tf.qint32: 텐서플로만의 Quantized 32비트 정수