핸즈온 머신러닝 Ch.12

송종빈·2023년 2월 16일
0

핸즈온머신러닝

목록 보기
1/1

텐서플로

  • 수치 계산용 라이브러리

  • 대규모 머신러닝에 잘 맞도록 튜닝됨

  • 현재 가장 인기 있는 딥러닝 라이브러리

  • 핵심구조는 NumPy와 비슷하지만, GPU 제공

  • (여러 장치와 서버에 대해서) 분산 컴퓨팅 지원

  • 일종의 JIT (Just-in-time) 컴파일러 포함
    - 파이썬 함수에서 계산 그래프 추출 후 최적화(ex. 사용하지 않는 노드 가지치기)후, 효율적 실행 (ex. 독립적인 연산을 자동으로 병렬 실행) => 계산 최적화 (속도 ↑, 메모리 사용량 ↓)

  • 계산 그래프는 플랫폼에 중립적인 포맷으로 보낼 수 있음 => A환경에서 훈련 후 B환경에서 실행 가능 (ex. A env = 리눅스 파이썬 / B env = 안드로이드 자바)

  • 자동 미분, RMSProp, Nadam 같은 고성능 Optimizer 제공 => 모든 종류의 손실 함수 쉽게 최소화 가능

  • 텐서플로 API
  • 가장 저수준의 텐서플로 연산 operation은 C++ 코드로 구현됨
  • 많은 연산은 커널 kernel이라 부르는 여러 구현을 가짐
  • 각 커널은 CPU, GPU, TPU와 같은 특정 장치에 맞춰 만들어짐
    - 속도 : CPU < GPU < TPU
  • 텐서플로 구조
  • 윈도우, 리눅스, 맥OS에서 실행 가능
    - (텐서플로 Lite 사용시) iOS, 안드로이드 모바일 장치에서도 실행 가능
  • 파이썬 외에 C++, 자바, Go, Swift API도 사용 가능
    - Tensorflow.js : 자바스크립트 구현 => 브라우저에서 직접 모델 실행 가능
  • 텐서플로 라이브러리 생태계
  • TensorBoard : 시각화
  • TFX (TensorFlow Extended) : 제품화를 위한 라이브러리 모음
    - 데이터 시각화
    • 전처리
    • 모델 분석
    • 서빙 등 포함
  • TensorFlow Hub : 사전훈련된 신경망을 다운로드하여 재사용 가능
  • https://github.com/tensorflow/models (일부는 사전훈련되어있음)

넘파이처럼 텐서플로 사용하기

Intro

  • 텐서플로 API는 텐서를 순환시킴
  • 텐서는 한 연산에서 다른 연산으로 흐름
  • 텐서는 넘파이 ndarray와 매우 비슷함
  • 텐서는 일반적으로 다차우너 배열 (but, 스칼라 값도 가질 수 있음)

텐서와 연산

  • ndarray처럼 tf.Tensor는 크기 (shape)와 데이터 타입 (dtype)을 가짐.
  • 인덱스 참조도 넘파이와 매우 비슷하게 작동
  • 모든 종류의 텐서 연산 가능

텐서와 넘파이

  • 넘파이 배열 <-> 텐서 배열 (O)
  • 넘파이 배열 <- 텐서플로 연산 (O)
  • 텐서 <- 넘파이 연산 (O)
  • 넘파이는 64비트 정밀도, but 텐서플로는 32비트 정밀도 사용
    - why? 일반적으로 신경망은 32비트 정밀도로도 충분 + 속도 ↑ + 메모리 ↓
    • therefore, 넘파이 배열로 텐서를 만들 떄는 dtype = tf.float32로 지정해야함

타입 변환

  • 텐서플로는 어떤 타입 변환도 자동으로 수행하지 않음.
    - why? 타입변환은 성능을 크게 감소시킬 수 있으며, 자동 변환 시 사용자가 눈치채지 못할 수 있음.
    • therefore, 호환되지 않는 타입의 텐서로 연산을 실행하면 예외 발생
    • ex. 실수 텐서 + 정수 텐서 (X)
    • ex. 32비트 실수 + 64비트 실수 (X)
  • 타입 변환이 필요할 때는 tf.cast()함수 사용 가능

변수

  • tf.Variable
    - 지금까지의 tf.Tensor = 변경이 불가능한 객체 (텐서의 내용을 바꿀 수 없음)
    • therefore, 일반적인 텐서로는 역전파로 변경되어야 하는 신경망의 가중치를 구현할 수 없음
    • furthermore, 시간에 따라 변경되어야 할 다른 파라미터도 존재함. (ex. 모멘텀 옵티마이저 - 과거 그레디언트를 계속 업데이트해야함)
    • tf.Tensor와 비슷하게 동작 : 동일한 연산 수행 가능 + 넘파이와 호환 가능 + 까다로운 데이터 타입
    • tf.Tensor와 차이점 : assign() 메서드를 사용하여 변수값 변경 가능
      • assign_add(), assign_sub() : 주어진 값만큼 변수 증가 or 감소 가능
        - 원소의 assign() 메서드, scatter_update(), scatter_nd_update() 메서드를 사용하여 개별 원소 수정 가능 (but, 직접 수정 X)
  • 일반적으로 변수를 직접 만들거나 수동으로 업데이트 하는 일은 매우 드물다.

다른 데이터 구조

  • 희소 텐서 (tf.SparseTensor)
    - 대부분 0으로 채워진 텐서를 효율적으로 나타냄
    • tf.sparse 패키지는 희소 텐서를 위한 연산을 제공
  • 텐서 배열 (tf.TensorArray)
    - 텐서의 리스트
    • 기본적으로 고정된 길이를 가짐, but 동적으로 바꿀 수 있음
    • 리스트에 포함된 모든 텐서는 크기와 데이터 타입이 동일해야만 함
  • 래그드 텐서 (tf.TaggedTensor)
    - 리스트의 리스트
    • 텐서에 포함된 값은 동일한 데이터 타입을 가져야 하지만 리스트의 길이는 다를 수 있음.
    • tf.ragged 패키지는 래그드 텐서를 위한 연산을 제공
  • 문자열 텐서 (tf.string)
    - 유니코드가 아닌 바이트 문자열을 나타냄
    • 유니코드 문자열을 사용해 문자열 텐서를 만들면 자동으로 UTF-8로 인코딩됨
    • 유니코드 코드 포인트를 나타내는 tf.int32 텐서를 사용해 유니코드 문자열 표현 가능
    • tf.strings 패키지는 바이트 문자열과 유니코드 문자열과 이런 텐서 사이의 변환을 위한 연산 제공 (* tf.string이 아닌, tf.string's')
    • tf.string은 기본 데이터 타입으로, 문자열의 길이가 텐서 크기에 나타나지 않음.
    • 위 문자열 텐서를 유니코드 텐서 (유니코드 코드 포인트를 가진 tf.int32 텐서)로 바꾸면 문자열 길이가 텐서 크기에 포함됨.
  • 집합 (set)
    - 일반적인 텐서 (or 희소 텐서)로 나타냄
    • tf.constant([[1,2], [3,4]])는 두 개의 집합 {1,2}와 {3,4}를 나타냄
    • 일반적으로 각 집합은 텐서의 마지막 축에 있는 벡터에 의해 표현됨
    • tf.sets 패키지의 연산을 사용해 집합을 다룰 수 있음
  • 큐 (queue)
    - 단계별로 텐서 저장
    • 텐서플로는 여러 종류의 큐를 제공함
      • FIFOQueue (first in, first out)
        • PriorityQueue (특정 원소에 우선권을 줌)
        • RandomShuffleQueue (원소를 섞음)
        • PaddingFIFOQueue (패딩을 추가하여 크기가 다른 원소의 배치를 만드는 큐) 등
    • 위 클래스들은 tf.queue 패키지에 포함됨

사용자 정의 모델과 훈련 알고리즘

사용자 정의 손실 함수

profile
Student Dev - Language Tech & Machine Learning

0개의 댓글