텐서(스칼라, 벡터, 행렬, 텐서), 연산, 그래프, 세션 이해하기

실습링크 : https://colab.research.google.com/notebooks/mlcc/tensorflow_programming_concepts.ipynb

https://developers.google.com/machine-learning/crash-course/

구글에서는 머신러닝 단기집중과정이라는 온라인 머신러닝 학습시스템을 제공하고 있습니다.
얼마 전에 한국어로 번역이 되었고 한국인 엔지니어가 감수를 했다고 해서 이 과정을 진행해 보니 머신러닝을 배우기에 좋은 콘텐츠라서 이 과정을 소개해 봅니다.

또 이 과정의 번역은 머신러닝 기술을 사용했다고해서 더 의미가 있는데요, 혼자 공부하면 지루하니 같이 이렇게 온라인상으로 나마 공부해 볼까 합니다.

이번 비디오에서는 텐서플로우(TensorFlow)의 텐서(스칼라, 벡터, 행렬, 텐서), 연산, 그래프, 세션 이해해 봅니다.

텐서플로우 프로그래밍 개념

학습 목표:

  • 다음 개념에 중점을 두고 텐서플로우 프로그래밍 모델의 기본 사항을 배웁니다.
    • 텐서
    • 연산
    • 그래프
    • 세션
  • 기본 그래프를 만드는 간단한 텐서플로우 프로그램 만들기 및 그래프를 실행하는 세션

참고: 이 가이드를 자세히 읽어주세요. 텐서플로우 프로그래밍 모델은 아마 지금까지 알고 있던 다른 모델과 달라서 예상만큼 직관적으로 이해하기 어려울 수 있습니다.

개념 개요

텐서플로우는 임의의 차원을 갖는 배열들을 뜻하는 텐서에서 그 이름이 유래되었습니다.
텐서플로우를 사용하면 차원 수가 아주 높은 텐서를 조작할 수 있습니다. 하지만 대부분은 다음과 같은 저차원 텐서 중 하나 이상을 사용하여 작업하게 됩니다.:
**스칼라는 0-d 배열(0번째 텐서)입니다. 예: \'Howdy\' 또는 5
*
벡터는 1-d 배열(1번째 텐서)입니다. 예: [2, 3, 5, 7, 11] 또는 [5]
*
행렬*은 2-d 배열(2번째 텐서)입니다. 예: [[3.1, 8.2, 5.9][4.3, -2.7, 6.5]]

텐서플로우 연산은 텐서를 만들고 없애고 조작합니다. 일반적인 텐서플로우 프로그램에서 대부분의 코드 행은 연산입니다.

텐서플로우 그래프(또는 산출 그래프데이터플로 그래프)는 그래프 데이터 구조입니다. 많은 텐서플로우 프로그램은 하나의 그래프로 구성되어 있지만, 텐서플로우 프로그램은 여러 그래프를 만들 수도 있습니다. 그래프의 노드는 연산이고; 그래프의 엣지는 텐서입니다. 텐서는 그래프를 따라 흐르고, 각 노드에서 연산에 의해 조작됩니다. 한 연산의 출력 텐서는 보통 다음 연산의 입력 텐서가 됩니다. 텐서플로우는 레이지 실행 모델을 구현하는데, 이는 연결된 노드의 필요에 따라 필요할 때만 노드가 계산된다는 의미입니다.

텐서는 그래프에서 상수 또는 변수로 저장될 수 있습니다. 예상할 수 있듯이 상수는 값이 변하지 않는 텐서를 가지고, 변수는 값이 변할 수 있는 텐서를 가집니다. 하지만 한 가지 예상하지 못한 점은, 상수와 변수가 그래프에서 또 다른 연산이라는 것입니다. 상수는 항상 같은 텐서 값을 반환하는 연산이고, 변수는 할당된 텐서를 반환합니다.

상수를 정의하려면 tf.constant 연산자를 사용하여 그 값을 전달합니다. 예를 들면 다음과 같습니다.

  x = tf.constant([5.2])

유사하게 다음과 같은 변수를 만들 수 있습니다.

  y = tf.Variable([5])

또는 변수를 먼저 만든 다음, 다음과 같은 값을 할당할 수 있습니다. 참고로 항상 기본 값을 지정해야 합니다.

  y = tf.Variable([0])
  y = y.assign([5])

일부 상수 또는 변수를 정의하면 이를 tf.add와 같은 연산과 병합할 수 있습니다. tf.add 연산을 평가할 때 tf.constant 또는 tf.Variable 연산을 호출하여 값을 얻은 다음 그 값의 합으로 새 텐서를 반환합니다.

그래프는 반드시 텐서플로우 세션 내에서 실행되어야 합니다. 세션은 다음을 실행하는 그래프의 상태를 가집니다.

with tf.Session() as sess:
  initialization = tf.global_variables_initializer()
  print y.eval()

tf.Variable을 사용할 때 위에서와 같이 세션 시작 시 tf.global_variables_initializer를 호출하여 명시적으로 초기화해야 합니다.

참고: 세션은 여러 시스템에 그래프 실행을 분산할 수 있습니다(프로그램이 분산 계산 프레임워크에서 실행된다고 가정). 자세한 정보는 분산 텐서플로우를 참조하세요.

요약

텐서플로우 프로그래밍은 기본적으로 두 단계 과정입니다.

  1. 상수, 변수, 연산을 그래프로 결합합니다.
  2. 이 상수, 변수, 연산을 세션 내에서 평가합니다.