케라스 창시자에게 배우는 딥러닝

keras_dl_b

<케라스 창시자에게 배우는 딥러닝> 도서 리뷰 영상(홍정모 교수님)
★★★★★ 번역자는 이 책의 가장 큰 장점입니다.(mo**05 님)
★★★★★ 박해선님 이 분야 기술 번역은 최고 ^^ ..(sa**ke 님)
♥♥♥♥ 인공지능에 대해 알고 싶은 분이라면 추천드려요~(lj**999 님)
★★★★★ 이론과 코드를 함께 제공하는 아주 좋은 케라스 입문서(정*준 님)

이 책은 케라스 창시자이자 구글 AI 연구원인 프랑소와 숄레(François Chollet)의 “Deep Learning with Python“의 번역서입니다.

이 책은 딥러닝, 신경망, 머신 러닝의 기초와 컴퓨터 비전, 텍스트, 시퀀스, 생성 모델을 위한 딥러닝 같은 고급 기법을 모두 다룹니다. 이외에도 딥러닝의 가능성과 한계, 저자가 생각하는 딥러닝의 방향과 비전을 엿볼 수 있습니다. 실전과 같은 다양한 예제를 수록했으며, 수학 장벽을 없애고자 수학적 표기 없이 직관적이고 간결한 코드로 개념을 설명하고 있습니다.

바쁜 와중에도 시간을 내어 책을 읽고 추천사를 써 주신 이상훈 님, 전태균 님께 감사드립니다. 많은 정성을 들여 베타 테스트에 참여해 주신 김재범 님, 김영하 님, 김은경 님, 신성기 님, 이문환 님, 조동헌 님, 이요셉 님, 권성환 님, 이정연 님, 이효조 님께 감사드립니다. 작업의 모든 과정을 친절히 안내해 주신 길벗 출판사의 안윤경 님과 둔탁한 글을 다듬어 주신 김윤지 님께 감사드립니다. 그 외 책을 만드는 데 도움을 주신 모든 분들에게 감사드립니다.

  • 온라인(전자책)/오프라인 서점에서 판매중입니다. [YES24], [교보문고], [리디북스]
  • 476 페이지, 종이책: 33,000원—>29,700원
  • 이 책에 실린 코드는 깃허브에서 주피터 노트북으로 볼 수 있습니다. [github], [nbviewer]
  • 이 책의 코드는 Keras 2.2.2, 2.2.4 버전에서 테스트 되었습니다.
  • 원서에 대한 소개번역 후기를 블로그에 적었습니다.

이 페이지에서 책의 에러타와 Keras 버전 변경에 따른 바뀐 점들을 계속 업데이트 하겠습니다. 구글 그룹스 도서 메일링 리스트에 가입하시면 책의 에러타나 수정사항을 자동으로 수신할 수 있습니다.

이 책에 대해 궁금한 점이나 오류가 있으면 이 페이지 맨 아래 ‘Your Inputs’에 자유롭게 글을 써 주세요. 또 제 이메일을 통해서 알려 주셔도 되고 구글 그룹스 머신러닝 도서 Q&A에 글을 올려 주셔도 좋습니다.

저자 프랑소와도 맘에 든다고 하네요! 🙂

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

감사합니다! 🙂


Outputs (aka. errata)

  • 1: 2쇄에 반영되었습니다.
  • 2~8: 3쇄에 반영되었습니다.
  • 9: 4쇄에 반영되었습니다.
  1. (p435) 아나콘다 배포판이 파이썬 3.6 버전에서 3.7 버전으로 업그레이드되었습니다. 텐서플로를 설치하려면 파이썬 3.6 버전이 필요합니다. 파이썬 3.6 버전의 아나콘다 배포판을 안내하기 위해 밑에서 두 번째 문단 끝에 다음 문장을 추가합니다. “파이썬 3.7 버전과 2.7 버전 다운로드 버튼만 보인다면 다음 주소에서 파이썬 3.6 버전 아나콘다 배포판을 직접 다운로드 받으세요(https://repo.anaconda.com/archive/Anaconda3-5.2.0-Windows-x86_64.exe).
  2. 넓이‘로 쓴 것을 ‘너비‘로 정정합니다. (정*현 님)
    • p69 주석 14번
    • p171 아래에서 두 번째 문단
    • p174 아래에서 첫 번째 문단
    • p175 그림 5-2 아래 첫 번째 줄
    • p177 그림 5-4와 그림 5-4 아래 첫 번째 줄
    • p178 첫 번째 줄과 그림 5-5 아래 첫 번째 줄
    • p179 첫 번째 문단과 그림 5-7 아래 첫 번째 줄
    • p194 코드 5-11 아래 두 번째 리스트 항목
    • p220 5.4.1절 아래 첫 번째 문단
    • p300 6.4절 아래 첫 번째 문단
  3. (p181) 위로부터 두 번째 리스트 항목에서 “1만 5,800개의“를 “약 15.8백만 개의“로 정정합니다.(정*현 님)
  4. (p151) 혼동되지 않도록 아래에서 첫 번째 문단에서 “훈련 데이터의 손실이 낮을수록 테스트 데이터의 손실이 낮습니다.“를 “이 때는 훈련 데이터의 손실이 낮아질수록 테스트 데이터의 손실도 낮아집니다.“로 변경합니다.(정*현 님)
  5. (p79) 2.4절 첫 번째 문장 아래 output = relu(dot(W, input) * boutput = relu(dot(W, input) + b로 정정합니다.(김*영 님)
  6. (p329) 코드 2번째 줄에서 right_input = xception_base(right_input)​을 right_features = xception_base(right_input)으로 정정합니다. 4번째 줄에서 [left_features, right_input][left_features, right_features]로 정정합니다.(김*호 님)
  7. (p105) 단어가 1만개이므로 인덱스는 9,999까지입니다. 마지막 코드 블럭 위 문장에서 “단어 인덱스는 10,000을 넘지 않습니다”를 “단어 인덱스는 9,999을 넘지 않습니다”로 정정합니다.
  8. 클래스의 인스턴스를 아마존 AWS의 인스턴스와 혼돈되지 않도록 객체로 변경합니다.
    • (p124) 3.5.5 절의 첫 문장에서 “모델 인스턴스의 predict 메서드는”을 “모델 객체의 predict 메서드는”으로 변경합니다.
    • (156) 코드 4-6 위의 문장에서 “케라스의 가중치 규제 인스턴스를 층의 키워드”를 “케라스의 가중치 규제 객체를 층의 키워드”로 변경합니다. 주석 14에서 “클래스의 인스턴스를 반환하는”을 “클래스의 객체를 반환하는”로 변경합니다.
    • (p222) 세 번째 줄에서 “모델 인스턴스를 만들 때”를 “모델 객체를 만들 때”로 변경합니다. 코드 5-27의 제목에서 “모델 인스턴스 만들기”를 “모델 객체 만들기”로 변경합니다.
  9. (p159) 그림 4-8의 드롭아웃이 적용된 행렬을 표현한 오른쪽 그림에서 두 번째 행, 첫 번째 열의 0.6은 드롭아웃되었으므로 0.0으로 정정합니다.
  10. (p145) 코드 4-2에서 다음의 마지막 네 라인은 for 문 밖으로 나와야 합니다.(임*성 님)
    validation_score = np.average(validation_scores)
    
    model = get_model()
    model.train(data)
    test_score = model.evaluate(test_data)
  11. (p253) 역주 8번과 9번이 서로 바뀌었습니다.(지*광 님)
  12. (p448, 449) 텐서플로 1.13.0 버전부터 CUDA 10 버전을 사용합니다. 부록 B.2에 언급된 경로를 다음과 같이 변경합니다.
  13. (p435) 최신 텐서플로는 파이썬 3.7 버전을 지원하므로 마지막에서 두 번째 문단 “아나콘다 배포판의 파이썬 3.6 버전과 파이썬 2.7 버전을 내려받을 수 있습니다. 이 두 버전의 차이에 대해 잘 모르거나 파이썬 2.7로 작성한 프로젝트가 이미 있는 것이 아니라면 대부분의 경우 파이썬 3.6이 적합합니다. 파이썬 3.7 버전과 2.7 버전 다운로드 버튼만 보인다면 다음 주소에서 파이썬 3.6 버전 아나콘다 배포판을 직접 다운로드 받으세요(https://repo.anaconda.com/archive/Anaconda3-5.2.0-Windows-x86_64.exe).“를 “아나콘다 배포판의 파이썬 3.7 버전과 파이썬 2.7 버전을 내려받을 수 있습니다. 이 두 버전의 차이에 대해 잘 모르거나 파이썬 2.7로 작성한 프로젝트가 이미 있는 것이 아니라면 대부분의 경우 파이썬 3.7이 적합합니다.”와 같이 바꿉니다.
  14. (p291) 위에서 다섯 번째 줄에서 “타임스템“을 “타입스텝“으로 정정합니다.(지*광 님)
  15. (p210) 맨 처음 나오는 매개변수 리스트의 값을 깃허브와 동일하게 맞춥니다. rotation_range=20, width_shift_range=0.1, height_shift_range=0.1, shear_range=0.1, zoom_range=0.1 (서* 님)
  16. (p32) 중간 부분의 세 번째 항목 “알고리즘의 성능을 측정하는 방법은 정확히 분류한 포인트의 비율을 사용하여 알고리즘의 성능을 측정합니다”를 “알고리즘의 성능은 정확히 분류한 포인트의 비율을 사용하여 측정합니다”와 같이 자연스러운 문장으로 고칩니다.(박*호 님)
  17. (p252, 271) 이 책은 시퀀스를 만들 때 문장의 끝부터 차례대로 채웁니다. 오해를 일으키지 않기 위해 252페이지 마지막 문장에서 “20개 단어 이후는 버립니다”를 “20개가 넘는 단어는 버립니다”로 바꿉니다. 271페이지 끝에서 두 번째 문장에서 “처음 500개의 단어만”을 “순서대로 500개의 단어만”으로 바꿉니다.(서* 님)
  18. numpy 1.16.3 버전에서 load() 함수의 allow_pickle 매개변수 기본값이 True에서 False로 바뀌었습니다. 이로 인해 imdb.load_data() 함수에서 오류가 발생합니다. 케라스 다음 버전이 릴리스되기 전까지는 넘파이 버전을 1.16.3 이전으로 유지하세요.(서* 님)
  19. (p298) 네 번째 항목의 의미를 명확하게 나타내기 위해 “유닛 수가 많은 Dense 층이나 Dense 층을 스태킹합니다”을 “유닛 수가 많은 Dense 층 한 개 또는 여러 개의 Dense 층을 스태킹합니다”로 변경합니다.(서* 님)
  20. (p444) 코딩 도장의 강좌 링크를 https://bit.ly/2VQy0k8로 변경합니다.
  21. (p181) 페이지 상단의 두 번째 항목에서 “최종 특성 맵은 22 x 22 x 64 = 30,976개의 가중치를 가집니다”를 “최종 특성 맵은 22 x 22 x 64 = 30,976개의 원소를 가집니다”로 정정합니다.(sc***@gmail.com 님)

 


Your Inputs

케라스 창시자에게 배우는 딥러닝”에 대한 16개의 생각

  1. 원명

    바로 예약구매했습니다! 책 내용 기대하겠습니다! (원서는 8장 보고 있습니다ㅋㅋㅋㅋ)
    고생 많으셨습니다. 감사합니다^^

    Liked by 1명

    응답
  2. 재영

    안녕하세요!

    P.225~P.235를 보다가 문의 사항이 있어 글남깁니다!

    1. 각 Conv layer 및 Pooling layer를 통과를 하면 할 수록 각 Conv layer의 필터 및 Pooling layer를 통과하기 때문에 원본이미지의 형태가 점점 더 희석된다.라고 이해해도 되는지 궁금합니다. (책에서도 고양이가 점점 희미해짐)

    2. 예를들어 층이 5개가 있다고 했을 때 각 층마다 filter (3X3)의 가중치는 랜덤하게 배정이 된다고 하면, 1 -> 2 -> … -> 5 각 층을 통과 할 때마다 원본이미지의 형태가 점점 더 희석되게 되는데 어떻게 filter는 제일 마지막 층에서 추상화 되는지 (edge-> … -> object) 궁금합니다 (즉, 층이 깊어 질 수록 이미지가 점점 더 희미해지면서 정보를 읽어 가는것 같은데, 필터는 또 더 선명해 지는게 어떤 원리인지 궁금합니다.)

    3. model.add(layers.Conv2D(32, (3, 3), activation=’relu’, input_shape=(28, 28, 1))) 라고 할 때,
    해당 층 다음에는 어떻게 보면 원본이미지가 아니라 3X3의 32개의 필터가 적용된 (26, 26, 32) 의 이미지에 대해 학습을 한다고 이해해도 되는지 궁금합니다.

    감사합니다.

    좋아요

    응답
    1. 박해선 글의 글쓴이

      안녕하세요. 희석된다는 표현은 오해를 일으키기 쉽습니다. 이 예는 이미지를 사용한 것이라서 활성화 출력을 이미지로 그렸을 뿐입니다. 네트워크가 변형하는 대상은 실제 이미지가 아니라 그냥 고차원 텐서라고 생각하는 것이 좋습니다. 신경망은 타깃을 예측하기 위해 텐서를 어떤 형태로 변형합니다. 이런 과정은 어떤 의미를 부여하기 어려운 경우가 많습니다. 네트워크의 층은 이전 층의 출력(특성맵, 즉 고차원 텐서)을 입력으로 사용하여 학습한다고 생각하세요. 감사합니다. 🙂

      Liked by 1명

      응답
  3. 지환

    안녕하세요. keras/examples/mnist_cnn.py가 실행되지 않습니다.
    2019-03-02 19:41:57.976044: E tensorflow/stream_executor/cuda/cuda_dnn.cc:334] Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
    2019-03-02 19:41:57.987056: E tensorflow/stream_executor/cuda/cuda_dnn.cc:334] Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR

    그리고

    tensorflow.python.framework.errors_impl.UnknownError: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.

    라는 에러가 뜹니다. 텐서플로우와 케라스 둘다 잘 실행되고 있습니다. 안될만한 이유가 있을까요?
    tensorflow==1.13.1 cuda==10.0 cudnn=7.5.0 keras==2.2.4

    Liked by 1명

    응답
  4. Kim Woongsuk

    3.4-classifying-movie-reviews.ipynb 를 실행해보고 있습니다. ( 아직은 무대뽀로..)
    2.1-a-first-look-at-a-neural-network.ipynb 여기까지는 주피터 노트북에서 문제없이 실행히 잘 되었는데 여기서는 경고 하나가 났고, 뒤에서는 에러가 나서 실행이 안되네요. 어디가 문제일까요?

    (1) 11번째 블럭입니다.
    from keras import models
    from keras import layers

    model = models.Sequential()
    model.add(layers.Dense(16, activation=’relu’, input_shape=(10000,)))
    model.add(layers.Dense(16, activation=’relu’))
    model.add(layers.Dense(1, activation=’sigmoid’))

    WARNING:tensorflow:From C:\Anaconda3\lib\site-packages\tensorflow\python\framework\op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
    Instructions for updating:
    Colocations handled automatically by placer.

    뭔가 다음버젼에는 사라질 명령어라는 이야기 같긴 한데요, 정확히 어떤 내용일까요?

    (2)17번째 블럭입니다.
    여기서 아예 실행이 멈추어서 뒤로 넘어가지 못하고 있습니다.

    history = model.fit(partial_x_train,
    partial_y_train,
    epochs=20,
    batch_size=512,
    validation_data=(x_val, y_val))

    결과
    WARNING:tensorflow:From C:\Anaconda3\lib\site-packages\tensorflow\python\ops\math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
    Instructions for updating:
    Use tf.cast instead.
    Train on 15000 samples, validate on 10000 samples
    Epoch 1/20
    —————————————————————————
    InternalError Traceback (most recent call last)
    in
    3 epochs=20,
    4 batch_size=512,
    —-> 5 validation_data=(x_val, y_val))

    C:\Anaconda3\lib\site-packages\keras-2.2.4-py3.6.egg\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
    1176 steps_per_epoch=steps_per_epoch,
    1177 validation_steps=validation_steps,
    -> 1178 validation_freq=validation_freq)
    1179
    1180 def evaluate(self,

    C:\Anaconda3\lib\site-packages\keras-2.2.4-py3.6.egg\keras\engine\training_arrays.py in fit_loop(model, fit_function, fit_inputs, out_labels, batch_size, epochs, verbose, callbacks, val_function, val_inputs, shuffle, callback_metrics, initial_epoch, steps_per_epoch, validation_steps, validation_freq)
    202 ins_batch[i] = ins_batch[i].toarray()
    203
    –> 204 outs = fit_function(ins_batch)
    205 outs = to_list(outs)
    206 for l, o in zip(out_labels, outs):

    C:\Anaconda3\lib\site-packages\keras-2.2.4-py3.6.egg\keras\backend\tensorflow_backend.py in __call__(self, inputs)
    2965 return self._legacy_call(inputs)
    2966
    -> 2967 return self._call(inputs)
    2968 else:
    2969 if py_any(is_tensor(x) for x in inputs):

    C:\Anaconda3\lib\site-packages\keras-2.2.4-py3.6.egg\keras\backend\tensorflow_backend.py in _call(self, inputs)
    2923 fetched = self._callable_fn(*array_vals, run_metadata=self.run_metadata)
    2924 else:
    -> 2925 fetched = self._callable_fn(*array_vals)
    2926 return fetched[:len(self.outputs)]
    2927

    C:\Anaconda3\lib\site-packages\tensorflow\python\client\session.py in __call__(self, *args, **kwargs)
    1437 ret = tf_session.TF_SessionRunCallable(
    1438 self._session._session, self._handle, args, status,
    -> 1439 run_metadata_ptr)
    1440 if run_metadata:
    1441 proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

    C:\Anaconda3\lib\site-packages\tensorflow\python\framework\errors_impl.py in __exit__(self, type_arg, value_arg, traceback_arg)
    526 None, None,
    527 compat.as_text(c_api.TF_Message(self.status.status)),
    –> 528 c_api.TF_GetCode(self.status.status))
    529 # Delete the underlying status object from memory otherwise it stays alive
    530 # as there is a reference to status from this from the traceback due to

    InternalError: Blas GEMM launch failed : a.shape=(512, 10000), b.shape=(10000, 16), m=512, n=16, k=10000
    [[{{node dense_1/MatMul}}]]
    [[{{node loss_3/mul}}]]

    좋아요

    응답
    1. 박해선 글의 글쓴이

      혹시 GPU를 사용하시나요? 한 프로세스가 GPU를 사용하고 있다면 다른 프로세스는 GPU를 사용하지 못합니다. 혹시 실행 중인 노트북이 있다면 종료하고 시도해 보세요. deprecated 경고는 향후에 사라질 api를 알려 줍니다. 혹시 최신 텐서플로(1.13.1)를 설치하셨는지 확인해 보세요.

      좋아요

      응답
      1. Kim Woongsuk

        주말에도 이렇게 답변 달아주셔서 완전 감사합니다 ! 재부팅하고 다 끄고 하나만 실행하니 이 문제는 해결되었습니다. 텐서플로는 1.12버젼이던데, 최신버젼을 쓰면 문제가 발생할 확률이 높아지나요? 즉 최신버젼보다는 낮은 버젼의 안정화된 버젼을 쓰는것이 좋나요?

        Liked by 1명

  5. 유영동

    p197 (초판),
    train_generator = … batch_size=32, # <— batch_size=20
    validation_generator = … batch_size=32, # <– batch_size=20

    동작에는 문제가 될 것 같지 않지만,
    p189 처럼, batch_size=20 으로 하는 것이 정상적이지 않을 까요?

    좋아요

    응답
    1. 박해선 글의 글쓴이

      안녕하세요. 배치 크기는 문제에 따라 적절한 값을 찾아야 하는 하이퍼파라미터 중 하나입니다. 일반적으로 2의 배수를 선택하지만 고정된 규칙은 없습니다. 책이라는 관점에서 보면 옵션 값을 일정하게 유지하면 독자의 혼돈을 줄일 수 있을 것 같습니다만 기술적으로는 아무런 문제가 되지 않습니다. 저자가 찾은 적절한 값이라고 이해하는 것이 좋을 것 같습니다. ^^

      좋아요

      응답
  6. 박인혁

    안녕하세요! 케라스 열공하고있는 대학생입니다.

    먼저 좋은 책 감사드립니다 ㅎㅎㅎ
    케라스로 CNN을 설계할때 이미지를 가져오기 위해 책 예제(189p)대로 ImageDataGenerator을 사용하고있는데요,

    여기서 생성되는 train_generator은 리스트모양인거 같은데 슬라이싱하면 에러가 뜨더라고요..
    (train_generator[0] 은 출력이 되는데, train_generator[0:3]이런 식의 코드는 에러가 뜹니다.)

    train_generator로 k겹 교차검증을 하려고 하는데 케라스에서는 k겹 교차검증을 지원해주지는 않나요? 아니면 제너레이터를 슬라이싱할 수 있는 방법이 있나요..

    물론 책(145p)에선 k겹 교차검증을 설명해주고 있는데 ImageDataGenerator을 사용할땐 어떻게 k겹 교차검증을 해야되는지 잘 모르겠습니다 ㅠㅠ

    좋아요

    응답
    1. 박해선 글의 글쓴이

      안녕하세요. 번역서가 맘에 드신다니 기쁘네요.^^ train_generator는 일종의 파이썬 반복자입니다. 순서대로 데이터를 반환하기 때문에 슬라이싱이 지원되지 않습니다. 케라스 자체에서 교차 검증 기능을 제공하지는 않습니다. KerasClassifier로 감싸서 사이킷런의 교차검증을 사용하거나 (ImageDataGenerator를 사용하려면) 수동으로 교차 검증 루프를 만들어야 합니다. 교차 검증은 비교적 데이터가 적은 문제에서 분할로 인한 편향을 막아 주는 방법입니다. 딥러닝은 대량의 데이터를 다루는 경우가 많기 때문에 교차 검증이 필수 과정은 아닙니다.^^ 감사합니다.

      좋아요

      응답

박해선 에 답글 남기기 응답 취소

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.