[번역] TensorFlow Ruby API를 소개합니다.

Fred kim
Fred kim
Aug 25, 2017 · 8 min read

(이 글은 Introducing Tensorflow Ruby API 를 번역하였습니다. 본문에 앞서 번역을 흔쾌히 허락해주신 Arafat Khan 님께 감사드립니다. First of all, thanks to Arafat Khan for allowing me to translate.)


TensorFlow 는 데이터 플로우 그래프를 이용해 수학적인 연산을 하기 위한 멋진 오픈소스 라이브러리입니다. 원래 TensorFlow는 Google Machine Intelligence 연구소 산하 Google Brain Team의 연구원들과 엔지니어들에 의해 개발되었습니다. 그들은 deep neural network 연구와 머신러닝 과제를 수행하기 위해 개발했지만, 이것은 다양한 다른 영역에도 충분히 적용될 수 있는 시스템이었습니다.

TensorFlow는 Python 인터페이스와 C ++ 인터페이스를 사용해 계산 그래프를 쉽게 만들고 실행할 수 있습니다. 하지만 TensorFlow는 Python만을 지원하는데, 이점이 Ruby 커뮤니티의 큰 관심을 끌게 되었고, 저도 이것을 Ruby로 옮겨보고 싶어졌습니다. 저는 Somatic.ioSciRuby 재단의 지원을 받아 Ruby API작업을 시작했고 이제 여러분께 공유드리고 싶은 멋진 것들을 찾아냈습니다. 저는 Kharagpur 인도 공과대학교(Indian Institute of Technology, Kharagpur)의 학생이고 오픈소스와 머신러닝에 완전히 매료되어 즐겁게 이 프로젝트를 진행하기로 했습니다.

프로젝트

저는 간단한 gem tensorflow.rb 를 개발했고 SWIG을 사용해 만들기 시작했습니다. 저는 수도 없이 서로 다른 wrapper gem들과 서로 다른 아이디어들을 비교하고 조합해보며 시도했고 마침내 동작하는 것을 발견했습니다.

이 블로그는 몇 가지 소개 예제로 시작하려고 합니다. 이를 통해 현재 가능한 것들에 대해 소개할 수 있으며, 사용자들은 이미지 인식이나 기초적인 신경망 등의 멋진 작업을 해내는데 TensorFlow를 광범위하게 사용할 수 있게 되기를 바랍니다.

설치

gem을 설치하려면 이곳의 단계를 따르세요. 이제 당신이 어떻게 TensorFlow를 사용할 수 있는지 예제를 보여드리겠습니다.


Ruby 로 그래프 생성하고 실행하기

설치가 완전히 되었다면, 당신은 이 파일을 실행할 수 있습니다.

이 프로그램은 [[6.0, 5.5], [57.0, 7.4]] 을 결과로 출력합니다. 이것은 두 tensor의 합에 대한 결과입니다.

이에 대한 가장 쉬운 설명입니다:

graph = Tensorflow::Graph.new
tensor_1 = Tensorflow::Tensor.new([[2, 2.3], [ 10, 6.2]])
tensor_2 = Tensorflow::Tensor.new([[4, 3.2], [ 47, 1.2]])
placeholder_1 = graph.placeholder('tensor1', tensor_1.type_num)
placeholder_2 = graph.placeholder('tensor2', tensor_2.type_num)

여기서 우리는 두 tensor를 정의합니다. 이어서 각각의 tensor에 대응하는 두 placeholder도 정의합니다.

opspec = Tensorflow::OpSpec.new(‘Addition_of_tensors’, ‘Add’, nil, [placeholder_1, placeholder_2])
op = graph.AddOperation(opspec)

그리고나서 두 placeholder를 더하기 위한 명령을 작성합니다.

session_op = Tensorflow::Session_options.new
session = Tensorflow::Session.new(graph, session_op)

다음으로 새로운 tensorflow session을 시작합니다.

hash = {}
hash[placeholder_1] = tensor_1
hash[placeholder_2] = tensor_2
result = session.run(hash, [op.output(0)], [])

그리고 새로운 hash를 정의합니다. 이 hash는 두 tensor에 대응하는 placeholder를 key로, 각 tensor를 value로 갖습니다. 그러고나면 결과를 얻기 위해 session을 실행합니다.

이 문법은 매우 이해하기 쉬우면서도 올바른 결과물을 만들어냅니다. 그래서 누구라도 기초적인 ruby 및 tensorflow 지식만 있다면 사용할 수 있습니다. 이 문서도 읽어보세요.

말이 나온 김에, Ruby — TensorFlow의 또다른 예제를 보여드리겠습니다.

이 예제는 당신이 어떻게 matrix 들의 batch를 얻을 수 있는지를 보여줍니다. 자세히 살펴보면 이전 예제와 매우 유사합니다. 단 하나의 입력만 있고 사용된 op(operation — 역주)는 BatchMatrixDeterminant입니다. 이에 따른 결과는 [[-45.0, -513.0, 1.0]] 인데, 이는 첫 번째, 두 번째 및 세 번째 행렬의 행렬식입니다. 실제로 당신은 다음과 같은 많은 좋은 것들을 할 수 있습니다.

  1. 산술 연산자
    1. 더하기
    2. 빼기
    3. 곱하기 (Element wise multiplication)
    4. 나누기 (Element wise Mod) 등
  2. 기초적인 수학 함수
    1. 지수함수 (Element wise exponent)
    2. power함수 (Element wise power)
    3. 로그함수 (Element wise Log)
  3. 행렬 함수 (이것들이 가장 좋아요)
    1. 행렬 역(Matrix Inversion)
    2. 행렬 곱 (Matrix multiplication)
    3. 행렬 식 (Determinants, diagonal, trace)
    4. 1차 방정식의 해 (Solving a system of linear equations)
    5. cholesky 분해 등 (cholesky decomposition etc.)

실제로, 산술 연산자와 기초 수학 함수 그리고 행렬 함수 에 대한 모든 것은 여기에 언급되어있고, ruby tensorflow 에서도 가능합니다.

또 복잡한 행렬들 곱하기와 같은 복잡한 수학 함수도 가능합니다. 만약 어떻게 이 함수들이 사용되는지 보고 싶다면, 이 스펙 파일을 확인하세요. 또 이 파일을 보면 op들(operation — 역주)을 사용하는 방법에 대해 이해할 수 있습니다.

이 외에도 tensorflow.rb의 이미지 인식프로토콜 버퍼에 대한 튜토리얼을 살펴볼 수 있습니다.

개발자들을 위한 참고사항

저는 Python 라이브러리들이 내부적으로, 근본적으로 어떻게 동작하는지 연구했습니다. plan은 그래프를 생성하고, plan이 실행되는 방식은 Python으로 관리되며, 모든 그래프는 C++ 라이브러리들로 실행되고, 이 라이브러리들은 그래프를 가져와 그래프의 모든 노드들을 실행합니다. 그러므로, 우리가 해야할 것은 그래프 생성 단계를 옮기는 것입니다. Python 이 아닌 Ruby 코드로 planning 하고, 실행은 동일한 C++ 라이브러리에 의존하는 것입니다.

저의 이어질 블로그들에 개발자들과 공유하고 싶은 꽤 쓸모있는 아이디어들이 많이 있습니다. 만일 당신이 상충되는 정의를 발견하면, 아래에 자유롭게 의견을 남겨주세요. 저는 tensorflow에 대한 사람들의 토론을 환영합니다.

감사 인사

이 프로젝트의 자문을 맡아주신 Jason toy (somatic 창립자), Soon Hin Khor (도쿄 대학 박사) 그리고 Sameer Deshmukh (Daru 창립자이며 Sciruby의 멤버) 님들께 특별히 감사드립니다. 제게 모든 방면으로 많이 지원해주고 있습니다. 이분들께 매우 고마움을 느끼고 있습니다.

기여자 명단

  1. Christian Hansen
  2. Geoffrey Litt
  3. Sebastian Deutsch
  4. Victor Shepelev

역주/
* 본 글의 원문은 2016–09–28 에 게시된 글임을 알려 드립니다.
* 자연스러운 번역을 위해 내용 전달에 초점을 두고 원문을 다소 가공해 번역하였습니다.
* 함께 검토해주신 cyan님께 감사드립니다.
* 오역, 오타 등을 발견하시면 아래 댓글을 통해 남겨주세요.

)

Fred kim

Written by

Fred kim

스타트업과 도전을 사랑하는 개발자입니다.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade