다운로드
작성자: admin 작성일시: 2019-06-29 15:53:52 조회수: 310 다운로드: 23
카테고리: 기타 태그목록:

3.1 텐서 자료형

이 절의 내용을 실행하려면 텐서플로우 2.0 버전을 임포트해야 한다.

In [1]:
# 코랩에서는 다음 코드로 베타버전을 설치한다.
# !pip install tensorflow-gpu==2.0.0-beta1
import tensorflow as tf
tf.__version__
Out:
'2.0.0-beta1'

Tensor 클래스로 구현된 텐서 자료형은 NumPy의 다차원배열 ndarray 클래스와 마찬가지로 다차원 배열 정보를 다루기 위한 자료형이다. 하지만 다음과 같은 차이가 있다.

  • 텐서 자료형은 NumPy와 달리 심볼 연산이 가능한 객체이다.
  • 텐서 자료형은 값을 처음부터 저장하는 것이 아니라 연산이 시작되는 시점에 참조 자료로부터 가지고 온다.

TensorFlow에서 데이터의 원천(source)가 되는 미리 주어진 고정된 값을 가지는 상수(Constant) 텐서와 텐서 자료형에는 값이 바뀔 수 있는 변수(Variable) 텐서 두 종류가 있다. 상수 텐서는 불변형 자료형이므로 값을 변경할 수 없다. 변수형 텐서는 값이 바뀔 수 있는 텐서 자료형으로 미분이나 최적화에서 사용할 수 있다.

여기에서는 상수 텐서에 대해서만 알아보고 변수 텐서는 추후 텐서플로우를 사용한 최적화에 대해 공부할 때 같이 알아보기로 한다.

파이썬 및 넘파이 변형

tf.constant()를 이용하면 파이썬 리스트나 넘파이 배열을 상수 텐서로 만들 수 있다.

In [2]:
tf.constant([1, 2, 3])
Out:
In [3]:
tf.constant([[1, 2, 3], [4, 5, 6]])
Out:

일차원 수열 텐서

일차원 수열 텐서를 만들 때는 range 또는 linspace 등의 메서드를 사용할 수 있다. linspace를 사용할 때는 start 값이 부동소수점이어야 한다.

  • tf.range(start, limit=None, delta=1)
  • tf.linspace(start, stop, num)
In [4]:
tf.range(5)
Out:
In [5]:
# tf.linspace(0, 5, 11) => 에러
tf.linspace(0.0, 5, 11)
Out:

0 또는 1로 구성된 텐서

이밖에도 상수 텐서를 생성하는 다양한 메서드들이 제공된다. 대부분의 메서드는 배열의 크기를 지정하는 shape 또는 데이터 자료형을 지정하는 dtype 인수를 받는데 shape 인수는 (행 갯수, 열 갯수) 형태의 튜플이나 리스트로 전달해야 한다. dtype 인수는 지정하지 않을 경우 tf.float32 자료형 즉, 32비트 부동소수점 자료형을 사용한다.

  • tf.zeros(shape)
  • tf.ones(shape)
  • tf.fill(shape, value)
  • tf.zeros_like(tensor)
  • tf.ones_like(tensor)
In [6]:
tf.zeros((2, 3))
Out:
In [7]:
tf.ones([2, 3])
Out:
In [8]:
tf.fill([2, 3], 2)
Out:
In [9]:
tf.zeros_like([[1, 2, 3], [4, 5, 6]])
Out:
In [10]:
tf.ones_like([[1, 2, 3], [4, 5, 6]])
Out:

난수 텐서

무작위 난수값을 가지는 상수 텐서 자료형 생성 메서드는 random 서브패키지에서 제공한다.

  • tf.random.set_seed(seed): 시드값 설정
  • tf.random.uniform(shape, minval=0, maxval=None, seed=None)
  • tf.random.normal
  • tf.random.truncated_normal
  • tf.random.shuffle
In [11]:
tf.random.set_seed(0)
In [12]:
tf.random.uniform((2, 3), seed=0)
Out:
In [13]:
tf.random.normal((2, 3), seed=0)
Out:
In [14]:
tf.random.truncated_normal((2, 3), seed=0)
Out:
In [15]:
tf.random.shuffle([1, 2, 3, 4, 5, 6])
Out:

텐서의 속성

텐서 자료형은 넘파이 베열과 마찬가지로 다음 속성을 가진다.

  • ndim
  • shape
  • dtype
In [16]:
a = tf.range(6, dtype=tf.int32)  # 1차원 백터 [0, 1, 2, 3, 4, 5]
a
Out:
In [17]:
a.ndim
Out:
1
In [18]:
a.shape
Out:
TensorShape([6])
In [19]:
a.dtype
Out:
tf.int32

텐서가 참조하는 실제 배열의 값을 알고 싶으면 numpy 메서드를 사용한다.

In [20]:
a.numpy()
Out:
array([0, 1, 2, 3, 4, 5], dtype=int32)

크기와 차원 변환

다음은 텐서의 크기 및 차원을 바꾸는 명령이다.

  • tf.reshape: 벡터 행렬의 크기 변환
  • tf.transpose: 전치 연산
  • tf.expand_dims: 지정한 축으로 차원을 추가
  • tf.squeeze: 벡터로 차원을 축소
In [21]:
a_2d = tf.reshape(a, (2, 3))  # 1차원 벡터는 2x3 크기의 2차원 행렬로 변환
a_2d
Out:
In [22]:
a_2d_t = tf.transpose(a_2d)   # 2x3 크기의 2차원 행렬을 3x2 크기의 2차원 행렬로 변환
a_2d_t
Out:
In [23]:
a_3d = tf.expand_dims(a_2d, 0) # 2x3 크기의 2차원 행렬을 1x2x3 크기의 3차원 행렬로 변환
a_3d
Out:
In [24]:
a_4d = tf.expand_dims(a_3d, 3) # 1x2x3 크기의 3차원 행렬을 1x2x3x1 크기의 4차원 행렬로 변환
a_4d
Out:
In [25]:
a_1d = tf.squeeze(a_4d)  # 1x2x3x1 크기의 4차원 행렬을 1차원 벡터로 변환
a_1d          
Out:

분할과 합체

벡터/행렬을 나누거나 두 개 이상의 벡터/행렬을 합치는 명령어도 많이 사용된다.

  • tf.slice: 특정 부분을 추출
  • tf.split: 분할
  • tf.concat: 합치기
  • tf.tile: 복제-붙이기
  • tf.stack: 합성
  • tf.unstack: 분리
In [26]:
a0 = tf.reshape(tf.range(12), (3, 4))
a0
Out:
In [27]:
tf.slice(a0, [0, 1], [2, 3])   # (0, 1)위치에서 (2개, 3개)만큼 뽑아낸다.
Out:
In [28]:
a1, a2 = tf.split(a0, num_or_size_splits=2, axis=1)  # 가로축(axis=1)을 따라 2개로 분할 
print(a1)
print(a2)
tf.Tensor(
[[0 1]
 [4 5]
 [8 9]], shape=(3, 2), dtype=int32)
tf.Tensor(
[[ 2  3]
 [ 6  7]
 [10 11]], shape=(3, 2), dtype=int32)
In [29]:
tf.concat([a1, a2], 1) # 가로축(axis=1)을 따라 a1, a2를 합치기
Out:
In [30]:
tf.tile(a1, [1, 3])  # 가로축(axis=1)을 따라 3개로 복사-붙이기
Out:
In [31]:
a3 = tf.stack([a1, a2])  # 3x2 행렬 a1, a2를 추가적인 차원으로 붙여서 2x3x2 고차원 텐서 생성
a3
Out:
In [32]:
tf.unstack(a3, axis=1)  # 2x3x2 고차원 텐서를 0차원으로 풀어서 3개의 2x2 행렬 생성
Out:
[,
 ,
 ]

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!