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

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

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

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

      좋아요

      응답
      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장 앞부분을 잠깐 살펴 보세요. 🙂

        감사합니다.

        좋아요

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

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

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.