카테고리 보관물: Deep Learning

“핸즈온 머신러닝” 사이킷런 0.20 업데이트

사이킷런 0.20 버전에 맞추어 <핸즈온 머신러닝> 도서에 반영될 내용을 정리하였습니다. 깃허브 주피터 노트북에는 더 많은 내용이 반영되어 있습니다! 🙂

  • sklearn.preprocessing.Imputer 클래스는 사이킷런 0.22 버전에서 삭제될 예정입니다. 대신 0.20 버전에서 추가된 sklearn.impute.SimpleImputer 클래스로 변경합니다.
    • (p100) 두 번째 문단 시작 부분에 “사이킷런의 Imputer는 누락된 … 지정하여 Imputer의 객체를 생성합니다.”를 “사이킷런의 SimpleImputer는 누락된 … 지정하여 SimpleImputer의 객체를 생성합니다.”로 변경합니다. 첫 번째 코드 블럭에서
      from sklearn.preprocessing import Imputer
      imputer = Imputer(strategy=”median”)

      from sklearn.impute import SimpleImputer
      imputer = SimpleImputer(strategy=”median”)
      로 변경합니다.
    • (p101) 주석 34의 첫 문장에서 ‘(예를 들면 Imputer(strategy=”median”) )’를 ‘(예를 들면 SimpleImputer(strategy=”median”) )’로 변경합니다.
    • (p108, 109) 파이프라인 정의 코드에서 ‘Imputer(strategy=”median”)’을 ‘SimpleImputer(strategy=”median”)’로 변경합니다.
  • OneHotEncoder 클래스가 종전에는 훈련 데이터에 나타난 0~최댓값 사이 범위를 카테고리로 인식하여 원-핫 인코딩하지만 앞으로는 고유한 정수 값 또는 문자열을 원-핫 인코딩할 수 있습니다. 정수 특성과 문자열 특성이 함께 있는 경우에는 에러가 발생합니다. 경고 메세지를 피하고 고유한 값을 사용하는 방식을 선택하기 위해 categories 매개변수를 'auto'로 지정합니다.
    • (p103) 마지막 코드 블럭에서 encoder = OneHotEncoder()를 encoder = OneHotEncoder(categories='auto')로 변경합니다.
  • 0.22 버전에서 RandomForestClassifierRandomForestRegressor 모델의 n_estimators 기본값이 10에서 100으로 늘어납니다. 경고 메세지를 피하기 위해 명시적으로 트리 개수를 10으로 지정합니다.
    • (p114, p116) 코드 블럭에서 RandomForestRegressor()를 RandomForestRegressor(n_estimators=10)으로 변경합니다.
    • (p139, p244) 코드 블럭에서 RandomForestClassifier()를 RandomForestClassifier(n_estimators=10)으로 변경합니다.
  • 공개된 훈련 데이터를 다운로드 받는 fetch_mldata 함수가 mldata.org 사이트의 잦은 에러로 openml.org 를 사용하는 fetch_openml 함수로 변경되었습니다.
    • (p124) mnist = fetch_mldata('MNIST original')을 mnist = fetch_openml('mnist_784', version=1)로 변경합니다. openml.org의 MNIST 타깃 데이터는 문자열로 저장되어 있으므로 mnist.target = mnist.target.astype(np.int)와 같이 정수로 바꾸는 것이 좋습니다.
  • 사이킷런 0.22 버전에서 LogisticRegression 클래스의 solver 매개변수 기본값이 'liblinear'에서 'lbfgs'로 변경될 예정입니다. 경고 메세지를 피하고 출력 결과를 일관되게 유지하기 위하여 solver 매개변수를 'liblinear'로 설정합니다.
    • (p192, p244) LogisticRegression()을 LogisticRegression(solver='liblinear')로 변경합니다.
  • SVCSVR ​클래스의 gamma 매개변수 옵션에 'auto'외에 'scale'이 추가되었습니다. 'auto'는 1/n_features, 즉 특성 개수의 역수입니다. 'scale'은 1/(n_features * X.std())로 스케일 조정이 되지 않은 특성에서 더 좋은 결과를 만듭니다. 사이킷런 0.22 버전부터는 gamma 매개변수의 기본값이 'auto'에서 'scale'로 변경됩니다. 서포트 벡터 머신을 사용하기 전에 특성을 표준화 전처리하면 'scale'과 'auto'는 차이가 없습니다. 경고를 피하기 위해 명시적으로 'auto' 옵션을 지정합니다.
    • (p213) 맨 아래 코드 블럭에서 SVR(kernel="poly", degree=2, C=100, epsilon=0.1)SVR(kernel="poly", gamma='auto', degree=2, C=100, epsilon=0.1)로 변경합니다.
    • (p244) SVC()를 SVC(gamma='auto')로 변경합니다.
  • LinearSVC의 verbose 매개변수가 0이 아닐 때 max_iter 반복 횟수가 부족하면 경고 메세지가 출력됩니다. 사이킷런 0.20 버전부터는 verbose 매개변수에 상관없이 max_iter 반복 안에 수렴하지 않을 경우 반복 횟수 증가 경고가 나옵니다. 경고 메세지를 피하기 위해 max_iter 매개변수의 기본값을 1,000에서 2,000으로 증가시킵니다.
    • (p206) LinearSVC(C=10, loss="hinge")를 LinearSVC(C=10, loss="hinge", max_iter=2000)으로 변경합니다.

TensorFlow 1.12.0 RC0 Release

텐서플로 1.12.0 RC0 버전이 릴리스되었습니다. 1.11.0 버전이 나온지 한달도 되지 않았는데 정말 빠르네요. 심지어 1.11.0 버전에 맞추어 재실행한 <핸즈온 머신러닝> 주피터 노트북을 아직 커밋하기도 전입니다. 🙂

케라스 모델을 SaveModel 포맷으로 저장할 수 있어(via tf.contrib.saved_model.save_keras_model()) 텐서플로 서빙에 사용할 수 있는 점이 눈에 띄입니다. 텐서플로 1.12.0 RC0 버전은 pip 명령으로 손쉽게 설치할 수 있습니다. 파이썬 2.7(윈도우즈제외), 3.5, 3.6 버전을 지원합니다.

$ pip install --upgrade tensorflow
$ pip install --upgrade tensorflow-gpu

사이킷런 0.20 버전은 몇몇 버그를 수정한 0.20.1 버전이 릴리스될 것 같습니다. 🙂

(업데이트) 텐서플로 1.12.0 RC1 버전이 릴리스되었습니다.

Keras 2.2.4 Release

<케라스 창시자에게 배우는 딥러닝> 책이 출간되자 마자 공교롭게도 케라스 2.2.4 버전이 릴리스되었습니다. 🙂  2.2.4 버전은 며칠 전 릴리스된 2.2.3 버전의 버그 픽스입니다. 주요한 변경 사항은 2.2.3 버전에 담겨 있습니다. 몇 가지 눈에 띄이는 내용을 살펴 보겠습니다. 전체 변경 내용은 케라스 2.2.3 버전의 릴리스를 참고하세요.

  • 텐서플로 1.11.0의 Keras API와 통일하기 위해 ThresholdedReLULeakyReLU의 기능을 ReLU 클래스에 추가하였습니다. 이 때문에 ReLU 클래스에 두 개의 매개변수가 추가되었습니다. ThresholdedReLUtheta 매개변수 역할을 하는 thresholdLeakyReLUalpha 매개변수 역할을 하는 negative_slope입니다. 백엔드의 relu 함수에는 이미 alpha 매개변수가 있었기 때문에 threshold 매개변수만 추가되었습니다.
  • TensorBoard 콜백 클래스에 로깅 간격을 지정할 수 있는 update_freq 매개변수가 추가되었습니다. 기본값은 'epoch'로 이전과 동일하게 에포크마다 로그를 기록합니다. 'batch'는 배치마다 로그를 기록하고 정수를 입력하면 지정된 샘플 개수마다 로그를 기록합니다. tf.keras에는 아직 반영되지 않았습니다.
  • 다른 *Pooling2D 클래스처럼 MaxPooling1D, GlobalMaxPooling1D, AveragePooling1D, GlobalAveragePooling1D 에 data_format 매개변수가 추가되었습니다. data_format 매개변수의 값이 channels_last일 때 입력은 (batch_size, steps, features) 크기의 3D 텐서이고 channels_first일 때는 (batch_size, features, steps)입니다. 기본값은 channels_last입니다.
  • Conv2DTranspose 클래스에 아트루스 합성곱을 위한 dilation_rate 매개변수가 적용되었습니다.
  • EarlyStopping 콜백 클래스에 restore_best_weights 매개변수가 추가되었습니다. 이 매개변수를 True 지정하면 patience 에포크가 지난 후의 모델이 아니라 이전 모델 중에서 최선의 가중치로 설정된 모델이 반환됩니다. 기본값은 False 입니다.
  • 이전에는 무조건 float32 타입의 넘파이 배열을 반환했던 to_categorical 함수에 dtype 매개변수가 추가되었습니다. 'float64', 'int32' 등을 지정할 수 있으며 기본값은 'float32' 입니다.

“케라스 창시자에게 배우는 딥러닝”이 출간되었습니다.

keras_dl_b 케라스 창시자이자 구글 AI 연구원인 프랑소와 숄레(François Chollet)의 “Deep Learning with Python“의 번역서 <케라스 창시자에게 배우는 딥러닝>이 출간되었습니다! 온라인/오프라인 서점에서 판매 중입니다.

이 책은 케라스를 사용하여 딥러닝의 기초와 다양한 실전 모델을 배울 수 있도록 안내합니다. 또 프랑소와의 딥러닝에 대한 견해와 전망을 엿볼 수 있습니다. 예제 코드는 깃허브에 공개되어 있습니다. 블로그에 실었던 원서에 대한 소개번역 후기도 참고하세요.

케라스의 새 버전에 맞추어 코드를 수정하고 에러타를 꾸준히 반영하겠습니다. 도서 메일링 리스트에 가입하면 편하게 에러타를 확인할 수 있습니다.

책을 만드는 데 도움을 주신 많은 분들께 다시 한번 감사드립니다!

ML Yearning 완결

clzytu7wkaalj-a 앤드류 응(Andrew Ng)이 2016년 6월부터 쓰기 시작한 Machine  Learning Yearning이 드디어 완결되었습니다. 이 책은 총 58개의 장, 118페이지로 구성되어 있습니다. 각 챕터는 머신러닝 프로젝트를 수행하기 위해 꼭 알아야 할 개념과 노하우를 담고 있습니다. 프로그램 코드는 없지만 Cookbook 스타일처럼 느껴집니다.

이 책을 받으려면 deeplearning.ai 뉴스레터에 가입해야 합니다. 완결된 PDF을 블로그에서 직접 다운로드할 수 있도록 올려 놓았습니다.

각 장은 몇 개의 카테고리로 묶여 있습니다. 카테고리 제목을 보면 이 책에 담긴 주제들을 이해하기 좋습니다.

  1. Setting up development and test sets
  2. Basic Error Analysis
  3. Bias and Variance
  4. Learning curves
  5. Comparing to human-level performance
  6. Training and testing on different distributions
  7. Debugging inference algorithms
  8. End-to-end deep learning
  9. Error analysis by parts

이 책은 Draft 버전입니다. 정식 책으로 출판될지는 아직 확실하지 않습니다.

Tensorflow 1.11.0 & Scikit-Learn 0.20.0 Release

텐서플로 1.11.0사이킷런 0.20.0 버전이 릴리즈되었습니다.

텐서플로 1.11.0부터는 cudnn 7.2 버전으로 패키징이 되어 있습니다. cudnn은 NVIDIA 개발자 사이트에서 다운로드 받을 수 있습니다. CUDA 9.0과 cudnn 7.3 버전에서 정상 작동됩니다. 텐서플로는 pip 명령으로 설치할 수 있습니다. 파이썬 2.7(윈도우즈제외), 3.5, 3.6 버전을 지원합니다.

$ pip install --upgrade tensorflow
$ pip install --upgrade tensorflow-gpu

사이킷런 0.20.0은 pipconda를 사용하여 설치할 수 있습니다.

$ conda update scikit-learn
$ pip install --upgrade scikit-learn

TensorFlow 1.11.0 RC0 Release

텐서플로 1.11.0 RC0 버전이 릴리즈되었습니다. 1.11.0 버전부터는 cudnn 7.2 이상을 설치해야 합니다. 1.11.0에서 바뀐 자세한 내용은 릴리즈 노트를 참고해 주세요.

텐서플로 1.11.0 RC0 버전은 pip를 사용해 설치할 수 있습니다.

$ pip install --upgrade --pre tensorflow
$ pip install --upgrade --pre tensorflow-gpu

(업데이트) 1.11.0 RC1 버전이 릴리즈되었습니다.

(업데이트) 1.11.0 RC2 버전이 릴리즈되었습니다.

핸즈온 머신러닝’s 넘파이 튜토리얼

핸즈온 머신러닝 깃허브에 있는 부록 중 넘파이 튜토리얼을 번역하여 커밋하였습니다. 내용이 길어 생각보다 훨씬 오래 걸린 것 같습니다. 이 노트북을 막다운으로 변경하여 블로그의 핸즈온 머신러닝 1장, 2장 문서에도 포함했습니다. 재미있게 봐주세요! 🙂

핸즈온 머신러닝 주피터 노트북 업데이트 안내

핸즈온 머신러닝의 원서 주피터 노트북이 조금 업데이트되었습니다. 변경된 내용을 번역서의 깃허브에도 반영하였습니다. 다음은 변경된 상세 내용입니다.

  • 14_recurrent_neural_networks.ipynb
    • 레버(Reber) 문법 연습문제에서 my_reber_classifier의 경로를 변경하고 추정 확률을 퍼센트로 나타냅니다.
      with tf.Session() as sess:
      saver.restore(sess, "my_reber_classifier")
      y_proba_val = y_proba.eval(feed_dict={X: X_test, seq_length: l_test})
      
      print()
      print("레버 문자열일 추정 확률:")
      for index, string in enumerate(test_strings):
      print("{}: {:.2f}%".format(string, y_proba_val[index][0]))

      을 다음으로 변경합니다.

      with tf.Session() as sess:
      saver.restore(sess, "./my_reber_classifier")
      y_proba_val = y_proba.eval(feed_dict={X: X_test, seq_length: l_test})
      
      print()
      print("레버 문자열일 추정 확률:")
      for index, string in enumerate(test_strings):
      print("{}: {:.2f}%".format(string, 100 * y_proba_val[index][0]))
  • 02_end_to_end_machine_learning_project.ipynb
    • 사이킷런의 0.20 버전에 포함될 ColumnTransformer를 사용하면 책의 예제에서처럼 DataFrameSelectorFeatureUnion을 사용하지 않고 간단히 전체 파이프라인을 만들 수 있습니다. 아직 사이킷런 0.20 버전이 릴리스되기 전이므로 여기서는 future_encoders.pyColumnTransformer를 넣어 놓고 사용합니다.
      from future_encoders import ColumnTransformer
      
      num_attribs = list(housing_num)
      cat_attribs = ["ocean_proximity"]
      
      full_pipeline = ColumnTransformer([
      ("num", num_pipeline, num_attribs),
      ("cat", OneHotEncoder(), cat_attribs),
      ])
      
      housing_prepared = full_pipeline.fit_transform(housing)
      housing_prepared
  • 11_deep_learning.ipynb
    • 텐서플로 모델 재사용하기에서 노드 이름 수정
      hidden3 = tf.get_default_graph().get_tensor_by_name("dnn/hidden4/Relu:0")

      을 다음으로 변경합니다.

      hidden3 = tf.get_default_graph().get_tensor_by_name("dnn/hidden3/Relu:0")
  • 11_deep_learning_exercises.ipynb
    • 불필요한 변수 초기화 루틴 삭제
      for var in output_layer_vars: 
          var.initializer.run()
  • extra_tensorflow_reproducibility.ipynb 파일 추가

감사합니다! 🙂

Deep Learning with Python 번역 후기

chollet-dlp-hi원래는 좀 더 일찍 시작했어야 했지만 ‘핸즈온 머신러닝‘ 작업이 늦어지면서 4월에 들어서 시작하였습니다. 케라스를 만든 프랑소와 숄레가 직접 쓴 책이라 이전부터 기대가 컸습니다. 역시나 아마존에서 높은 인기를 끌고 있네요. 4개월 동안의 작업을 마무리하면서 번역의 후기를 남깁니다.

‘Deep Learning with Python’은 케라스를 사용하여 딥러닝의 다양한 모델을 배울 수 있도록 안내합니다. 합성곱, 순환 신경망을 포함하여 컨브넷 필터 시각화, 딥드림, 뉴럴 스타일 트랜스퍼, VAE, GAN까지 다루고 있습니다. 재미있게도 수학 공식을 극도로 줄이고 대부분의 이론 설명을 파이썬 코드로 풀어갑니다. 딥러닝을 공부하려는 소프트웨어 엔지니어를 주요 독자층으로 생각하기 때문입니다.

순조롭게 진행되던 번역 작업은 6장을 만나면서 암초에 부딪혔습니다. 눈에 띄는 에러타(프랑소와가 왜 이렇게 썼을까..)가 많이 나왔습니다.  반면 매닝의 에러타 포럼 페이지는 사용자들이 올린 에러타만 쌓일 뿐 이에 대한 반응이 거의 없습니다. 저자가 바쁘기 때문인지 아니면 출판사의 게으름인지 알 도리가 없습니다. 신중하게 에러타를 선별하여 번역서에 반영하였습니다.

또 한번의 암초는 이번 여름의 더위입니다. 너무나 더워서 자정이 넘어서도 키보드를 두드릴 수가 없었죠. 거북이 같던 걸음마였지만 조금씩 진행된 것이 쌓여 결국 모든 번역을 마무리할 수 있었습니다. 이젠 조금 선선해진(?) 날씨에 1차 역자 교정을 마치고 홀가분한 마음으로 이 글을 적습니다. 남은 것은 머릿말과 저자 소개 정도네요.

이 책은 1부와 2부로 나뉘어져 있습니다. 1부(1장~4장)는 딥러닝의 기초, 2부(5장~9장)는 실전 딥러닝의 내용을 담고 있습니다. 간단한 목차는 다음과 같습니다.

  1. 딥러닝이란 무엇인가?
  2. 시작하기 전에: 신경망의 수학적 구성 요소
  3. 신경망 시작하기
  4. 머신 러닝의 기본 요소
  5. 컴퓨터 비전을 위한 딥러닝
  6. 텍스트와 시퀀스를 위한 딥러닝
  7. 딥러닝을 위한 고급 도구
  8. 생성 모델을 위한 딥러닝
  9. 결론

이 책에서 맘에 드는 두 개의 장을 고르라면 6장과 9장입니다. 6장은 시퀀스 처리를 위한 딥러닝을 소개합니다. 기본 RNN으로 시작해서 LSTM, GRU, 양방향 RNN, 1D 컨브넷과 이들의 조합으로 텍스트와 시계열 데이터를 처리하는 다양한 예를 소개합니다. 다른 딥러닝 책에 비해 RNN에 대한 내용이 좀 더 풍부합니다. 9장은 책의 전체 내용을 정리하면서 딥러닝의 한계와 발전 방향에 대해 소개를 합니다. 이 장에서 저자가 생각하는 딥러닝의 방향과 비전을 엿볼 수 있어 아주 좋았습니다.

번역서는 <케라스 창시자에게 배우는 딥러닝>이란 제목으로 출간될 예정입니다. 8월 말부터 베타 테스트를 시작합니다. 조판과 디자인까지 완료되면 10월 초에는 받아볼 수 있을 것 같습니다. 🙂