티스토리 뷰

카테고리 없음

[딥러닝] Tensorflow

코딩계란 2024. 3. 27. 12:31
728x90

개요 

  • 구글이 만든 Deep Learning에 초점을 맞춘 라이브러리
  • GPU 지원
  • 분산 컴퓨팅을 지원: 여러 대의 컴퓨터에서 동시에 학습 가능하고 예측도 가능
  • 플랫폼에 중립적인 포맷으로 내보낼 수 있음
  • 리눅스를 사용하는 파이썬 환경에서 Tensorflow 모델을 훈련시키고 이 모델을 안드로이드에서 실행할 수 있음

 

API

  • 거의 모든 운영체제를 지원하고 Tensorflow Lite를 이용하면 안드로이드 와 iOS 같은 모바일 운영체제에서도 실행되고
  • https://www.tensorflow.org/resources  Python API를 많이 이용하지만 C++, Java, Go(golang), Swift API도 제공됨
 

모델 및 데이터 세트  |  TensorFlow

저장소와 기타 리소스를 탐색하여 TensorFlow 커뮤니티에서 만든 모델 및 데이터 세트를 찾아보세요.

www.tensorflow.org

 

설치 

#CMD 창에 입력 
pip install tensorflow

# 버전 확인
# CMD 창에 python 입력 후 아래 코드 실행 
import tensorflow as tf
print(tf.__version__)

 

 

연산

  • 가장 저 수준의 연산은 C++ 코드로 만들어져 있음
  • 연산들이 여러 종류의 커널에서 수행: CPU, GPU, TPU 등
  • TPU는 Deep Learning 연산을 위해 특별하게 설계된 ASIC Chip

 

 

실습 

1. Tensor 생성

  • numpy 의 ndarray 와 유사한 방식으로 생성
  • immutable data(변경이 불가능한 데이터)는 tf.constant 로 생성
import tensorflow as tf

tf.constant(42)

t = tf.constant([[1, 2, 3], [4, 5, 6]])
print(t)

print(t[:, 1]) #1번째 열: 하나의 열이라서 1차원 배열
print(t[:, 1:]) #1번째 열 부터 모든 열
print(t[:, 1, tf.newaxis]) #데이터를 분할한 후 새로운 축으로 만들어서 출력
#1차원 배열이 2차원 배열로 변환.


2. 연산

  • tensorflow 나 numpy 에서 배열을 가지고 산술 연산을 하는 경우 실제로는 함수가 호출된디/. 
  • + 는 숫자 두 개를 더하는 기능을 가지고 있는데 tensorflow 나 numpy 에서는 __add__를 정의해서 이 메서드를 호출하도록 한다.
  • 이름이 다른 함수도 있다. ex)np.mean => tf.reduce_mean
  • tf.float32 는 제한된 정밀도를 갖기 때문에 연산을 할 때 마다 결과가 달라질 수 있음
  • 동일한 기능을 하는 함수나 클래스를 Keras 가 별도로 소유하고 있는 경우도 있음
    Keras는 Tensorflow 의 저수준 API(Core 에 가까운 쪽)
#numpy 의 ndarray 와 거의 동일한 방식으로 연산을 수행하고 함수 나 메서드의 이름도 거의 일치
print(t + 10) #broadcast 연산
print(tf.square(t))
tf.transpose(t) @ t



3. Tensor 와 numpy 의 ndarray

  • 2개의 데이터 타입은 호환이 되서 서로 변경이 가능
  • Tensor를 ndarray 로 변환하고자 하는 경우는 numpy() 메서드를 호출하거나 numpy 의 array 함수에 Tensor를 대입.
  • ndarray를 가지고 Tensor를 만들고자 할 때는 contant 나 variable 같은 함수에 대입.
ar = np.array([2, 3, 4])

print(tf.constant(ar))

print(tf.constant(ar).numpy())
print(np.array(tf.constant(ar)))



4. 타입 변환

  • Data Type이 성능을 크게 감소시킬 수 있다. 
  • Tensorflow 는 타입을 자동변환하지 않는다.
  • 타입이 다른데 연산을 수행하고자 하는 경우에는 tf.cast 함수를 이용해서 자료형을 변경해야 한다.
  • Tensorflow 가 형 변환을 자동으로 하지 않는 이유는 사용자가 알지 못하는 작업은 수행을 하면 안된다는 원칙 때문
#자료형이 달라서 에러가 발생
print(tf.constant(2.0) + tf.constant(40))

 

t1 = tf.constant(40) 
#형 변환 한 후 연산 수행
print(tf.constant(2.0) + tf.cast(t1, tf.float32))



5. 변수

  • 일반적인 데이터는 직접 변경을 하지 않기 때문에 constant 로 생성해서 사용. 역전파 알고리즘을 수행하게 되면 가중치가 업데이트된다. 이때 가중치는 수정되어야 하기 때문에 constant로 생성되면 할 수 없다. 
  • 수정되어야 하는 데이터는 tf.Variable 을 이용해서 생성
  • 데이터를 수정하고자 하는 경우는 assign 함수를 이용
  • assign_add 나 assign _sub를 이용해서 일정한 값을 더하거나 빼서 수정할 수 있다. 
  • 배열의 일부분을 수정할 때는 assign 함수나 scatter_update() 나 scatter_nd_update ()를 이용
#변수 생성
v = tf.Variable([[1, 2, 3], [4, 5, 6]])
print(v)
print(id(v))

#기존 데이터를 복제해서 연산을 수행한 후 그 결과를 가리키도록 한 것
#참조하는 위치가 변경됨
v = v * 2
print(v)
print(id(v))

#내부 데이터 수정
v = tf.Variable([[1, 2, 3], [4, 5, 6]])
print(v)
print(id(v))

 

#이 경우는 id 변경없이 데이터를 수정 
v.assign(2 * v)
print(v)
print(id(v))

 

 

Data 구조 

  • SparseTensor: 0이 많은 Tensor를 효율적으로 나타내는데 tf.sparse 패키지에서 이 Tensor에 대한 연산을 제공 
  • TensorArray: Tensor의 list
  • RaggedTensor: list 의 list
  • stringtensor: 문자열 텐서인데 실제로는 바이트 문자열로 저장됨
  • set
  • queue

 

 

Tensorflow 함수 

  • 일반 함수는 python 의 연산 방식에 따라 동작하지만 Tensorflow 함수를 만들게 되면 Tensorflow 프레임워크가 자신의 연산 방식으로 변경해서 수행을 하기 때문에 속도가 빨라질 가능성이 높음
  • Tensorflow 함수를 만드는 방법은 함수를 정의한 후 tf.function 이라는 decorator를 추가해도 되고 tf.function 함수에 함수를 대입해서 리턴받아도 된다.
  • 함수를 변경하는 과정에서 Tensorflow 함수로 변경이 불가능하면 일반 함수로 변환한다.
  • tf.random:  모듈을 이용해서 난수를 생성

 

728x90