- 온라인/오프라인 서점에서 판매 중입니다. [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
- p41:
- 짧은 주소 변경
- p40: (공식 설치 문서) https://goo.gl/qS6Pdw –> https://www.tensorflow.org/install
- p42: (수학 연산 API 문서) https://goo.gl/3lUlv3 –> https://goo.gl/sUQy7M
- p43: (행렬 수학 함수 API 문서) https://goo.gl/sUJniQ –> https://goo.gl/IP0GRR
- p45: (요약 명령 API 문서) https://goo.gl/cH6gW2 –> https://goo.gl/vUIv5S
- p46: (텐서보드 문서) https://goo.gl/6Cyr20 –> https://goo.gl/BgHHSI
- p68: (배열 연산 API 문서) https://goo.gl/5se6Ey –> https://goo.gl/tQxTV0
- p70: (데이터 읽기) https://goo.gl/r3VnFg –> https://goo.gl/6fXe5T
- p85: (텐서플로 API 문서) https://goo.gl/5s0Y2S –> https://goo.gl/WbmTJs
- p91: (텐서플로 공식 튜토리얼) https://goo.gl/s3IRuw –> https://goo.gl/3NT20D
- p125: (전문가 MNIST 예제) https://goo.gl/BzIvt8 –> https://goo.gl/1rE1Gi
- p126: (패딩 옵션 문서) https://goo.gl/DgyiR4 –> https://goo.gl/gFJ6Wk
- p130: (ADAM 문서) https://goo.gl/u9ozMa –> https://goo.gl/b94WgK
- p137: (공식 설치 문서) https://goo.gl/qS6Pdw –> https://www.tensorflow.org/install
- p148, p160: (RNN 문서) https://goo.gl/mmpCF9 –> https://goo.gl/STQcMm
- p160: (텐서플로 RNN 예제) https://git.io/v6UGM –> https://git.io/vyB9H
- p166: (word2vec 문서) https://goo.gl/1eA2vP –> https://goo.gl/OGPUCc
- (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]
시작을 이 책으로 정하고 구매 했네요. 기대중입니다. 앞으로도 많은 공유 부탁 드립니다.
좋아요Liked by 1명
오 감사합니다. 최신 버전에 대한 업데이트는 꾸준히 하려고 생각중입니다. 부디 도움이 되시길 바랄께요. ^^
좋아요좋아요
깃허브에 올려놓으신 예제코드 중 유독 ch2 코드가 안뜨네요…
좋아요좋아요
잘 되는군요^^;;
좋아요Liked by 1명
잘 되신다니 다행이네요. : )
좋아요좋아요
책을 사서 공부하면서 버전 문제 때문에 인터넷에 찾아보면서 했는데 여기 다 모여있었네요! 꾸준히 업데이트 해주셔서 감사합니다! 덕분에 잘 배우고 있습니다
좋아요Liked by 1명
도움이 된다니 다행입니다! 🙂
좋아요좋아요