텐서플로 첫걸음

l

  • 온라인/오프라인 서점에서 판매 중입니다. [YES24], [교보문고], [리디북스], [한빛미디어]
  • 이 책의 코드를 주피터 노트북으로 옮긴 버전은 이곳에서 보실 수 있습니다. 주피터 노트북의 코드는 파이썬 3.5.x 와 텐서플로 v0.9, v0.10, v0.11, v0.12, v1.0, v1.1.0, v1.2.0, v1.3.0, v1.4.0, v1.5.0, v1.6.0, v1.7.0, v1.8.0, v1.9.0, v1.10.0, v1.11.0, v1.12.0, v1.13.1 에서 테스트되었습니다.
  • 책을 내는 조그마한 소감과 도움 주신 분들에 대한 감사를 이곳에 적었습니다.
  • 조르디 토레스 교수가 한국어판 출간을 크게 축하해 주었습니다. 그리고 교수님 홈페이지에도 소개해 주셨네요.

‘텐서플로 첫걸음’은 이 블로그에 올려진 조르디 토레스 교수의 ‘First Contact with TensorFlow’의 한국어 번역판입니다. 블로그의 번역글은 그대로 유지되며 출판된 책에는 좀더 이해가 쉽도록 글을 교정하고 RNN에 관한 챕터를 추가하였습니다. 이 책과 함께 텐서플로 백서(arXiv 1603.04457)와 콘볼루션 계산 가이드해커가 알려주는 뉴럴 네트워크, 해커에게 전해들은 머신러닝을 함께 보시면 좀 더 도움이 되실 것 같습니다.

이 책에 대해 궁금한 점이 있으면 아래 ‘Your Inputs’에 자유롭게 글을 써 주세요. 또 제 이메일을 통해서 알려 주셔도 되고 구글 그룹 텐서플로 첫걸음 Q&A에 글을 올려 주셔도 좋습니다.

적바림(미처 책에 넣지 못한 내용을 추가하고 있습니다)

감사합니다.


Outputs (aka. errata)

  • p51, p55, p60, p61: 코드에서 plt.plot() 메소드를 사용할 때 label=’…’ 옵션을 지정하지 않아 plt.legend() 메소드 호출에서 경고가 발생합니다. 경고를 나타나지 않게 하려면 plt.legend() 메소드를 삭제하거나 plot.plot() 메소드에 label 옵션을 추가합니다.
  • p171 첫줄에서¹ : “num_steps는 20이므로”→ “batch_size가 20이므로”
  • p171 네번째줄에서¹ : “두 개의 계층, 20개의 배치, 200개의 셀이 반영된 [2, 20, 200]의 튜플입니다”→ “두 개의 계층, 두 종류의 상태가 반영된 [2, 2] 크기의 튜플입니다. 튜플의 각 요소는 20개의 배치, 200개의 셀이 반영된 [20, 200] 크기의 텐서입니다.”
  • p175 소스의 중간부분 주석에서¹ : “2*20*200 크기의 튜플입니다.”→ “20*200 텐서를 원소로 갖는 2*2 튜플입니다.”
  • p30 첫문단 끝에¹ : “…어깨를 나란히 하고 싶어합니다. 최근에는 딥러닝 프레임워크 패들패들-PaddlePaddle-(http://www.paddlepaddle.org)을 오픈소스로 공개하면서 딥러닝 소프트웨어 분야에서도 본격적으로 구글, 페이스북과 경쟁을 시작하였습니다.”
  • p30 두번째 문단 중간에¹ : “…제품에 빠르게 적용되도록 노력하고 있습니다. 그 노력으로 이미지 안에 있는 물체의 모양을 정확히 구분하여 분류하는 딥마스크(DeepMask), 샵마스크(SharpMask), 멀티패스넷(MultiPathNet) 공개하였습니다.”
  • p112 코드 열번째 라인² : matm=tf.matmul(x, W) 은 원서로부터 옮겨졌지만 불필요한 라인입니다.
  • p95 두번째 문단에서³ : “예를 들어 2 이미지의 벡터는 [0, 1, 0, …, 0]”→ “예를 들어 2 이미지의 벡터는 [0, 0, 1, …, 0]”
  • p54, p61, p71, p77, p86, p110, p112, p130, p133, p166, p177³: “tf.initialize_all_variables()”→ “tf.global_variables_initializer()”. 텐서플로 버전 0.12 에서 이름이 변경되어서 경고 메세지가 발생합니다. 기존 함수는 향후 릴리즈에서 삭제될 수 있습니다.
  • p172³: “from tensorflow.models.rnn.ptb import reader”→ “import reader”. 텐서플로 모델에 포함된 reader.py 파일이 변경되어서 이를 사용하지 않고 주피터 노트북과 함께 있는 reader.py 를 사용하도록 변경합니다.
  • p774: (v1.0 API 변경) 코드 첫 라인에서, tf.sub(expanded_vectors, → tf.subtract(expanded_vectors,
  • p774: (v1.0 API 변경) concat 메소드의 첫번째 매개변수와 두번째 매개변수의 위치가 바뀜. 따라서 세번째 라인에서, means = tf.concat(0, [ → means = tf.concat([
    다섯번째 라인에서, xrange(k)]) → xrange(k)], 0)
  • p1684: (v1.0 API 변경) 하단 코드 블럭의 첫번째 줄, tf.concat(1, outputs) → tf.concat(outputs, 1)
  • p1694: (v1.0 API 변경) 상단 코드 블럭의 두번째 줄, tf.nn.seq2seq. → tf.contrib.legacy_seq2seq
  • p1724: (v1.0 API 변경) 하단 코드 블럭의 4번째 줄, from tensorflow.python.ops.rnn_cell → from tensorflow.contrib.rnn
  • p1744: (v1.0 API 변경) 코드 중간, tf.concat(1, outputs) → tf.concat(outputs, 1)
    코드의 하단, tf.nn.seq2seq. → tf.contrib.legacy_seq2seq
  • p524: 밑에서 다섯번째 줄, “됩시다” → “됩니다”
  • 수학 API 변경4
    • p41:
      • (코드 블럭 중간에) y = tf.mul(a, b) –> y = tf.multiply(a, b)
      • (아래에서 5번째 줄) ‘tf.mul은 텐서(Tensor)를’ –> ‘tf.multiply는 텐서(Tensor)를’
    • p42: (표 1-1)
      • tf.sub –> tf.subtract
      • tf.mul –> tf.multiply
      • tf.div: 나눗셈의 몫 –> tf.div: 나눗셈의 몫(파이썬 2 스타일)
      • (추가) tf.truediv: 나눗셈의 몫(파이썬 3 스타일)
      • tf.neg –> tf.negative
      • tf.inv –> tf.reciprocal
    • p72: (코드 블럭 중간) y = tf.mul(a, b) –> y = tf.multiply(a, b)
    • p80: (아래에서 두 번째 문단) tf.sub(vectors, centroids) –> tf.subtract(vectors, centroids)
    • p82: (첫 번째 문단과 맨 아래 코드 블럭에서) tf.sub –> tf.subtract
    • p83: (두 번째 문단) tf.sub –> tf.subtract
    • p84: (가운데 코드 블럭에서) tf.sub –> tf.subtract
  • 짧은 주소 변경
  • (v1.1.0 API 변경) 1.1.0 버전에서 RNN 셀을 이용해 같은 변수 범위 내에서 다른 가중치를 가진 오브젝트를 만들려면 RNN 셀 오브젝트를 각기 생성하도록 변경되었습니다. 따라서 [BasicLSTMCell(...)] * num_layers처럼 사용하지 못하고 [BasicLSTMCell(...) for _ in range(num_layers)]와 같이 반복문을 사용해 오브젝트를 각각 생성해야 합니다.
    • (v1.1.0 API 변경) p167 코드와 A.9 코드에서:
    lstm_cell = BasicLSTMCell(config.hidden_size, forget_bias=0.0, state_is_tuple=True)
    # SmallConfig에서는 드롭아웃이 적용되지 않습니다.
    if is_training and config.keep_prob < 1:
        lstm_cell = DropoutWrapper(lstm_cell, config.keep_prob)
    # 두개의 계층을 가진 신경망 구조를 만듭니다.
    cell = MultiRNNCell([lstm_cell] * config.num_layers, state_is_tuple=True)

    lstm_fn = lambda: BasicLSTMCell(config.hidden_size, forget_bias=0.0, state_is_tuple=True, reuse=tf.get_variable_scope().reuse)
    # SmallConfig에서는 드롭아웃이 적용되지 않습니다.
    if is_training and config.keep_prob < 1:
        lstm_fn = lambda: DropoutWrapper(lstm_fn(), config.keep_prob)
    # 두개의 계층을 가진 신경망 구조를 만듭니다.
    cell = MultiRNNCell([lstm_fn() for _ in range(config.num_layers)], state_is_tuple=True)

    로 바꾸어 줍니다.

  • p159: “A.4 언어 모델링” 바로 위 문장의 끝에 주석 추가. “옮긴이_ 텐서플로의 DropoutWrapper 클래스에서 output_keep_prob와 state_keep_prob 매개변수를 조절하여 출력 방향과 순환 방향으로도 드롭아웃을 적용할 수 있습니다.”
  • (v1.7.0 API 변경) 버전 1.7.0부터 tensorflow.examples.tutorials.mnist 모듈이 향후 삭제될 것이라고 경고하고 있습니다. 경고를 피하기 위해 케라스(Keras)를 이용하여 MNIST 데이터셋을 다운로드 받도록 4장과 5장의 예제 코드를 수정하였습니다. 깃허브의 주피터 노트북을 참고해 주세요.
  • p77: seaborn 라이브러리 최신 버전에 맞추어 lmplot 함수의 size 매개변수를 height​로 변경합니다.
  • p67: tf.slice 함수의 설명을 “텐서의 일부분을 삭제합니다”에서 “텐서의 일부분을 추출합니다”로 정정합니다.(김*호 님)
  • p85: “where 함수를 사용하여 매개변수로 받은 불리언 텐서에서 True로 표시된 위치를 값으로 가지는 텐서(Dimension(2000) * Dimension(1))를 만듭니다.<10>”를 “where 함수를 사용하여 매개변수로 받은 불리언 텐서(Dimension(2000) * Dimension(1))에서 True로 표시된 위치를 값으로 가지는 텐서를 만듭니다.”로 변경합니다. 10번 주석 삭제합니다.(김*호 님)
¹ 2쇄에 반영되었습니다.
² 3쇄에 반영되었습니다.
³ 4쇄에 반영되었습니다.
4 5쇄, 6쇄에 반영되었습니다.

Technical Note

  • 부록 A에 있는 코드는 파이썬 3 버전으로 작성되어 있습니다. 파이썬 2 버전에서 실행하실 경우에 run_epoch 함수의 코드 중 cost, *state_list, _ = session.run(fetch_list, feed_dict) 에서 에러가 발생합니다. * 는 언팩(unpack) 연산자로서 여러개의 리턴 값에 대응이 됩니다만 파이썬 2 에서는 이 기능을 지원하지 않으므로 아래와 같이 풀어서 써 주세요.
    temp = session.run(fetch_list, feed_dict)
    cost, state_list = temp[0], temp[1:-1]

Your Inputs

텐서플로 첫걸음”에 대한 7개의 생각

    1. 로드홈 글의 글쓴이

      오 감사합니다. 최신 버전에 대한 업데이트는 꾸준히 하려고 생각중입니다. 부디 도움이 되시길 바랄께요. ^^

      좋아요

      응답
  1. 태인호

    책을 사서 공부하면서 버전 문제 때문에 인터넷에 찾아보면서 했는데 여기 다 모여있었네요! 꾸준히 업데이트 해주셔서 감사합니다! 덕분에 잘 배우고 있습니다

    Liked by 1명

    응답

댓글 남기기

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.