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

keras_dl_b

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

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

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

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

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

이 페이지에서 책의 에러타와 Keras 버전 변경에 따른 바뀐 점들을 계속 업데이트 하겠습니다.

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

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

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

감사합니다! 🙂


Outputs (aka. errata)

  • 1: 2쇄에 반영되었습니다.
  • ~8: 3쇄에 반영되었습니다.
  • 9: 4쇄에 반영되었습니다.
  • ~21: 5쇄에 반영되었습니다.
  • ~24: 6쇄에 반영되었습니다.
  • 25: 7쇄에 반영되었습니다.
  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 님)
  22. (p75) 5번째 줄에서 “x의 과 y의 사이 벡터 점곱으로 인해”를 “x의 과 y의 사이 벡터 점곱으로 인해”로 정정합니다.(황*섭 님)
  23. (p325) 15번 주석에서 “약 2,280개”를 “약 2,280개”로 수정합니다.(Bak 님)
  24. (p131) 4번째 줄에서 “3,000달러 정도가”를 “2,400달러 정도가”로 수정합니다.(LEE 님)
  25. (p11) 예제 파일 구조 아래 리스트의 첫 번째 항목 끝에 다음 주석을 추가합니다. “역주 케라스 멀티백엔드 버전은 2.3.x에서 개발이 중지되었습니다. 이후부터는 텐서플로에 포함된 tf.keras를 사용하는 것을 권장합니다. 이 책의 에제 코드를 최신 텐서플로에 포함된 tf.keras에 포팅한 버전은 역자의 깃허브 tf2 브랜치(https://github.com/rickiepark/deep-learning-with-python-notebooks/tree/tf2)에서 볼 수 있습니다.”
  26. (p222) 코드 5-27의 2번째 줄 주석에서 ‘상위 8개 층의’를 ‘하위 8개 층의’로 정정합니다.(B***B 님)
  27. (p110) 26번 주석의 마지막에서 두 번째 문단을 다음처럼 수정합니다. “models.add(PReLU())또는 models.add(LeakyReLU())처럼 사용합니다.”(박*호 님)
  28. (5~8쇄) (p210) 위에서 5번째 줄에 zoom_range=0.1zoom_range=0.1,로 수정합니다.(박*호 님)
  29. (p67) 아래에서 2번째 줄에 “각 샘플은 벡터(2D 텐서)의 시퀀스로 인코딩되므로”를 “각 샘플은 벡터의 시퀀스(2D 텐서)로 인코딩되므로”로 정정합니다.(현* 님)

Your Inputs

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

  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명

    응답
    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의 배수를 선택하지만 고정된 규칙은 없습니다. 책이라는 관점에서 보면 옵션 값을 일정하게 유지하면 독자의 혼돈을 줄일 수 있을 것 같습니다만 기술적으로는 아무런 문제가 되지 않습니다. 저자가 찾은 적절한 값이라고 이해하는 것이 좋을 것 같습니다. ^^

      좋아요

      응답
      1. 정기수

        train 의 경우 데이터가 증식되어 batch를 32씩 하고 steps_per_epoch 을 100으로 하면
        기존 2000 개에서 3200 개로 늘어나는 효과가 있겠지만
        test 의 경우 batch를 32로 둘경우에 validation_steps가 50일때 전체 validation set 이 1600으로 되어 600개는 중복된 데이터가 같은epoch에서의 테스트에 재사용 되는게 아닌가 싶습니다.

        이부분에 대해서는 어떻게 동작하는지 알수 있을까요?

        좋아요

      2. 박해선 글의 글쓴이

        안녕하세요. 말씀하신대로 32 크기 배치로 50 스텝을 하면 검증에서 일부 중복된 데이터를 사용하게 됩니다. 검증 세트 크기에 맞게 스텝과 배치 크기를 정하는 경우가 많지만 검증 세트 크기보다 적거나 많게 지정한다고 잘못되었다고 말하기도 어렵습니다. 그렇지 않다면 두 매개변수 중 하나를 지정하지 못하도록 했겠죠? 🙂 flow_from_directory는 디렉토리에 파일을 모두 셔플해서 사용한다음 이를 초과하면 다시 전체 파일을 셔플하여 사용합니다. 즉 에포크마다 검증 세트에서 중복된 파일은 매번 다릅니다. 도움이 되셨는지 모르겠네요. 감사합니다!

        좋아요

      3. 정기수

        아래 답변에 댓글이 더이상 추가가 안되서 여기에 댓글을 달았습니다.
        말씀하신대로 중복된 데이터가 validation 과정에 들어가는게 문제가 될지에 대한 여부는 저도 잘은 모르겠습니다. 통상적으로 validation_step 을 validation_samples / validation_batch 로 사용하고 있어서
        다른 상황에 대해서 의문을 크게 가지지 않았었는데 예제만 가지고 실험을 해 봤을때는 학습 결과에 큰 차이를 보기는 힘들었습니다. 학습이라는게 무조건 이라는게 없는 영역이라고 생각하고 있어서 혹시나 다른 상황에서 차이가 발생하게 되면 다시 댓글 남기겠습니다.

        항상 좋은책 번역해주셔서 감사드립니다.
        다음책도 기대하고 있습니다 🙂

        Liked by 1명

  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를 사용하려면) 수동으로 교차 검증 루프를 만들어야 합니다. 교차 검증은 비교적 데이터가 적은 문제에서 분할로 인한 편향을 막아 주는 방법입니다. 딥러닝은 대량의 데이터를 다루는 경우가 많기 때문에 교차 검증이 필수 과정은 아닙니다.^^ 감사합니다.

      좋아요

      응답
      1. 박인혁

        from keras.wrappers.scikit_learn import KerasClassifier
        from sklearn.model_selection import StratifiedKFold

        model = KerasClassifier(build_fn=build_model, epochs=10, batch_size=64)
        kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=seed)
        results = cross_val_score(model, X_train, Y_train, cv=kfold)
        print(results.mean())

        build_model은 model을 반환하는 함수입니다.
        (https://machinelearningmastery.com/use-keras-deep-learning-models-scikit-learn-python/?fbclid=IwAR1_dO2LbAWhNIpl5UOK1YvJJf9kTkuSMkfBC5VkveB24wHRNfblUBWAxPQ)

        이렇게 코딩해서 kfold를 구현하는데는 성공했습니다.. ㅎㅎ
        추가로 model을 저장하고 싶은데…
        사실 여기서 이런 질문을 드려도 되는지 모르겠는데요 ㅠㅠㅠ

        케라스 질문인지 사이킷런 질문인지는 모르겠는데
        이 경우 model을 save할 수 있는 방법이 있나요?..ㅠㅠㅠ

        좋아요

      2. 박해선 글의 글쓴이

        KerasClassifier 객체를 저장하는 기능은 없습니다. KerasClassifier 객체 안에 model 속성에 build_fn에서 만든 케라스 모델이 들어 있습니다. 이 모델의 save 메서드를 사용할 수 있을 것 같습니다. 위 코드에서는 model.model.save(‘saved_model.h5’) 처럼 해 보시겠어요? 사실 저도 안해봐서 확실하지는 않네요. 🙂

        좋아요

  7. gypark

    165 p에 소프트맥스: 다중 레이블 단일 분류 / 시그모이드: 다중 레이블 다중 분류가 되어야 하는거 아닌가요?

    좋아요

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

      시그모이드는 이진(binary) 분류, 소프트맥스 함수는 다중(multiclass) 분류에 사용합니다. 다중 분류를 단일 레이블 다중 분류와 다중 레이블 다중 분류로 나눌 수 있습니다. 흔히 말하는 다중 분류는 단일 레이블 다중 분류입니다. 즉 샘플 하나에 레이블에 하나만 출력되죠. 다중 레이블 다중 분류로 만들려면 소프트맥스 함수처럼 출력층을 값을 정규화해서는 안되고 시그모이드 함수를 사용해 임계값을 넘긴 레이블이 여러개 선택될 수 있도록 합니다. 🙂

      좋아요

      응답
      1. gypark

        레이블과 분류 용어가 제가 생각했던 거랑 반대네요.
        소프트맥스 함수는 여러개의 레이블 중 하나를 골라서 다중 레이블 단일 분류가 되는 식이라고 생각했습니다.
        답변 감사합니다!

        Liked by 1명

  8. 박인혁

    안녕하세요 ㅎㅎㅎ 케라스 열공하고 있는 대학생입니다.
    한가지 궁금한게 생겨서 질문드립니다!!

    cnn으로 2진분류를 훈련한 모델에 model.evaluate_generator을 사용해서 출력되는 정확도와

    사이킷런에서 제공하는 confusion_matrix(2×2)를 그려서
    ACC = round((confusion[0][0] + confusion[1][1]) / (confusion[0][0] + confusion[0][1] + confusion[1][0] + confusion[1][1]),2)
    이런식으로 정확도를 계산했는데 둘이 차이가 있더라고요.

    정확도를 계산하는 내부로직은 차이가 있는건가요?

    좋아요

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

      안녕하세요. 제가 코드를 확인하지는 못했지만 아마도 제너레이터 함수에서 배치를 뽑을 때마다 정확도를 계산해서 평균하는 것 아닐까 생각됩니다. 제너레이터 함수에서 배치 크기를 전체 샘플 수로 하신다음 비교해 보시겠어요? 🙂

      좋아요

      응답
  9. 이명훈

    안녕하세요! 해당 책으로 공부중인 학생입니다. 이 책은 케라스를 활용한 머신러닝을 공부하면서 도움을 받을 수 있는 최고의 책이라고 확신합니다..! 공부하다가 몇가지 추가로 궁금한 점이 있어서 질문드립니다.
    1. p.191에 나오는 fit_generator 메서드에서의 매개변수인 ‘steps_per_epoch’의 의미가 확실하게 이해가 가지 않습니다. 해당 내용에서는 훈련데이터가 총 2000개이고, 배치사이즈가 20, steps_per_epoch이 100, epochs가 30으로 설정되어 있는데요. ’20개의 샘플이 들어있는 하나의 배치를, 하나씩 뽑아 학습하는 과정을 100번 거치는 이 모든 과정을 총 30번 반복한다’고 받아들이면 될까요? 그렇다면 꼭 ‘훈련데이터 샘플개수 = 배치사이즈 * steps_per_epoch’를 만족하도록 steps_per_epoch를 정해야 하는건가요?

    2. p.282에 데이터 준비 파트에서, steps에 관한 설명이 이해가 가지 않습니다. ‘데이터 포인트 하나를 샘플링’한다는 부분이 특히나 그런데, 적절한 예시를 하나 들어주시면 정말로 감사하겠습니다.

    3-1. p.293에 나오는 스태킹 순환층 코드를 기반으로 코딩하여 모델을 통한 결과값을 비교해보려고 하였습니다. model.predict_generator(test_gen, steps=test_steps) 함수를 사용하였는데요, 올바른 사용법인가요? 이 책에는 predict하는 부분까지 나와있지 않아 잘 모르겠습니다. 아무튼 저 코딩으로 예측값을 뽑아내면 (64,1) size의 값이 생성됩니다. 제가 generator 생성 시에 batch_size를 64로 지정해서 그런것 같은데요, 문제는, 예측값이 제대로 된 것인지 비교하기 위해서 Actual값(원래값)과 그래프로 나타내기 위해서는 어떻게 해야할 지 모르겠습니다. generator 생성 시에 shuffle을 설정해놓았기 때문에 해당 배치는 랜덤하게 뽑혔을것 같은데.. 그 랜덤한 원래의 값(Actual값)을 뽑아낼 수 있는 방법이 있을까요?

    3-2. 제가 사용한 데이터는 이 책에서 사용한 데이터가 아니라, 제가 직접 계측한 데이터입니다. (4649,10)의 size인 데이터라, 저는 훈련데이터를 처음부터 3000까지행으로, 검증데이터를 3001~4000행으로, 테스트데이터를 나머지 데이터(648개 행)로 설정하였습니다. 그리고 delay는 1로 설정을 하였습니다(바로 10분뒤의 온도를 예측). 제가 원하는 이상적인 결과표는, 예측값과 실제값 2개의 column과 648-1개의 행(바로 다음값을 예측하므로 마지막 값은 삭제)으로 이루어진 데이터 프레임입니다. 그런데 batch size를 64로 설정해놓아서인지 predict_generator실행 시 64개의 예측값만 나오는데.. 이를 해결하려면 어떻게 하면 좋을까요?

    너무 많은 질문을 드려서 죄송합니다. 귀한 책 내주셔서 항상 감사합니다.

    좋아요

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

      안녕하세요. 책이 도움이 된다니 다행입니다.^^ 문의 하신 내용 답변 드립니다.
      1. 맞습니다. 가능하면 전체 훈련 샘플 개수에 맞추는 것이 좋겠죠. 하지만 훈련 샘플 몇 개가 남아도 큰 문제가 되진 않으니 딱 떨어지지 않아도 됩니다.
      2. 이 데이터는 10분 간격(step)으로 측정한 것입니다. 6 step(1시간)마다 샘플을 하나씩 골라서 사용한다는 뜻입니다.
      3-1. predict_generator를 쓰면 배치로 뽑힌 값을 알기 어렵습니다. next(test_gen)으로 배치를 수동으로 뽑은 후 predict 메서드의 결과와 비교하세요.
      3-2. predict_generator 메서드에서 제너레이터로부터 뽑을 배치 횟수를 지정하는 steps 매개변수를 지정하지 않으신 것 아닐까요?

      좋아요

      응답
      1. 이명훈

        빠르고 친절한 답변 정말 감사드립니다. 추가 질문드려도 될까요?
        1. 그렇다면 steps_per_epoch이 지나치게 큰 경우는 이미 뽑았던 배치를 또 뽑아서 훈련할 수 있으므로 과대적합이 생길 수 있겠군요?

        2. 완벽하게 이해하였습니다. 감사합니다.

        3-1. 배치를 수동으로 뽑는다는 것에 대해 현재 아무런 지식이 없습니다…ㅠㅠ next(test_gen)을 활용하여 어떤식으로 predict 메서드에 넣을 수 있을지 간단한 예를 들어주실 수 있으신가요?

        3-2. model.predict_generator(test_gen, steps=test_steps)로 설정하여 결과값을 뽑았습니다. 때문에 steps 매개변수는 지정한 상태인데요. 제가 가지고 있는 데이터 기준으로 ‘test_steps = (len(float_data) – 4001 – lookback) // batch_size’ 를 계산하면 steps이 단 1이 나옵니다. 위에서 질문드린대로 저러한 결과값을 얻기 위해서는 steps를 어떻게 지정하면 될까요?

        4(새로운질문). Data Leakage에 관련한 내용입니다. p.283의 역주35에서 말씀하신 내용은, Data Leakage를 방지하기 위함이죠? 그렇다면 최대-최소 정규화를 할 때에도 전체데이터 기준이 아닌, 훈련데이터 기준의 최대,최소값을 사용해야하나요? 최대-최소 정규화의 목적은 모든 데이터의 값을 0~1사이의 값으로 정규화하기 위함이라고 알고 있는데요. 훈련데이터의 통계값으로 전체데이터를 정규화 할 시 해당범위를 벗어날 수도 있어서 의문이 생겨서 질문드립니다.

        좋아요

      2. 박해선 글의 글쓴이

        1. 에포크 횟수를 정확히 헤아리지 못하므로 과대적합을 막기 위해 에포크 횟수를 조절할 때 곤란할 것 같습니다.
        3-1. next() 함수를 사용하여 파이썬 제너레이터의 결과를 받아 올 수 있습니다. test_data = next(test_gen); model.predict(test_data)
        3-2. 안타깝지만 작성하신 코드에 대한 해결책을 제가 알아내기는 힘들 것 같습니다. 😦
        4. 넵 맞습니다. 벗어나는 것이 정상입니다. 가까운 서점에 들리셔서 ‘파이썬 라이브러리를 활용한 머신러닝’의 3장 앞부분을 잠깐 살펴 보세요. 🙂

        감사합니다.

        좋아요

  10. 박인혁

    안녕하세요 ㅎㅎㅎㅎ
    좋은 딥러닝책 번역해주셔서 감사합니다!!

    여기에 이런 질문을 드려도 되는지 모르겠는데요 ㅠㅠ
    메모리에 대해 여쭤볼게 있어서 질문드립니다!!
    어떻게 정확하게 질문을 드려야하는지 모르겠습니다..

    간혹 딥러닝을 돌리다보면 메모리부족 에러나 알림이 뜨곤 하는데…
    gpu에도 메모리가 따로 있는걸로 알고있고
    서버나 아니면 개인 랩탑에도 메모리(램)가 있는데

    딥러닝을 돌릴시 소비되는 메모리는
    gpu의 메모리와 서버(개인랩탑)의 메모리도 같이 소모되는건가요..?

    그리고 gpu가 1개였는데 만약 4개를 설치하면
    예를들어 보통 4배만큼 속도가 빨라질 수 있는건가요??ㅠㅠ

    좋아요

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

      네 서버와 GPU 메모리가 모두 소모됩니다. 특히 큰 데이터셋을 한번에 모두 읽으면 서버 메모리 부족 현상이 빈번하게 발생할 수 있습니다. 여러 개의 GPU를 사용하면 비례하게 속도가 빨라질 수 있습니다. 다만 훈련이 자동으로 분산되지 않습니다. 분산 훈련에 대해서는 텐서플로 사이트(https://www.tensorflow.org/tutorials/distribute/keras)를 참고하세요.

      좋아요

      응답
  11. 강혁

    안녕하세요ㅎㅎㅎ 질문 하나 드려도 될까요ㅎㅎ

    보통 케라스에서 cnn을 짤때

    디렉토리안에있는 이미지들을 전부 다 불러올려고

    저는 (test/train)_datagen.flow_from_directory함수를 사용하는데요,

    디렉토리안에 사진 1장만 넣고 1장만 불러올때도

    (test/train)_datagen.flow_from_directory를 보통 사용하나요..?

    좋아요

    응답
    1. 강혁

      아 그리고 제너레이터로 불러온 디렉토리안의 이미지들을 평가할때
      model.predict_generator을 사용하는데, 1장의 이미지만 평가할때 사용하는 다른 함수가 존재하나요??

      좋아요

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

      안녕하세요. flow_from_direcotory를 사용하는 것은 이미지가 많아 한꺼번에 메모리에 올릴 수 없기 때문입니다. 1개 이미지만 있을 때 사용해도 문제가 되지는 않습니다. 작업 스타일에 따라 사용하는 방법은 다를 것 같습니다. 🙂

      좋아요

      응답
  12. Sun

    안녕하세요.

    현재 tensorflow GPU를 설치하여 사용하고 있습니다.
    5장까지는 학습을 할 때 속도에 관해서 신경을 안쓸 정도로 빠르게 돌았는데

    6장 RNN(simpleRNN, LSTM) 부터 학습을 시킬 때 굉장히 느려집니다.
    LSTM의 경우 epochs =10 이 끝나는데 약 10분 정도 소요됩니다.

    [ GPU : GTX 1060 (6G) ]
    설정 확인을 봐도 제대로 설정이 되어 있는 듯 하고, 학습 시에 GPU사용량 확인도 해보니 GPU Load가 걸리는 것으로 보아 제대로 GPU로 학습이 되는 것 같은데, 학습 시에 PC자체도 느려지는 것 같아 CPU로 도는게 아닌가 싶기도 하는데..

    6장 LSTM부분에서 [코드 6-27] 부분을 실행시킬 때 시간이 10분 정도 걸리는게
    GPU로 실행해도 저정도 걸리는게 맞을까요?

    좋아요

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

      안녕하세요. 네 맞습니다. 1060으로 실행하면 10여분 걸립니다. 깃허브의 출력 결과를 보면 에포크마다 실행 시간을 확인하실 수 있습니다. 🙂

      좋아요

      응답
  13. 차주환

    안녕하세요ㅎㅎ 질문 하나 드립니다!!!!!

    모델 아키텍쳐와 가중치를 따로 저장을 했는데요, (아키텍쳐=json, 가중치=h5)
    가중치를 불러올려고 model.load_weights 함수를 사용해서 가져오는데

    분명히 디렉토리와 h5파일이름이 맞는데도

    valueError : unexpected type for ‘filepath’
    라고 에러가 뜨네요 ㅠㅠ

    filepath라고 뜨는걸로 봐서는 분명 경로문제인거 같은데 경로와 파일이름에는 아무리봐도 문제가 없습니다… 경로문제가 맞나요…?

    좋아요

    응답
      1. 차주환

        valueError : unexpected type class ‘keras.engine.training.Model’ for ‘filepath’ 인데요..
        > < 이 가로 기호가 출력이 안되나보네요..

        좋아요

      2. 박해선 글의 글쓴이

        안녕하세요. 어떤 이유인지 제가 알 수는 없지만 파일 경로가 올바르지 않던지 정상적인 h5 파일이 아닐 경우입니다. 다시 한번 코드를 잘 확인해 보세요. 에러가 잘 해결됐으면 좋겠네요. 🙂

        좋아요

  14. 이세우

    안녕하세요!!!!!!! 먼저 좋은 책 감사드립니다.
    시중에 나와있는 딥러닝 책중 이 책보다 자세히 설명되있는책이 없는거같아요ㅎㅎㅎ

    pretrained 모델에 대해 질문드리고 싶은데요,

    제가 만든 모델을 다시 불러와서 새로운 이미지데이터를 넣어 재학습?하는 기능이 케라스에 있나요..?
    새로운 이미지데이터가 생길때마다 새로 훈련을 하는 과정이 너무 오래걸려서 질문드립니다ㅠㅠ

    기존 데이터 + 새로운 데이터로 완전히 처음부터 다시 학습하는것보다
    기존 데이터로 만들어진 모델을 불러와서 새로운 데이터를 추가해 업그레이드?하는 기능이 있는지 여쭤봅니다 ㅠㅠㅠㅠㅠㅠ

    Liked by 1명

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

      네 당연히 가능합니다. 모델의 save() 메서드로 훈련된 모델을 저장하고 나중에 load_model() 함수로 다시 불러서 훈련을 이어 갈 수 있습니다. 🙂

      좋아요

      응답
  15. 이주환

    안녕하세요! 좋은 케라스 책 감사합니다.
    질문 하나 드리고 싶은데요 ㅠㅠ

    이미 완성되어있는 모델(.h5)을 불러와서
    가중치(.h5)와 모델의 아키텍쳐(.json)으로 분리하는 방법이 있나요..?

    좋아요

    응답
  16. LEE

    P131 의
    첫 번째 문단 마지막 즈음의 3,000달러를 2,400달러로 바꾸어야 할 것 같습니다.
    원서에서는 np.mean(all_scores)의 결과로 2.99(≈3.0) 가 나오지만, 이 책에서는 결과로 2.39(≈2.4) 가 나오기 때문입니다

    Liked by 1명

    응답
  17. KimHyunho

    8.3-neural-style-transfer.ipynb 에서
    In [8]: 을 실행하는데
    —————————————————————————
    RuntimeError Traceback (most recent call last)
    in
    20 combination_features = layer_features[2, :, :, :]
    21 loss += content_weight * content_loss(target_image_features,
    —> 22 combination_features)
    23 for layer_name in style_layers:
    24 layer_features = outputs_dict[layer_name]

    C:\Anaconda3\envs\dragon\lib\site-packages\tensorflow_core\python\ops\resource_variable_ops.py in __iadd__(self, unused_other)
    1215
    1216 def __iadd__(self, unused_other):
    -> 1217 raise RuntimeError(“Variable += value not supported. Use ”
    1218 “variable.assign_add(value) to modify the variable ”
    1219 “value and variable = variable + value to get a new ”

    RuntimeError: Variable += value not supported. Use variable.assign_add(value) to modify the variable value and variable = variable + value to get a new Tensor object.

    이러한 오류가 계속 발생합니다. 어떻게 해결 하면 되나요?

    좋은 책 감사합니다.

    좋아요

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

      안녕하세요. 혹시 keras 대신 tensorflow.keras를 사용했는지 확인해 보시겠어요? 저는 케라스 2.2.5에서 텐서플로 1.15를 백엔드로 사용해 테스트했을 때 에러가 나지 않았습니다.

      좋아요

      응답
  18. 양기성

    질문이 있어서 답글 남깁니다.

    그래픽 카드가 없어서 윈도우에서 CPU로만 하고 있습니다.

    RNN을 실습을 했는데 주피터 노트북에서 경고창이 뜹니다
    Kernel Restarting
    The kernel appears to have died. it will restart automatically.
    다른거는 다 되는데 RNN만 실행하면 이렇게 되면서 실행이 안됩니다.

    인터넷에 찾아보니까 업데이트하라 다시 설치하라 얘기가 많습니다.
    일단 다시 설치해보고 있습니다.

    근데 인터넷 글 중에 컴퓨터 메모리가 부족해서 병목현상이 일어난 걸 수도 있다고 하는데
    혹시 CPU로만 해서 그런건지 아니면 RAM이 부족한지 의심이 됩니다.

    혹시 이런 경우에 대해서 아시는 것에 대해 있나요?

    항상 빠른 답변 감사드립니다.

    좋아요

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

      메모리가 부족할 때 주피터 커널이 죽을 수 있다고 하지만 정확한 원인은 저도 모르겠습니다. RNN 셀 개수나 배치 크기를 줄이고 테스트해 보면 어떨까요? 🙂

      좋아요

      응답
  19. 도깨비

    박해선 작가님! 질문이 있어 글을 남깁니다.

    173쪽에..
    코드 5-3 MNIST이미지에 컨브넷 훈련하기에서
    마지막 줄이 에러가 뜹니다.

    ValueError Traceback (most recent call last)
    in ()
    2 loss=’categorical_crossentropy’,
    3 metrics=[‘accuracy’])
    —-> 4 model.fit(train_images, train_labels, epochs=5, batch_size=10)

    2 frames
    /usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    133 ‘: expected ‘ + names[i] + ‘ to have ‘ +
    134 str(len(shape)) + ‘ dimensions, but got array ‘
    –> 135 ‘with shape ‘ + str(data_shape))
    136 if not check_batch_axis:
    137 data_shape = data_shape[1:]

    ValueError: Error when checking target: expected sequential_3_input to have 4 dimensions, but got array with shape (60000, 10)

    어떻게 해결해야 할지 모르겠습니다.
    스택오버플로우를 찾아봐도 모르겠습니다.

    그리고 코딩을 하다 오류가 발생하면 어떻게 해결해야하는지 작가님의 조언 부탁드립니다.
    감사합니다.

    좋아요

    응답
    1. 도꺠비

      위의 질문 남긴 사람 입니다.
      batch_size = 64 책에 나온 그대로 해도 오류가 발생합니다.

      좋아요

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

      안녕하세요. 에러 메시지를 자세히 보시면 이 모델의 입력으로 4차원을 텐서를 기대하는데 2차원이 입력되었다고 하네요. 일반적으로 합성곱 신경망은 (배치,높이,너비,채널) 차원의 텐서를 기대합니다. 아마 코드 어디에선가 train_images와 train_labels를 바꿔 쓴 것 아닌가 추측됩니다. 예를 들면 train_images = to_categorical(train_labels) 와 같이 쓰면 위와 같은 에러가 날 것 같네요. 오류를 해결하는 방법은 일반 프로그래밍과 같습니다. 디버깅을 하는 거죠. 🙂

      좋아요

      응답
      1. 도깨비

        작가님! 답변 정말 감사합니다.

        from keras.datasets import mnist
        from keras.utils import to_categorical

        (train_images,train_labels),(test_images,test_labels)=mnist.load_data()

        train_images = train_images.reshape((60000,28,28,1))
        train_images = train_images.astype(‘float32’)/255

        test_images = test_images.reshape((10000,28,28,1))
        test_images = test_images.astype(‘float32′)/255

        train_labels = to_categorical(train_labels)
        test_labels = to_categorical(test_labels)

        model.compile(optimizer=’rmsprop’,
        loss=’categorical_crossentropy’,
        metrics=[‘accuracy’])
        model.fit(train_images, train_labels, epochs=5, batch_size=64)

        코딩에는 문제가 없는것 같은데..
        스택오버플로우에는 어떠한 층을 더 넣어야 된다는 답변이 있는거 같아요..

        다시한번 답변 정말감사합니다.

        좋아요

      2. 도깨비

        다시 실행하니 됩니다..코드는 그대로인데 지금은 잘 실행됩니다.
        몇시간 동안 매달려 있던게 허무하네요…
        그래도 작가님 정말 감사합니다. 정말 감사합니다.

        Liked by 1명

  20. 파이선

    안녕하세요
    제가 vae인코더를 계속 하는데 계속 이런 에러가 뜹니다.Duplicate node name in graph: ‘lambda_1/random_normal/shape’
    깃허브에 있는것을 사용했는데도 계속뜨네요

    좋아요

    응답
  21. 겨울

    안녕하세요
    196p 코드 5-14 에러가 나서 문의 남깁니다.
    github 복사 붙여넣기 했을때에도 같은 오류가 발생합니다.

    Found 2000 images belonging to 2 classes.
    Found 1000 images belonging to 2 classes.
    Epoch 1/100
    63/100 [=================>…………] – ETA: 15s – loss: 0.6928 – acc: 0.5115WARNING:tensorflow:Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches (in this case, 10000 batches). You may need to use the repeat() function when building your dataset.
    WARNING:tensorflow:Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches (in this case, 50 batches). You may need to use the repeat() function when building your dataset.
    63/100 [=================>…………] – 30s 477ms/step – loss: 0.6928 – acc: 0.5115 – val_loss: 0.6947 – val_acc: 0.5000

    좋아요

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

      안녕하세요. 제가 다시 테스트해보았는데 이상이 없었습니다. 제가 테스트한 환경은 케라스 2.2.5 + 텐서플로 1.15.0 과 케라스 2.3.1 + 텐서플로 2.2 입니다. 혹시 사용하신 케라스 버전과 텐서플로 버전을 알 수 있을까요?

      좋아요

      응답
      1. 겨울

        안녕하세요 작가님!
        2.4.3 케라스 버전입니다.
        2.2.0 텐서플로 버전입니다.

        또한
        366p
        이부분에서도 오류가 발생하여 조언을 구합니다.

        # 층 이름과 층 객체를 매핑한 딕셔너리를 만듭니다.
        layer_dict = dict([(layer.name, layer) for layer in model.layers])

        # 손실을 정의하고 각 층의 기여분을 이 스칼라 변수에 추가할 것입니다
        loss = K.variable(0.)
        for layer_name in layer_contributions:
        coeff = layer_contributions[layer_name]
        # 층의 출력을 얻습니다
        activation = layer_dict[layer_name].output

        scaling = K.prod(K.cast(K.shape(activation), ‘float32’))
        # 층 특성의 L2 노름의 제곱을 손실에 추가합니다. 이미지 테두리는 제외하고 손실에 추가합니다.
        loss += coeff * K.sum(K.square(activation[:, 2: -2, 2: -2, :])) / scaling

        Using TensorFlow backend.
        Downloading data from https://github.com/fchollet/deep-learning-models/releases/download/v0.5/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5
        87916544/87910968 [==============================] – 1s 0us/step
        —————————————————————————
        RuntimeError Traceback (most recent call last)
        in ()
        35 scaling = K.prod(K.cast(K.shape(activation), ‘float32’))
        36 # 층 특성의 L2 노름의 제곱을 손실에 추가합니다. 이미지 테두리는 제외하고 손실에 추가합니다.
        —> 37 loss += coeff * K.sum(K.square(activation[:, 2: -2, 2: -2, :])) / scaling

        /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/resource_variable_ops.py in __iadd__(self, unused_other)
        1243
        1244 def __iadd__(self, unused_other):
        -> 1245 raise RuntimeError(“Variable += value not supported. Use ”
        1246 “variable.assign_add(value) to modify the variable ”
        1247 “value and variable = variable + value to get a new ”

        RuntimeError: Variable += value not supported. Use variable.assign_add(value) to modify the variable value and variable = variable + value to get a new Tensor object.

        버전은 위와 동일합니다!
        콜랩에서 실행했을시에도 같은 오류가 발생하여 질문드립니다!

        좋은 책 감사합니다 작가님!
        실례지만 작가님이 기술 감수하신 책 중 하나인 Deep Learning with Tensorflow 2 and Keras 에 대한 조언을 구해도 될까요??

        좋아요

      2. 박해선 글의 글쓴이

        안녕하세요. 텐서플로 2.x를 지원하는 케라스 버전은 2.3.x 입니다. 케라스 2.3.1 버전을 사용하는 것을 추천합니다.

        저는 케라스 2.4.3, 텐서플로 2.2를 사용해도 5.2절의 코드가 에러나지 않았습니다. 어떤 문제인지 잘 모르겠네요. 혹시 여러 버전의 텐서플로와 케라스가 설치되어 있는지 확인해 보시고 텐서플로, 케라스 관련 패키지를 모두 삭제하고 다시 설치해 보세요. 그래도 문제가 반복된다면 텐서플로 1.x, 케라스 2.2.x를 사용해 주세요.

        8.2절의 코드에서 += 연산자는 deprecated 되었습니다. 그외에도 이 절의 코드는 최신 텐서플로와 호환되지 않습니다. 텐서플로 1.15.3과 케라스 2.2.5를 사용해 주세요.

        deep learning with tensorflow 2 and keras 책의 감수에 참여했지만 번역을 할 때처럼 책의 내용과 코드에 대해 Q&A를 지원해드리긴 힘듭니다. 궁금하신 점이 있다면 원서 깃허브나 저자에게 문의해 주세요.

        감사합니다! 🙂

        좋아요

    2. 장민성

      저도 같은 부분에서(196p 코드 5-14) 오류가 발생했습니다 혹시 댓글쓴이 분은 어떻게 해결하셨는지 알려주실 수 있나요?
      오류 : WARNING:tensorflow:Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches (in this case, 10000 batches). You may need to use the repeat() function when building your dataset

      좋아요

      응답
  22. 장민성

    저도 같은 부분에서(196p 코드 5-14) 오류가 발생했습니다 혹시 댓글쓴이 분은 어떻게 해결하셨는지 알려주실 수 있나요?
    오류 : WARNING:tensorflow:Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches (in this case, 10000 batches). You may need to use the repeat() function when building your dataset.

    좋아요

    응답
      1. 구슬동자

        겨울님 오류가 해결되었던 텐서플로우와 케라스 버전 알려 주실 수 있나요?

        좋아요

  23. 궁금

    안녕하세요. 좋은 책으로 잘 배우고 있습니다.

    p464 구글 코랩 실행에서
    !mv deep-learning-with-python-notebooks/datasets ./ 을 실행하면 아래와 같습니다.

    mv: cannot stat ‘deep-learning-with-python-notebooks/datasets’: No such file or directory

    도움을 부탁드립니다.

    좋아요

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

      안녕하세요. 그 위에 wget과 unzip 명령이 잘 실행되었나요? 한동안 사용하지 않으면 코랩 런타임은 자동적으로 삭제되기 때문에 런타임을 연결할 때마다 다시 데이터를 가져와야 합니다. 🙂

      좋아요

      응답
      1. 궁금

        네. 위 wget과 unzip 명령은 잘 실행됩니다. 다시 실행해도
        !mv 결과는 error 입니다.
        감사합니다.

        좋아요

  24. 최희동

    작가님, 안녕하세요. 책을 통해 딥러닝 배우고 있는 학생입니다. 좋은 책 감사드립니다.
    5장에 관한 문의를 드리려는데요, 책에 있는 코드 그대로 진행할 때는 괜찮았는데, 다른 데이터로 해보려고 하니 문제가 생기네요.
    일단 모델은 아래 코드로 학습시켰습니다.
    history = model.fit(train_generator, steps_per_epoch=80, epochs=30, validation_data=validation_generator, validation_steps=40)
    ——————————————————————————————————————————
    Epoch 1/30
    80/80 [==============================] – ETA: 0s – loss: 0.6528 – acc: 0.6134WARNING:tensorflow:Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches (in this case, 40 batches). You may need to use the repeat() function when building your dataset.
    80/80 [==============================] – 16s 193ms/step – loss: 0.6521 – acc: 0.6143 – val_loss: 0.4816 – val_acc: 0.7550
    Epoch 2/30
    80/80 [==============================] – 14s 178ms/step – loss: 0.4869 – acc: 0.7762
    Epoch 3/30
    80/80 [==============================] – 14s 179ms/step – loss: 0.4839 – acc: 0.7515
    Epoch 4/30
    80/80 [==============================] – 14s 178ms/step – loss: 0.4077 – acc: 0.8330
    ——————————————————————————————————————————–
    그리고, 다음으로 epoch 진행에 따른 Training acc, Validation acc 검증 그래프를 그리려고 하였는데요.(아래 코드)
    여기서, 다음과 같은 에러가 나오구요, 그래프는 Training acc만 표시가 됩니다.

    ValueError Traceback (most recent call last)
    in ()
    10
    11 plt.plot(epochs, acc, ‘bo’, label=’Training acc’)
    —> 12 plt.plot(epochs, val_acc, ‘b’, label=’Validation acc’)
    13 plt.title(‘Training and validation accuracy’)
    14 plt.legend()

    3 frames
    /usr/local/lib/python3.7/dist-packages/matplotlib/axes/_base.py in _plot_args(self, tup, kwargs)
    340
    341 if x.shape[0] != y.shape[0]:
    –> 342 raise ValueError(f”x and y must have same first dimension, but ”
    343 f”have shapes {x.shape} and {y.shape}”)
    344 if x.ndim > 2 or y.ndim > 2:

    ValueError: x and y must have same first dimension, but have shapes (30,) and (1,)

    validation acc 도 표시되게 하고 싶은데, 안되는 이유를 잘 모르겟습니다.
    왜 그런지 알수있을까요?
    감사합니다.

    좋아요

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

      안녕하세요. 책이 마음에 드신다니 다행입니다. 예제 데이터가 아닌 다른 데이터를 사용했을 때 문제를 제가 알기는 어렵습니다. 에러 메시지는 x와 y의 첫 번째 차원(배치 차원)의 크기가 다르다고 나오네요. 데이터셋에 어떤 문제가 있는지는 직접 찾아 보셔야 할 것 같습니다. 양해부탁드립니다. 감사합니다.

      좋아요

      응답
      1. 최희동

        답변감사합니다. 추가로 문의드리고 싶은 부분이 있는데요. 교재에 나온 데이터의 경우 모델 학습시 매 epoch마다 val_loss 와 val_acc 값이 산출이 되었었는데요, 이번에는 처음 epoch 때만 그 값들이 산출되고 다음 epoch부터는 산출이 안되더라구요. 그 이유에 대해서 참고할만한 내용이 있을지 문의드립니다.
        감사합니다.

        좋아요

  25. 최지웅

    안녕하세요, 책 참고해서 공부 열심히 하는 중입니다..!
    하지만 잘 실행되지 않는 부분이 생겨 이렇게 질문 남깁니다.

    2020년에 개정된 책의 366p 딥드림을 실행하는 과정에서
    (1)
    K.set_learning_phase(0)

    model = inception_v3.InceptionV3(weights = ‘imagenet’, include_top = False)
    (2)
    layer_contributions = {
    ‘mixed2’ : 0.2,
    ‘mixed3’ : 3.,
    ‘mixed4’ : 2.,
    ‘mixed5′ : 1.5,
    }
    (3)
    layer_dict = dict([(layer.name, layer) for layer in model.layers])
    loss = K.variable(0.)

    for layer_name in layer_contributions:
    coeff = layer_contributions[layer_name]
    activation = layer_dict[layer_name].output

    scaling = K.prod(K.cast(K.shape(activation),’float32’))
    loss += coeff * K.sum(K.square(activation[:, 2:-2, 2:-2, :])) / scaling

    1번과 2번을 잘 실행된 상태에서 3번의 코드를 실행시킨다면
    —-> 9 loss += coeff * K.sum(K.square(activation[:, 2:-2, 2:-2, :])) / scaling
    Variable += value not supported. Use variable.assign_add(value) to modify the variable value and variable = variable + value to get a new Tensor object.
    이런 에러가 발생하면서 3번 코드에 선언한 loss = K.variable(0) 의 변수에 대해 에러가 발생했는데 이를 어떻게 고쳐야할지 모르겠어서 이렇게 댓글 남깁니다.

    좋아요

    응답
  26. 김성헌

    안녕하세요 2판 page 385쪽에 delay=sampling_rate*(sequence_length+24-1)에서 5일간의 시간 120(sequence_length)에 타깃값이 24시간 뒤이므로 두개를 더한 후 sampling_rate를 곱하는 것까진 이해했는데 -1을 하는 이유가 뭔지 궁금합니다.
    0에서 시작해서 그런건가요?
    또 코드10-7에서 raw_data[:-delay]와 targets=temperature[delay:]에서 왜 raw_data를 -delay까지, temperatrue를 delay이후부터로 설정하는지 궁금합니다.

    좋아요

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

      안녕하세요. -1을 하는 이유는 말씀하신 것과 같습니다. 타깃은 24시간 이후의 온도이므로 입력은 끝에서 24시간 떨어져야 합니다. 마찬가지로 타깃은 처음에서 24시간 떨어져 시작됩니다. 감사합니다.

      좋아요

      응답

댓글 남기기

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