읽기전

  • 인공지능으로 간단하게 만들어 본게 있는데, Keras(케라스)를 이용해서 만들었다.
  • 여러곳을 참고해 보니, 아예 연구자가 아닌 이상 케라스를 이용하면 왠만한건 할 수 있다는 이야기를 보았다.
  • 물론 간단하게 만들어 본 것 역시 케라스를 이용해서 만들었다.
  • 그래서 케라스 자체를 좀 더 알아 보는게 좋을 것이 생각해서 구매한 책.

기타

  • 보통 책과 관련없는 내용은 아랫쪽에 따로 두기도 하는데..
  • 책 자체에 역자가 많은 주석을 달아 두었다. 그래서 책을 읽기가 좋다.
  • 대부분의 이론들이나, 전망은 걍 생략했다. 이 글을 읽는 사람이 있다면, 자세한 내용은 책을 구매해서 읽으시길...
  • 초급용 책을 뗐다면, 이 책을 읽어 보는것을 추천한다. 참고로 초급용 책은 "모두의 딥러닝"을 추천한다.

책읽기

1부 딥러닝의 기초

  • 이론적인 내용 생략

1장 딥러닝이란 무엇인가?

  • 이론적인 내용 생략

인공지능과 머신 러닝, 딥러닝

  • 인공지능 : 보통의 사람이 수행하는 지능적인 작업을 자동화 하기 위한 연구 활동
  • 머신러닝 시스템은 명시적으로 프로그램 되는 것이 아니라 훈련(training)
  • 데이터 포인트 라는 말이 나오는데, 인공지능 학습에 사용되는 데이터들을 데이터 포인트 라는 용어로 잘 사용하더라. ( 직전에 읽은, 피처 엔지니어링 책에서도 데이터 포인트 라는 용어를 사용했던것 같다. )
  • 표현(representation) : 머신러닝과 딥러닝의 핵심 문제ㄴ,ㄴ 입력 데이터를 기반으로 기대 출력에 가깝게 만드는 유용한 표현을 학습하는것.
    • 핵심은 데이터를 인코딩하거나 묘사하기 위해 데이터를 바라보는 방법
    • 이미지가 RGB 혹은 HSV로 바뀌는것도 표현이 바뀌는것
    • 2차원 데이터 포인트들에서, 좌표를 변환하는것.
    • 시스템적으로 데이터 포인트를 잘 구분할 수 있도록, "학습"시킬 수 있다.
    • 이 과정중 일부는 기계가 "학습"하기 쉽게, 사람이 먼저 "피처 엔지니어링"을 해야 할 수도 있겠다.
  • 뉴럴넷은 뇌구조를 이해하는것에 영감을 만들어 진 것이다. 진짜 사람의 뇌가 그렇게 동작한다는 근거는 없다.

딥러닝 이전: 머신 러닝의 간략한 역사

  • 확률적 모델링
    • 통계학 이론을 데이터 분석에 응용
    • 나이브 베이즈 알고리즘
      • 입력 데이터의 특성이 모두 독립적이다고 가정
      • 고전적인 방법이라, 컴퓨터 등장전에는 수작업으로 적용
    • 로지스틱 회귀
      • 회귀 알고리즘이 아니라, 분류 알고리즘
  • 초창기 신경망

왜 딥러닝일까? 왜 지금일까?

  • 20년 후에도 심층 신경망을 사용하고 있을까요? ... 지금부터 20년 후에는 신경망을 사용하지 않을지도 모르지만, 딥러닝과 딥러닝의 핵심 개념에서 직접 파생된 무엇인가를 사용할 것입니다.

2장 시작하기 전에: 신경망의 수학적 구성 요소

  • 내용 생략

신경망과의 첫 만남

  • 내용 생략

신경망을 위한 데이터 표현

  • 내용 생략

신경망의 톱니바퀴: 텐서 연산

  • 내용 생략

신경망의 엔진: 그랜디언트 기반 최적화

  • 내용 생략

첫 번째 예제 다시 살펴보기

  • 내용 생략

요약

  • 내용 생략

3장 신경망 시작하기

  • 내용 생략

신경망의 구조

  • 내용 생략

케라스 소개

  • 케라스는 MIT 라이선스를 따르므로 상벚거인 프로젝트에도 자유롭게 사용할 수 있습니다.
  • 최근 딥러닝 프레임워크의 순위는 텐서플로우, 케라스 파이토치 순임.
  • 케라스는 고수준 구성 요소를 제공. 백엔드로는 텐서플로우, 씨아노, CNTK 3개의 엔진을 골라서 사용할 수 있음.
  • 케라스로 모델을 만드는 법
    • Sequential 클래스를 이용해서 순차적으로 쌓아 올리는 방법
    • 함수형 API를 사용해서, 임의의 구조를 만들 수 있는 방법

딥러닝 컴퓨터 셋팅

  • 내용 생략

영화 리뷰 분류: 이진 분류 예제

  • 내용 생략

뉴스 기사 분류: 다중 분류 문제

  • one hot encoding되어 있는 데이터라면 loss에 categorical_crossentropy를 사용하면 되고, 그렇지 않고 숫자로 라벨링 되어 있는 경우라면, loss에 sparse_categorical_crossentropy를 사용하면 된다. 굳이 바꿀 필요 없음.
  • 충분히 큰 중간층을 두어야 하는 이유
    • 마지막 출력이 46차원이기 때문에 중간에 히든 유닛이 46개 보다는 많이 적어서는 안된다. 책에서는 중간에 4차원을 두었는데, 이렇게 두어도 아예 안 되진 않지만, 4차원으로는 정보를 충분히 표현할 수 없어 79%에서 71%로 8% 정도 정확도가 감소한다.
    • 4차원에 대부분의 정보를 넣었겠지만, 그래도 다 넣지는 못한 것으로 생각할 수 있다.

주택 가격 예측: 회귀 문제

  • 데이터의 피쳐가 여러 범위를 가지고 있다. 이때는 데이터를 균일한 범위로 맞춰 주는것이 중요하다. 안되지는 않겠지만, 피쳐의 중요도를 떠나, 그냥 숫자가 클 경우 곱셈을 하게 되면 큰 변화량을 가지게 될 것이다. ( 피쳐엔지니어링 책 참고 )

  • 데이터를 정규화하는 방법

    • 피처의 평균을 빼고, 표준편차로 나누는 방식

    • 피처의 중앙이 0 근처에 맞추어지고, 표준편차가 1이 된다.

      mean = train_data.mean(axis=0)
      train_data = train_data - mean
      std = train_data.std(axis=0)
      train_data = train_data/std
      
      test_data = test_data - mean
      test_data = test_data/std
  • 일반적으로 훈련 데이터의 개수가 적을수록 과대적합(오버피팅)이 더 쉽게 일어나므로 작은 모델을 사용하는 것이 과대적합을 피하는 한 방법입니다.

  • 모델의 마지막은 1개의 유닛을 가지고 있고, 활성화 함수가 없음. 전형적인 스칼라 회귀(하나의 연속적인 값을 예측하는 회귀)를 위한 구성.

  • loss = mse : 평균 제곱 오차. 회귀 문제에서 널리 사용되는 손실 함수.

  • metrics = mae: 평균 절대 오차. 예측과 타깃 사이의 거리 절대값. 0.5면 평균적으로 500달러 차이 난다는것.( 1 = $1000 기준 )

  • 데이터량이 너무 작으면, validation set도 아까우니깐, k-겹 검증 적용

    • K-fold cross-validation : 데이터를 4덩이로 나눈다면
    • 0, 1, 2 는 학습용으로, 3은 검증용으로
    • 0, 1, 3 은 학습용으로, 2는 검증용으로
    • 0, 2, 3 은 학습용으로, 1은 검증용으로
    • 1, 2, 3 은 학습용으로, 0은 검증용으로
    • 모두 loop를 돌고 나면 각 검증용으로 사용했던 0, 1, 2, 3 의 결과를 평균내서 검증의 최종 값으로 사용.
    • 중요한건, 각 학습을 할 때 validation set의 데이터를 참고하지 않았다는 점이다.*
    • 하지만, 코드를 따로 짜야하는 불편함이... 그냥 데이터를 많이 만들어 두고 쓰자. ㅎ.

요약

  • 내용 생략

4장 머신 러닝의 기본 요소

머신 러닝의 네 가지 분류

머신 러닝 모델 평가

  • 반복 K-겹 교차 검증 : k-겹 교차 검증과 동일하나, 반복시마다 데이터를 섞은 뒤에 다시 k 개로 나누고 학습 시키는것을 반복한다.
  • 평가 방식을 선택할 때 다음의 사항을 유의 해야 함.
    • 대표성 있는 데이터 : 훈련 세트와, 테스트 세트가 주어진 데이터에 대표성이 있어야 함. 한쪽으로 쏠려 있는 데이터라면 당연히 잘못 훈련이 될 것이고 테스트도 잘못 될 것이다. 일반적으로는 데이터를 무작위로 섞어 쓰는것이 일반적.
    • 시간의 방향 : 과거로부터 미래를 예측한다면, 당연히 데이터를 섞으면 안된다.
    • 데이터 중복 : 같은 데이터가 여러개가 있는 경우, 데이터를 섞어서 훈련 세트와 테스트 세트로 만들게 되면, 훈련 세트에 있는 데이터와 테스트 세트에 있는 데이터가 동일하게 될 수 있다. 그러면 결국 테스트한 데이터가 학습 데이터에 들어 있다는 말이 된다. 그러므로 이걸 섞이지 않도록 해 주는게 중요하다.

데이터 전처리, 특성 공학, 특성 학습

  • 피처 엔지니어링 관련 내용 : 관련 내용은 다른 책을 참고하자. ㅎ
  • 벡터화 : 모든 데이터를 숫자형태(int나 float)로 바꿔야 한다.
  • 값 정규화 : 스케일이 다른 값들을 일정한 범위로 바꿔 줘야 한다. 스케일이 너무 차이나면 문제가 되기 때문이다. 일반적으로 평균을 0, 표준편차를 1로 만들어주는 작업. 대부분 0 ~ 1 사이의 값을 취하도록 한다.
  • 누락된 값 : 데이터가 누락된 경우에는 0이나 평균값, 중간값등으로 처리해도 크게 문제되지 않는다. ( 그 값 자체가 의미가 있지 않다면 말이다. ) 네트워크가 알아서 적당히 처리 할 것이다. (하지만... 확인해 보기 전에는 알 수 없지 않을까??)
  • 특성 공학(피처 엔지니어링) : 데이터를 사용하기 전에 먼저 잘 학습되도록 적당히 바꿔 주는것.
    • 이미지로 시간을 맞추는것을 한다면, 이미지를 바로 사용한다면 CNN같은걸 써야 겠지만, 단순한 이미지 처리로 바늘두개의 각도를 구할 수 있다면 더 쉽게 학습 시킬 수 있을 것이다.
    • 특성을 더 간단한 방식으로 표현하여 문제를 쉽게 만든다. 이럴려면 해당 문제를 아주 잘 이해하고 있어야 한다.
    • 딥러닝 이전에는 매우 중요 했음.
    • 다행히 최근 딥러닝은 대부분 특성 공학이 필요하지 않습니다. 신경망이 자동으로 원본 데이터에 유용한 특성을 추출할 수 있기 때문입니다. 하지만...
      • 좋은 특성은 적은 자원을 사용하여 문제를 더 잘 풀 수 있음. 시계 바늘을 읽는 문제는 굳이 합성곱 신경망(CNN)을 사용할 필요가 없음.
      • 좋은 특성은 더 적은 데이터로 문제를 풀 수 있음. 딥러닝 모델은 특성을 학습할때 많은 양의 데이터가 필요함. 샘플의 갯수가 적다면 특성을 잘 뽑아내 주는게 중요함.

과대적합과 과소적합

  • 과소적합 : 아직 학습할 껀덕지가 있는 상태
  • 과대적합 : 학습 데이터에만 너무 집중되고 있는 상태 ( 자세한건 따로 보셈 ㅋ ). 그러므로 이걸 피해야 한다. 이렇게 피하는걸 규제(regularization)라고 한다.
    • 네트워크 크기 축소
      • 네트워크의 크기가 크면, 외울 수 있는 capacity가 크고, 그러므로 학습한 데이터를 모두 외워 버릴 수 있을 정도가 될 수 있다.
      • 그러므로 일반화 시킬려면 오히려 네트워크를 줄여야 한다.
      • 우리가 필요한것은 학습 데이터를 잘 맞추는게 아니라, 다른것도 잘 맞출 수 있도록 일반화 되어야 하기 때문이다.
      • 하지만, 그렇다고 네트워크 크기를 팍 줄이면, 기억할 공간이 줄어 들기 때문에 학습이 잘 안될 거다... 그러니 절충점을 잘 찾아야 한다... (그게 쉽나.. T_T)
      • 책에 나오는 실제 검증한 그래프를 보면, 네트워크가 크면 더 빨리 과대적합이 나타나게 된다.
    • 가중치 규제(Weight regularization)
      • 오캄의 면도날 : 어떤 것에 대한 두가지 설명이 있다면 더 적은 가정이 필요한 설명이 더 옳을 것이다.
      • 네트워크의 복잡도에 제한을 두어 가중치가 작은 값을 가지도록 강제하는것. 이러면 가중치의 값의 분포가 더 균일하게 된다.
      • L1 규제 : 가중치의 절댓값에 비례하는 비용이 추가 됨(가중치의 L1노름-norm). 이 경우에는 일부 가중치 값이 0이 되는 경우가 생길 수도 있음.
      • L2 규제 : 가중치의 제곱에 비례하는 비용이 추가 됨(가중차의 L2노름) - 가중치의 파라미터를 모두 제곱하여 더한 후 이 값의 제곱근을 추가, 훈련할 때만 해당 값을 추가. 그러므로 테스트의 loss 값보다, 훈련할때의 loss 값이 더 커질 것임.
      • L2 규제를 적용하면 좀 더 과대 적합에 잘 견딤
      • L1 규제와 L2 규제를 같이 쓰는것을 엘라스틱넷(ElasticNet)이라고 부름. L1, L2 모두 기본값은 0.01로 되어 있음. 책에서는 0.001을 사용하고 있음.
    • 드롭아웃
      • 학습시 신경망의 일부를 끄는(출력을 0으로 만듬)것. (자세한것은 생략)

보편적인 머신 러닝 작업 흐름

  • 성공 지표 선택 : "성공이 무엇인가?"를 정의하는게 중요함. 정확도? 정밀도? 재현율? 고객 재방문률? 비즈니스 성공처럼 고수준의 목표와 직접적으로 연결되어 있어야 함.
    • 클래스 분포가 균일한 분류 문제에서는 정확도가 ROC AUC가 일반적인 지표
    • 클래스 분포가 균일하지 않은 문제에서는 정밀도와 재현율을 사용할 수 있음.
    • 랭킹 문제나 다중 레이블 문제에는 평균 정밀도를 사용할 수 있음.
  • 모델에 맞는 마지막 층의 활성화 함수와 손실 함수 선택
    • 문제 유형, 마지막 층의 활성화 함수, 손실 함수
    • 이진 분류, 시그모이드, binary_crossentropy
    • 단일 레이블 다중 분류, 소프트맥스, categorial_crossentropy
    • 다중 레이블 다중 분류, 시그모이드, binary_crossentropy
    • 임의 값에 대한 회귀, 없음, mse
    • 0과 1 사이 값에 대한 회귀, 시그모이드, mse 또는 binary_crossentropy

요약

  • 생략

2부 실전 딥러닝

  • 생략

5장 컴퓨터 비전을 위한 딥러닝

  • 생략

합성곱 신경망 소개

  • 생략

소규모 데이터셋에서 밑바닥부터 컨브넷 훈련하기

  • 데이터가 풍부할때만 작동한다는 말을 들음. 하지만 딥러닝은 특성을 찾는것이다. 그러므로 특성을 쉽게 찾을 수 있다면 많은 데이터가 필요하지 않을 수도 있다.
  • 특성 앱의 깊이는 네트워크에서 점진적으로 증가하지만(32에서 128까지), 특성맵의 크기는 감소합니다. ( 150x150 에서 7x7까지 - padding이 0인 경우로 계산하면 150, 148 -> 74, 72 -> 36, 34 -> 17, 15 -> 7 이 된다.). 이는 거의 모든 컨브넷에서 볼 수 있는 전형적인 패턴입니다.
  • 케라스에는 이미지를 쉽게 처리하기 위한 유틸리티가 존재한다.
    • keras.preprocessing.image
    • keras.preprocessing.image.ImageDataGenerator
    • Generator를 만들때 batch_size를 적어 두면, 전체중 그 갯수 만큼이 반환된다.
    • 나중에 fit_generator 할 때는 step_per_epoch * batch_size 가 전체가 되도록 만들어 주어야 한다.
    • 리스트와 달리 반복자와 제너레이터는 전체 항목을 미리 만들지 않기 때문에 메모리에 효율적입니다.
  • 데이터 증식(data augmentation - 데이터 오그멘테이션)
    • 데이터의 숫자가 너무 작으면 데이터 갯수를 늘려주는것이 좋다.
    • ImageDataGenerator에서 아래 옵션을 주면, 속성에 맞게 이미지를 더 생성한다.
      • rotation_range : 랜덤하게 사진을 회전(0~180)
      • width_shift_range : 이미지를 평행 이동 (1 이하면 비율, 이상이면 pixel)
      • height_shift_range : 이미지를 수직 이동 (1 이하면 비율, 이상이면 pixel)
      • sher_range : 이미지를 비뚤게 회전 시킬 각도 범위
      • zoom_range : 확대할 범위
      • horizontal_flip : 이미지를 수평 대칭 변환 ( 얼굴, 풍경 등, 글자가 있는것은 수평 대칭 변환하면 안됨 )
      • fill_mode : 회전, 가로/세로 이동시 새롭고 생긴 픽셀을 채울 전략
    • 검증 데이터셋은 데이터 증식(data augmentation)을 하면 안됨. 오직 학습 데이터 셋에서만 할 것.

사전 훈련된 컨브넷 사용하기

  • 데이터 셋이 너무 작으면 어차피 잘 안되니깐, 이미 많은 양의 데이터로 만들어진 잘 학습된 모델을 활용해서 해보자는 방법.
  • 많은 양의 데이터로 잘 학습된 모델은, 내가 필요로하는 특성을 정확하게 잘 찍어 낼 순 없겠지만, 일반적인 특성은 잘 찍어 낼 수 있을 것이므로 이걸 활용하는것이 더 좋을 것임.
  • 실제 필요한것과는 다를지라도, 이론적으로는 효율적임.
  • 책에서는 VGG넷을 사용함. VGG16은 최신것도 아니고, 제일 좋은것도 아니지만, 이 모델 구조가 이전에 보았던것과 비슷해 새로운 개념을 도입하지 않고 이해를 쉽게 할 수 있기 때문에 사용.
  • 일반적으로는 합성곱(Convolution)부분만 재사용함.
    • 합성곱 층은 "학습된 표현이 더 일반적이어서 사용 가능" : 아마도, 합성곱층은 이미지 필터를 거치면서 나오는 특징을 그대로 쓰고, 같은 이미지 필터를 여러곳에서 사용할 수 있기 때문이라고 보임.
    • 하위층은 엣지, 색깔, 질감등의 특성을 뽑고,
    • 상위측은 눈이나 귀처럼 추상적인 개념을 추출
    • 만약, 새로운 데이터셋이 학습된 모델의 데이터셋과 많이 다르다면, 하위층만을 사용하는것도 하나의 방법.
    • 재사용시 trainable값을 False로 줘서, 사전 학습된 표현이 업데이트 되지 않도록 하는것이 중요함.
  • 미세 조정(파인튜닝 - fine tuning)
    • 이전에는 학습된 모델의 top만 제거하고, 새로운 layer를 붙여서, 새 layer만 학습하는 방식으로 재활용 했다.
    • 하지만, 동결 시켜 두었던 부분도 일부를 학습 시키는 방법을 쓸 수도 있다.
      • 사전에 훈련된 기반 네트워크 위에 새로운 네트워크 추가
      • 기반 네트워크 동결 후, 새로 추가한 네트워크 훈련
      • 기반 네트워크에서 일부 층을 동결 해제 한 후, 새로 추가한 네트워크와 같이 학습
    • 합성곱의 하위층은 일반적이고, 재사용가능한 특성을 학습하므로 그대로 사용하고, 상위층은 특화된 특성을 인코딩하므로, 이 부분만 다시 학습 시킨다.
  • 손실 곡선이 향상되지 않았으나, 정확도가 높이진 이유?
    • 손실 값 그래프는, 각 손실의 평균이다. 그러므로 전체의 정확도와는 별개이다. 손실 값이 큰것들은 아예 많이 커져 버리고, 나머지는 손실값을 줄이고 잘 맞추게 업데이트 된다면, 손실 값의 평균은 유지 되면서, 정확도는 높아 질 수 있다.

컨브넷 학습 시각화

  • 생략
  • CAM 을 사용하면, 이미지의 어느 위치가 분류에 영향을 미쳤는지 알 수 있다.
  • 생략

요약

  • 생략

6장 텍스트와 시퀀스를 위한 딥러닝

  • 텍스트(단어의 시퀀스), 시계열 또는 이반적인 시퀀스를 처리 할 수 있는 모델을 살펴 볼 것임
  • 시퀀스 데이터를 처리하는 기본적인 모델
    • 순환신경망(recurrent neural network, RNN)
    • 1D 컨브넷(1D convnet)
  • 시퀀스 데이터 형태로 처리하는 것들
    • 문서 분류나 시계열 분류, 글의 주자네 책의 저자 식별
    • 시계열 비교, 두 문서의 관련성, 주식 가격의 관련성
    • 시퀀스-투-시퀀스 학습, 영어 문장을 프랑스어로 번약하기
    • 감성 분석. 트윗이나 영와 리뷰가 긍정적인지 부정적인지 분류하기
    • 시계열 예측. 최근 어떤 지역의 날씨가 주어졌을때, 날씨 예측하기
  • 책에서는 IMDB의 감정분석과, 기온 예측만 집중하여 볼 것임.

텍스트 데이터 다루기

  • 문서 분류, 감성 분석, 저자 식별, (제한된 범위의) 질문 응답 등에 적합

  • 이런 딥 러닝 모델이 사람처럼 진짜 텍스트를 이해하는것은 아님

  • 문자 언어(written language)에 대한 통계적 구조를 만들어 간단한 텍스트 문제를 해결 하는 것임.

  • 컴퓨터 비전이 픽셀에 적용한 패턴인식인 것처럼, 자연어 처리를 위한 딥러닝은 단어, 문장, 문단에 적용한 패턴 인식

  • 텍스트 역시, 그대로 사용하지 못하고 숫자 형태로 바꿔 줘야 함.

  • 텍스트를 숫자 형태로 바꾸는것을 텍스트 벡터화(vectorizing)이라고 함

    • 텍스트를 단어로 나누고, 각 단어를 하나의 벡터로
    • 텍스트를 문자로 나누고, 각 문자를 하나의 벡터로
    • 텍스트에서 단어나 문자 n개를 뽑은 뒤에, 그 조합을 벡터로
    • 텍스트를 일정 기준으로 나눈것을 토큰이라고 함. 이런 토큰을 잘 처리해서 벡터를 만들 수 있음.
  • 원핫인코딩

    • 텍스트도, 단어별로 쪼갠 뒤, 각 단어를 원핫인코딩으로 바꿀 수 있다.
    • 원핫인코딩으로 바꿀때, 텍스트가 아닌 경우를 대비하여 1개를 비워 두는 센스를 발휘하자.
    • keras.preprocessing.text.Tokenizer(num_words=1000)을 사용하면, 가장 빈도가 높은 1000개 단어만 사용하도록 할 수 있음.
    • 원핫해싱이라고, 인덱스를 따로 설정하지 않고, key를 value의 hash 값을 사용하도록 한다. 바로바로 데이터를 찍을 순 있겠지만, hash 된 값이 겹쳐 버리는 문제가 발생할 수 있다.
  • 단어 임베딩(워드 임베딩, word embedding)

    • 책에서는 밀집 단어 벡터(word vector)이라고 적혀 있는데, 전체를 영어로 적으면 dense word vector이다. dense를 보통 밀집이라고 해석하는데, 의미 없이 공간을 차지하는 정보가 없는 정도로 해석하면 좋겠다. 원핫인코딩의 경우 많은 값들이 0 이고, 딱 1개만 1이기 때문에 0은 의미가 없다(이런 애들을 희소(sparse)하다고 한다). 그러므로, 14번째 위치에 1이 있다고 표현하는 ( 14, 1 ) 이라고 표현하면 dense하게 표현되었다고 볼 수 있다.
    • keras.layers.Embedding(1000,64)는, 1000개의 단어를 64차원으로 표현하겠다는 것이다.
    • Embedding을 만들고, dense를 만들어 붙인 후에 데이터를 fit으로 때려 박으면, 알아서 잘 분리한 vector가 만들어 진다.
    • 임베딩 알고리즘에는 Word2Vec나 GloVe 같은게 있다.
    • 당근, 데이터셋이 작다면, 사전 학습된 모델을 읽어와서 재활용하고, 필요한 부분만 덧붙여 쓰는게 좋다.
    • 순환 신경망 이해하기

  • RNN, LSTM 설명, 생략.

순환 신경망의 고급 사용법

  • 순환 드롭아웃 : 순환층에서 과대적합을 방지하기 위해 사용. 케라스에 내장되어 있음. ( GRU나 LSTM에 dropout 값을 줄 수 있음 )
  • 스태킹 순환 층 : 순환층의 마지막 노드의 결과만 내 뱉는게 아니라, 모든 노드의 결과를 연결해 주는 형태 ( return_sequences 값을 이용해서 처리 할 수 있음 )
  • 양방향 순환 층 : 데이터를 a, b, c, d 순으로 입력하던것을 d, c, b, a 순으로도 입력하는 branch 층을 만든다.

컨브넷을 사용한 시퀀스 처리

  • 벡터를 RNN으로 계속 순환 시킬것이 아니라, CNN 1D로 계산하는 방식
  • CNN으로 계산하면 훨씬 속도가 빨라진다.
  • 1D CNN으로 특징을 먼저 뽑아내고, RNN을 돌릴 수도 있다.

7장 딥러닝을 위한 고급 도구

Sequential 모델을 넘어서: 케라스의 함수형 API

  • 기존에는 순차적으로 연결한 모델만 만들 수 있었다.

  • 하지만, 함수형 API를 사용하면, branch를 만들거나, merge 할 수 있다.

  • 일반적인 Sequence Model을 함수형 API로 표현

    input_tensor = Input( shape=(64,) )
    x = layers.Dense(32, activation='relu')(input_tensor)
    x = layers.Dense(64, activation='relu')(x)
    output_tensor = layers.Dense(10, activation='softmax')(x)
    
    model = Model(input_tensor, output_tensor)
  • 2개 이상의 vector을 받아서, 1개의 출력으로 내는 경우

    text_input = Input( shape=(...) )
    embedded_text = layers.Embedding(....)(text_input)
    encoded_text = layers.LSTM(...)(embedded_text)
    
    ques_input = Input( shape=(...) )
    embedded_quest = layers.Embedding(....)(ques_input)
    encoded_ques = layers.LSTM(...)(embedded_ques)
    
    concatenated = layers.concatenate([encoded_text, encoded_ques], axis=-1) 
    
    answer = layers.Dense(64, activation='softmax')(concatenated)
    
    model = Model ( [text_input, ques_input] , answer )
    
    model.compile( optimizer='rmsprop', loss='categorical_crossentropy' ) # 1개의 output이므로 optimizer나 loss 는 1개 만 설정하면 된다. 
    
    model.fit ( [text, ques], answer, ... ) # 2개의 Input과 1개의 Output이다.
  • 2개 이상의 출력을 내는 경우

    # 나머지는 비슷하게 하고, 제일 마지막 출력층에 대한 것만...
    age_predict = layers.Dense(1)(x)
    
    income_predict = layers.Dense(100, activation='sfotmax'(x)
    
    gender_predict = layers.Dense(1, activation='sigmoid')(x)
    
    model = Model ( input, [age_predict, income_redict, gender_predict]) # 1개의 Input과 3개의 Output에 대해서 처리해야 한다.
    model.compile( optimizer='rmsprop', loss = ['mse'm 'categorical_crossentropy', 'binary_crossentropy'] ) # 3개의 Output에 대한 각각의 정보가 필요하다.
    # 필요할 경우 compile 옵션으로 loss_weight=[1.0, 0.25, 10.] 등, loss 값에 가중치를 줄 수도 있다.
    
    model.fit ( posts, [age_targets, income_targets, gender_targets], ... ) # 입력이 1개, 출력이 3개다.
  • 인센셥 모델의 경우 branch를 따고, 합치는 과정이므로, 이 글에서는 따로 설명하지 않고 pass.

  • 잔차연결(residual connection)

    x = layers.Conv2D(...)(x)
    y = layers.Conv2D(...)(x)
    y = lqyers.Conv2D(...)(y)
    
    y = layers.add( [ y, x ] ) # 마지막 y의 특성에 x의 출력 특성을 더한다.
  • 기존의 모델을 layer 처럼 사용 가능

    xception_base = application.Xception(weight=None, include_top=False)
    input = Input(shape=(250, 250, 3))
    features = xeception(input)    

케라스 콜백과 텐서보드를 사용한 딥러닝 모델 검사와 모니터링

  • 콜백 : 콜백을 직접 만들 수도 있지만, 이 글에서는 중요한거만...

    • ModelCheckpoint : epochs 마다 모델을 저장한다.

    • EarlyStopping : validation loss가 일정 횟수 이상, 줄어 들지 않으면 자동으로 멈춘다.

    • ReduceLROnPlateau : validation loss가 향상되지 않으면, 학습률을 작게 할 수 있음.

    • 예제

      callbacks_list = [
      // val_acc 값이 patience 만큼 횟수의 epoch를 돌았는데도, 정확도가 늘지 않으면 멈춘다.
      keras.callbacks.EarlyStopping( monitor='val_acc', patience=1),
      
      // epoch 마다 my_model.h5에 저장한다. 단, val_loss 값이 줄어들지 않으면, 모델을 덮어쓰지 않는다.
      keras.callbacks.ModelCheckpoint(filepath='my_model.h5' , monitor='val_loss', save_best_only=True),
      
      // val_loss 값을 확인해서 10번동안 줄어들지 않으면, 학습률을 1/10 으로 줄인다.
      keras.callbacks.ReduceLROnPlateau( momitor='val_loss',factor=0.1, patience=10 );
      ]
      
      // callback에서 val_loss 값을 사용하기 때문에, metrics에 acc 값이 포함되어 있어야 한다.
      model.compile( optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'] )
      
      // epoch 마다, callbacks_list에 있는 callback들을 호출한다. 이 callback에서 val_acc 값을 사용하기 때문에, 꼭 validation_data 값이 필요하다.
      model.fit( x, y, epochs=10, batch_size=32, callbacks = callbacks_list, validation_data=(x_val, y_val))
  • 텐서보드 : 텐서플로우일때만 사용할 수 있자만 참 유용함

    • TensorBoard : 훈련하는 동안의 지표, 모델 구조 확인, 활성화 출력, 3D 임베딩 등을 쉽게 볼 수 있음

    • 예제

      callbacks = [
        // 학습 로그는 my_log_dir에 남기며, 1 epoch마다, 활성화 출력과 임베딩 데이터를 기록.
        keras.callbacks.TensorBoard( log_dir='my_log_dir', histogram_freq=1, embeddings_freq=1 )
      ]
    • python 코드를 실행 시킨 후 shell에서 tensorboard --logdir=my_log_dir 실행후, http://localhost:6006 에 접속하면 볼 수 있음.

  • 모델 시각화

    • TensorBoard를 사용하면 모델 시각화를 할 수 있지만, tensorflow의 모델 형태로 나오기 때문에 보기가 어렵다.

    • 케라스 모델을 쉽게 볼 수 있게 이미지로 만들 수 있는 방법도 있다.

      from keras.utils import plot_model
      // 케라스 모델인 model을 보기 쉽게 model.png 파일에 이미지로 떨어뜨려 준다.  
      // show_shapes = True, layer의 input과 output의 shape을 같이 보여준다.  
      // show_layers_name = True, layer 이름을 같이 보여 준다.  
      // rankdir = TB | LR, TB면 수직으로, LR 수평으로 그려준다.  
      plot_model ( model, to_file='model.png', show_shapes=True )

모델의 성능을 최대로 끌어올리기

  • 배치 정규화

    • 배치 정규화를 사용하면 더 깊은 네트워크를 구성할 수 있다.

    • BatchNormalization은 일반적으로, 합성곱이나 환전 연결층 다음에 사용함

      conv_model.add( layers.Conv2D(32, 3, activation='relu') )
      conv_model.add( layers.BatchNormalization() )
      
      dense_model.add( layers.Dense(32, activation='relu') )  
      dense_model.add ( layers.BatchNormalization() )  
    • 배치 정규화클래스는 특성 축을 지정할 수 있는 axis 매개 변수가 있음. ( 기본값 -1, 입력텐서의 마지막 축 )

    • data_format을 "channels_last"로 하여, Dense, Conv1D, ENN, Conv2D 층을 사용할 때 맞는 값.

    • data_format이 "channels_first"라면, 특성축이 1이므로, axis=1 로 주어야 함. ( 0번째 축은 "배치"차원 축 )

  • 깊이별 분리 합성곱 ( depthwise separable convolution )

    • Conv2D 보다 가볍고, 빠르다. 성능도 좋다.
    • 적은 데이터로도 좋은 표현을 학습하고, 결국 성능이 더 좋은 모델을 만듬. 제한된 데이터로 작은 모델을 만들때 중요.
    • 예제는 Conv2D를 사용하는곳에 모두 layers.SeparableConv2D를 사용하는 형태로만 바꾸면 됨.
  • 하이퍼 파라미터 최적화

    • 규칙은 없다. 자동으로 하이퍼 파라미터를 찾아주는건 연구되고 있는 과정
    • 관련 라이브러리 : Hyperopt, Hyperas(Hyperopt와 연동하여 keras에서 사용가능), Auto-Keras, auto-sklearn
  • 모델 앙상블(model ensemble)

    • 하나의 목적을 가진 여러가지 모델을 만들고, 각 모델별 예측치를 평균하여 찾는 방법
    • 한가지 모델은 편향되어 있을 수 있지만, 여러가지 편향을 가진 각 모델을 평균내면 오히려 더 잘 동작할 수도 있다.

8장 생성 모델을 위한 딥러닝

LSTM으로 텍스트 생성하기

  • 생략

딥드림

  • 내가 별로 관심이 없어서 생략. ㅎ. 책도 대충 읽고 넘김. ㅎ.

뉴럴 스타일 트랜스퍼

  • 생략

변이형 오토인코더를 사용한 이미지 생성

  • 생략

적대적 생성 신경망 소개

  • GAN(Generative Adversarial Netowkrs)
  • 모델은 크게 두가지로 나뉨. 한쪽에서는 이미지를 생성, 한쪽에서는 생성된 이미지가 진짜/가짜인지 판단
  • 양쪽을 모두 학습 시킨 뒤, 생성 부분만 모델만있으면, 이미지를 생성할 수 있음.
  • 대충은 아니깐, 자세한건 생략.

이하 항목 생략

Windows 10 64bit에서 Tensorflow(텐서플로우) 설치 하기

이제 Windows 10 64bit에서 Tensorflow를 바로 설치해서 사용할 수 있게 되었다. 이전에 리눅스에서 설치 해 봤는데, 너무 귀찮고 뭔가 어려웠다. 특히 그래픽카드 설정하는 부분이 제일 짜증났다. -_- 이제는 걍 Windows 10 에 바로 설치가 되니깐.. 이번 기회에 깔아 보았다.

Python 설치

Tensorflow는 C++, Python API를 제공하고 있고, 실험적이지만 Java API 도 있다고 한다. 여기서는 Python 을 이용해서 해 볼 거다. C++ 이나 Java는 계속 컴파일도 해야 하고 귀찮아 보인다. 대부분의 예제도 Python 으로 만들어져 있으니 당근 Python 으로 가는게 좋은 수순으로 생각된다. Python은 파이썬 공식 홈페이지에서 제공하는 배포판을 설치를 해도 되지만, 머신러닝 하는 사람들은 대부분 Anaconda 라고 하는 비공식 배포판을 이용해서 설치한다. Anaconda에 있는 배포판을 설치하면 아주 많은 라이브러리를 기본적으로 포함하고 있으니. 우리도 Anaconda에 있는 배포판을 사용해서 설치 하도록 하자.

Anaconda 설치

아래의 링크에 들어 가서 Python 3.x 대 버젼을 받도록 하자. ( 예전에는 3.5 였는데, 지금은 3.6 으로 되어 있다. )

설치 방법이야, 그냥 Next 만 열심히 눌러도 잘 된다. Python 관련 PATH 설정까지 자동으로 해 주므로 잘 설치 하도록 하자.

설치시 주의 사항

Python때문인지, Tensorflow 때문인지는 몰라도, 이쪽 세계에서는 설치하는 경로에 공백이나 한글등이 들어가면 동작이 제대로 안 하는 경우가 많다. 그러므로 반드시 공백이나 한글이 없는 경로에 설치 하자. 글쓴이의 경우에는 D:\cjcho\Anaconda3 에 설치 했다.

Tensorflow 설치 하기

Tensorflow를 돌릴 수 있도록 Python은 설치 했으니 Tensorflow를 설치해 보자.

Anaconda 에서 tensorflow를 위한 가상환경 만들기

보통 개발을 하면, 환경 구성을 잘 해 두는데, 이게 이것저것 설치하다 보면 환경이 섞여서 뭔가 꼬이는 경우가 많이 발생한다. 그래서 Python에서는 "가상의 개발 환경"을 여러 프로그램별로 따로 구성해서 쓸 수 있도록 "가상환경"이라는것을 제공해 준다. 보통 virtualenv라는것을 이용해서, 환경을 여러개 만드는데, Anaconda에서는 conda 라는 명령을 이용해서 여러개의 가상환경을 만들 수 있다.

다른 개발 환경과 섞이지 않도록 tensorflow 만을 위해 독립적인 환경을 따로 만들도록 하자. conda 관련 명령을 실행 시키기 위해서 anaconda prompt를 실행 시키자. Windows 키를 누른뒤에 anaconda prompt라고 치면 나온다.

프롬프트의 앞에 (D:\cjcho\Anaconda3) 라고 뜨는것은 현재 사용중인 환경의 이름을 나타낸다.

conda info --envs 명령을 이용해서 현재 만들어진 가상 환경을 확인해 보자. 글쓴이의 경우에는 이미 만들어진 환경이 있어 아래와 같이 여러개의 환경이 나온다.

(D:\cjcho\Anaconda3) C:\Users\magic>conda info --envs
# conda environments:
#
bunnies                  D:\cjcho\Anaconda3\envs\bunnies
snowflakes               D:\cjcho\Anaconda3\envs\snowflakes
tf_gpu                   D:\cjcho\Anaconda3\envs\tf_gpu
root                  *  D:\cjcho\Anaconda3

(D:\cjcho\Anaconda3) C:\Users\magic>

Windows 10에서 동작하는 tensorflow는 python 3.5를 지원하므로 python은 3.5로 지정해서 python 환경을 먼저 만들어야 한다. 이 환경 이름을 tf 라고하자. conda create --name tf python=3.5 라는 명령을 이용하면 python 3.5를 기반으로 하는 tf라는 환경을 만들 수 있다.

(D:\cjcho\Anaconda3) C:\Users\magic>conda create --name tf python=3.5
Fetching package metadata .............
Solving package specifications: .
Package plan for installation in environment D:\cjcho\Anaconda3\envs\tf:

The following NEW packages will be INSTALLED:

    certifi:        2017.1.23-py35_0 conda-forge
    pip:            9.0.1-py35_0     conda-forge
    python:         3.5.3-1          conda-forge
    setuptools:     33.1.0-py35_0    conda-forge
    vs2015_runtime: 14.0.25420-0     conda-forge
    wheel:          0.29.0-py35_0    conda-forge

wincertstore:   0.2-py35_0       conda-forge

Proceed ([y]/n)? y

python-3.5.3-1 100% |###############################| Time: 0:00:32 545.45 kB/s
#
# To activate this environment, use:
# > activate tf
#
# To deactivate this environment, use:
# > deactivate tf
#
# * for power-users using bash, you must source
#

(D:\cjcho\Anaconda3) C:\Users\magic>

tensorflow를 동작시킬 tf 라는 Python 3.5 환경을 만들었으니, activate tf 라는 명령으로 tf 환경 안으로 들어 가자.

(D:\cjcho\Anaconda3) C:\Users\magic>activate tf

(tf) C:\Users\magic>

tf라는 환경으로 진입했다. tf라는 환경에 python 3.5가 제대로 설치 되어 있는지도 확인하고 어떤 라이브러리(?)들이 설치 되어 있는지도 확인하자. conda list라는 명령을 사용하면 된다.

(tf) C:\Users\magic>conda list
# packages in environment at D:\cjcho\Anaconda3\envs\tf:
#
certifi                   2017.1.23                py35_0    conda-forge
pip                       9.0.1                    py35_0    conda-forge
python                    3.5.3                         1    conda-forge
setuptools                33.1.0                   py35_0    conda-forge
vs2015_runtime            14.0.25420                    0    conda-forge
wheel                     0.29.0                   py35_0    conda-forge
wincertstore              0.2                      py35_0    conda-forge

(tf) C:\Users\magic>

위에 보다시피 python 3.5가 제대로 설치 된 것을 볼 수 있다.

가상환경에 tensorflow 설치 하기

tensorflow를 설치할때 CPU용을 설치 할 것인지 GPU 용을 설치 할 것인지를 정해야 한다.

가상환경에 tensorflow 설치 하기 / CPU 용

보통 anaconda에서는 conda install 이라는 명령을 통해서 패키지를 설치하게 되는데, Tensorflow 공식 가이드에서는 pip를 이용해서 설치 하도록 하고 있다. tensorflow는 CPU 버젼과 GPU 버젼이 따로 있는데, pip라는것을 이용하는 방법만이 CPU와 GPU 두가지를 모두를 제공하고 있다. conda install방식을 사용하면 CPU 버젼만 사용할 수 있다. CPU 버젼 설치는pip를 사용하지 않고 걍 conda install명령으로 설치해 볼 것이다. anaconda는 이미 tensorflow를 Windows 에서 설치 할 수 있도록 패키징 해 두었다. https://anaconda.org/ 에 접속해서 tensorflow 라고 검색을 해 보자.

  • 중요 : Tensorflow 팀에서는 Anaconda를 이용한 설치 방법에 대해서는 관라하지도 않을것이고, 확인하지도 않을 것이라고 했다. 그러므로 pip를 이용하는 방법이 더 좋겠으나, 여기서 CPU 버전은 그냥 conda 방식을 이용해서 보여 주도록 한다. 어차피 GPU 방식은 pip를 이용해서 설치해야 한다.

아래와 같이 이미 패키징 된 것들을 많이 볼 수 있다.

conda-forge가 anaconda의 기본 패키징 저장소이므로, 우리는 conda-forge / tensorflow 를 클릭해서 들어 가 보도록 하자. 그러면 아래와 같이 어떤 명령을 치면 tensorflow를 설치할 수 있는지 알 수 있다.

아까 tf환경으로 들어 가 있던 프롬프트에서 conda install -c conda-forge tensorflow=1.0.0 명령을 이용해 설치 하도록 하자.

만약 Tensorflow 공식 가이드대로 pip로 설치 하고 싶다면 pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.0.0-cp35-cp35m-win_x86_64.whl 를 쳐 넣으면 된다. 혹시 이렇게 해서 설치가 안되면, 파일명의 제일 뒤를 _x86_64.whl 라고 하지 말고, _amd64.whl 이라고 바꿔보자. 얼마전까지만 해도 링크가 깨졌는지, 제대로 동작하지 않았었다.

아래 메세지들은 0.12.1 버젼을 기준으로 캡쳐 된 것이다. 그러므로 1.0.0 으로 설치를 하면 조금 다른 내용이 나올 것이다.

(tf) C:\Users\magic>conda install -c conda-forge tensorflow=0.12.1
Fetching package metadata .............

Solving package specifications: .

Package plan for installation in environment D:\cjcho\Anaconda3\envs\tf:

The following NEW packages will be INSTALLED:

    mkl:        2017.0.1-0
    mock:       2.0.0-py35_0      conda-forge
    numpy:      1.12.0-py35_0
    pbr:        1.10.0-py35_0     conda-forge
    protobuf:   3.1.0-py35_vc14_0 conda-forge [vc14]
    six:        1.10.0-py35_1     conda-forge
    tensorflow: 0.12.1-py35_2     conda-forge

zlib:       1.2.11-vc14_0     conda-forge [vc14]

Proceed ([y]/n)? y

numpy-1.12.0-p 100% |###############################| Time: 0:00:01   3.69 MB/s

tensorflow-0.1 100% |###############################| Time: 0:01:26 178.02 kB/s

(tf) C:\Users\magic>

가상환경에 tensorflow 설치 하기 / GPU 용

주의사항 : GPU용은 NVIDIA CUDA 8.0 이상을 지원하는 GPU만을 사용할 수 있다. 만약 지원하지 않는 GPU라면 이 과정을 거쳐도 사용할 수 없으니. 깔끔하게 포기하자.

아래 두 툴킷을 설치해야 한다. 이 툴킷들은 NVIDIA에서 제공하는 프로그램이고, 자신의 GPU에서 아래 버젼의 툴킷을 사용할 수 있는지 확인되어야 한다. 참고로 GTX 670의 경우 아래의 두 툴킷을 모두 사용할 수 있는 환경이었다.

NVIDIA 홈페이지에 접근해서, 가입하고... 동의한 뒤에... 다운 받아 설치해야 한다.

위 툴킷을 설치하고 하고 난 뒤 tensorflow를 설치하면 된다.

GPU 환경을 사용하기 위한 tensorflow는 conda 방식으로 설치할 수 없다.. 그러므로 pip 방식을 통해서 설치해야 한다. 아래의 명령을 이용해서 tensorflow 를 설치 할 수 있다.

pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.0.0-cp35-cp35m-win_x86_64.whl 

CPU 버전을 pip로 설치할 때와 마찬가지로 해당 패키지를 찾을 수 없을때 URL의 끝 부분을 _x86_64.whl 대신 _amd64.whl로 바꿔서 해 보면 잘 될 수도 있다.

설치에는 좀 오래 걸리니깐 기다려야 한다. cuDNN 및 CUDA에 있는 몇가지 헤더 파일을 복사 하던지.. 무 그런 작업이 있다... 지금은 생각나지 않으니 통과...;; 아래 내용을 계속 진행하다 보면 문제가 생길 수 있는데, 그 상황에 맞게 인터넷에 찾아보면 어렵지 않게 문제를 해결 할 수 있다. ;; 구찬 ;;

Tensorflow가 잘 동작하는지 확인

간단 코드 확인

이하는 CPU 버젼에서 확인한 내용이다.

간단한 코드를 짜서 잘 동작하는지 확인해 보자.

(tf) C:\Users\magic>python
Python 3.5.3 | packaged by conda-forge | (default, Feb  9 2017, 15:12:38) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, Tensorflow!')
>>> sess = tf.Session()
>>> print (sess.run(hello))
b'Hello, Tensorflow!'
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a+b))
42
>>> quit()

(tf) C:\Users\magic>

머신러닝 돌려서 확인하기

이 쪽 세계에는 손글씨를 인식하는 MNIST라는 유명한게 있다. 이것을 이용해서 tensorflow를 테스트 해 보자. tensorflow는 기본적인 예제(?)들을 포함하고 있는데, 간단한 명령 하나로 테스트 해 볼 수 있다. 우선 tensorflow가 어디에 설치 되어 있는지 확인하자. python -c "import os; import inspect; import tensorflow; print(os.path.dirname(inspect.getfile(tensorflow)))" 명령을 이용하면 된다. 가이드 문서에는 " 가 아니라 '로 되어 있는데, Windows에서는 ' 대신 "를 사용해야 한다.

(tf) C:\Users\magic>python -c "import os; import inspect; import tensorflow; print(os.path.dirname(inspect.getfile(tensorflow)))"
D:\cjcho\Anaconda3\envs\tf\lib\site-packages\tensorflow

(tf) C:\Users\magic>

위에 나온 경로에서 models\image\minist\ 디렉토리에 가면 convolutional.py 파일이 있다. 이게 바로 예제이다.

python -m tensorflow.models.image.mnist.convolutional 명령을 이용해서 잘 동작하는지 확인해 보자.

(tf) C:\Users\magic>python -m tensorflow.models.image.mnist.convolutional
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting data\train-images-idx3-ubyte.gz
Extracting data\train-labels-idx1-ubyte.gz
Extracting data\t10k-images-idx3-ubyte.gz
Extracting data\t10k-labels-idx1-ubyte.gz
Initialized!
Step 0 (epoch 0.00), 5.6 ms
Minibatch loss: 8.334, learning rate: 0.010000
Minibatch error: 85.9%
Validation error: 84.6%
Step 100 (epoch 0.12), 295.2 ms
Minibatch loss: 3.254, learning rate: 0.010000
Minibatch error: 6.2%
Validation error: 7.8%
....
....

시간이 꽤나 오래 걸릴것이다.

속도 차이

집에 마침 NVIDIA GPU가 있어서, CPU와 GPU를 버젼을 모두 설치해서 테스트 해 보았다.

CPU : 1590초(26분정도), Intel Core it 3570K, 3.40GHz, 4 core
GPU :  140초( 2분정도), Nvidia GTX 670

NVIDIA GTX 670이 꽤나 오래 전에 나온 GPU인데도, CPU보다 10배 가까이 빠르다.

그렇다. 이제 NVIDIA GPU를 구매하러 가자.

+ Recent posts