본문 바로가기

AI/AI 라이브러리

[Tensorflow] Tensorflow 입문

728x90
반응형

 

Tensorflow는 구글에서 만든 "Deep Learning 프로그램을 쉽게 구현할 수 있도록 기능을 제공하는 라이브러리"이다.

 

기본적으로 C++로 구현 되나, 파이썬, Java, Go 등 다양한 언어를 지원한다.

이 중 파이썬을 최우선으로 지원하며, 편리한 기능들은 파이썬 라이브러리로만 구현되어 있기 때문에 Python을 사용하는 것을 추천한다.

 

Tensorflow를 사용해야하는 이유는 다음과 같다.(Tensorflow 공식 홈페이지)

  • 손쉬운 모델 빌드 : 다양한 수준의 추상화를 지원, Keras API 등.
  • 어디서든 강력한 ML 제작 : 플랫폼에 상관 없이 모델을 쉽게 학습하고 배포할 수 있음.
  • 연구를 위한 강력한 실험 : Keras Functional API 및 Model Subclassing API와 같은 기능을 사용하여 유연하고 긴밀하게 복잡한 토폴로지 생성을 제어할 수 있고 즉시 실행 기능(손쉬운 프로토타입 제작, 빠른 디버깅을 구현), 강력한 부가 기능을 실험할 수 있는 생태계 지원

 

Tensorflow Estimator API

 

Tensorflow는 여러 개의 API 계층으로 구성된 프로그래밍 스택을 제공한다.

 

High-Level TensorFlow APIs

  • 모델 개발자끼리 구현을 공유하는 과정을 간소화 해준다.
  • Training, Evaluation, Prediction, Model export 이렇게 4가지 주 기능이 있다.
  • 사전에 만든 Estimator를 사용하거나 사용자가 커스텀한 Estimator를 작성하여 사용할 수 있다.
  • 그래프 구축, 변수 초기화, 데이터 로드, 예외 사항 처리, 체크포인트 파일을 만들어 오류 복원, TensorBoard용 요약본 저장
  • tf 2.0부터 Keras가 고수준 API에 추가되었다.

 

Mid-Level TensorFlow APIs

  • tf 2.0부터 Layer를 tf.layers 대신 tf.Keras.layers를 사용하여 구현하는 것을 권장.
  • Dataset API(tf.data.Dataset)는 데이터를 로드하고 전처리하는 기능을 제공.
  • Metric API(tf.keras.metrics)는 모델의 성능을 평가하기 위해 제공.

 

Low-Level Tensorflow APIs

  • 가장 기본적인 API로써, 계산 그래프를 직접 작성하고 실행하는 데 사용.
  • 실험에 대한 더 큰 제어가 필요한 연구일 경우 사용, 일반적으로 고수준 API를 사용하여 작업.
  • tf.Session, tf.Graph, tf.Tensor 등의 클래스와 함수를 제공.

 

Tensorflow Distributed Execution Engine

  • Tensorflow에서 분산 환경에서 모델을 효율적으로 실행하는 데 사용되는 기능, 이 엔진을 통해 여러 대의 컴퓨터 또는 장치를 사용하여 모델의 훈련과 추론을 병렬로 처리할 수 있도록 지원.
  • 기능1 - 분산 훈련 : 여러 대 컴퓨터 또는 장치를 사용하여 모델을 병렬 훈련하는 기능(tf.distribute.MirroredStrategy,....)
  • 기능2 - 분산 추론 : 여러 대 컴퓨터 또는 장치를 사용하여 모델을 병렬로 추론하는 기능(tf.distribute.Strategy,...)
  • 기능3 - 분산 데이터셋 처리 : 분산 환경에서 대용량 데이터셋을 효율적으로 처리하는 기능(tf.distribute.Dataset)
  • 대규모 데이터와 복잡한 모델을 다루는데 도움을 줌.

 

 

Keras

초기에는 독립적인 라이브러리로 개발되었으나, Tensorflow 2.0 이후 부터는 공식 API로 통합되었다.

 

사용하기 쉽고 독립적인 API를 제공하여 딥러닝 모델을 빠르게 구성하고 실험할 수 있도록 도와준다.

 

주요 특징

  • 사용자 친화적인 인터페이스 : Sequential model, Functional API를 사용해 쉽게 다양한 종류에 모델 구성 및 층 추가.
  • 다양한 모델 유형 지원 : 다양한 종류의 신경망 모델을 제공(NN, DNN,CNN, RNN,...).
  • 다양한 층 제공 : 다양한 층(Dense, Conv, Recurrent, Pooling, Dropout,...)을 사용할 수 있음.
  • 사전 정의된 손실 함수 및 최적화 알고리즘 : 일반적으로 사용되는 다양한 손실 함수와 최적화 알고리즘을 사전에 제공.
  • 모델 훈련과 평가 : fit()으로 모델 훈련, evaluate()로 모델의 성능 평가.
  • 모델 저장과 로드 : 학습한 모델을 저장하거나 나중에 불러와 사용하거나 공유할 수 있음.

 

tf.keras 모듈로 사용할 수 있다.

 

 

Tensor

텐서는 일관된 유형(dtype)을 가진 다차원 배열이다.

지원되는 모든 dtype은 tf.dtypes.DType에 정의되어 있다.

 

* 텐서는 Python 변수 처럼 변경할 수 없고 내용을 업데이트 할 수 없으며, 새로운 텐서를 만들 수만 있다.

 

주요 특징

  • 랭크(Rank) : 배열의 차원수(scalar : 0, vector : 1, Metrix : 2, Tensor : 3+, ....)
  • 쉐이프(shape) : 각 차원의 크기를 나타내는 튜플(Ex. RGB -> (높이, 너비, 채널))
  • dtype : 텐서를 저장하는데 사용되는 데이터 타입(float32, float64, int32, int64,...)

 

# scalar
rank_0_tensor = tf.constant(4)
# -> tf.Tensor(4, shape=(), dtype=int32)

# vector
rank_1_tensor = tf.constant([2.0,3.0,4.0])
# -> tf.Tensor([2. 3. 4.], shape=(3,), dtype=float32)

# Metrix
rank_2_tensor = tf.constant([[1, 2],
                             [3, 4],
                             [5, 6]], dtype=tf.float16)
# -> tf.Tensor(
#    [[1. 2.]
#     [3. 4.]
#     [5. 6.]], shape=(3, 2), dtype=float16)

# rank 3+
rank_3_tensor = tf.constant([
  [[0, 1, 2, 3, 4],
   [5, 6, 7, 8, 9]],
  [[10, 11, 12, 13, 14],
   [15, 16, 17, 18, 19]],
  [[20, 21, 22, 23, 24],
   [25, 26, 27, 28, 29]],])
# -> tf.Tensor(
#    [[[ 0  1  2  3  4]
#      [ 5  6  7  8  9]]
#
#     [[10 11 12 13 14]
#      [15 16 17 18 19]]
#
#     [[20 21 22 23 24]
#      [25 26 27 28 29]]], shape=(3, 2, 5), dtype=int32)

 

Tensor를 Numpy 배열로 바꿀 수 있다.

# Tensor -> Numpy
# 방법1
np.array(rank_2_tensor)
# 방법2
rank_2_tensor.numpy()

 

Tensor의 dtype 중에는 복소수문자열이 포함될 수 있다.

 

Tensor는 요소별 산술 연산행렬 연산이 가능하다.(함수 또는 연산자를 사용)

 

Tensor는 인덱싱슬라이싱이 가능하다.

 

tf.reshape를 통한 Tensor의 형상 변경도 가능하다.

x = tf.constant([[1],[2],[3]])
# -> (3,1)
reshaped = tf.reshape(x, [1, 3])
# -> (1,3)

 

Tensor는 Numpy에서 처럼 Boadcasting을 제공한다.

 

Tensor는 특수한 Tensor들이 존재한다.

  • 비정형 Tensor(tf.RaggedTensor) : 어떤 축을 따라 다양한 수의 요소를 가진 텐서 
ragged_list = [
    [0, 1, 2, 3],
    [4, 5],
    [6, 7, 8],
    [9]]
ragged_tensor = tf.ragged.constant(ragged_list)
print(ragged_tensor)
# -> <tf.RaggedTensor [[0, 1, 2, 3], [4, 5], [6, 7, 8], [9]]>
# -> shape : (4, None)
  • 문자열 Tensor(tf.string) : 문자열로 이루어짐('b'는 바이트 문자열임을 나타냄.)
scalar_string_tensor = tf.constant("Gray wolf")
print(scalar_string_tensor)
# -> tf.Tensor(b'Gray wolf', shape=(), dtype=string)
  • 희소 Tensor(tf.sparse.SparseTensor) : 매우 넓은 임베드 공간과 같이 데이터가 희소.
sparse_tensor = tf.sparse.SparseTensor(indices=[[0, 0], [1, 2]],
                                       values=[1, 2],
                                       dense_shape=[3, 4])
print(sparse_tensor, "\n")
# -> SparseTensor(indices=tf.Tensor(
#    [[0 0]
#    [1 2]], shape=(2, 2), dtype=int64), values=tf.Tensor([1 2], shape=(2,), dtype=int32), dense_shape=tf.Tensor([3 4], shape=(2,), dtype=int64)) 

# to dense
print(tf.sparse.to_dense(sparse_tensor))
# -> tf.Tensor(
#    [[1 0 0 0]
#     [0 0 2 0]
#     [0 0 0 0]], shape=(3, 4), dtype=int32)
728x90
반응형