텐서 이해하기
텐서 이해하기 (Introduction to Tensors)
머신러닝에서 다루는 모든 데이터는 결국 숫자의 묶음이에요. TensorFlow의 텐서(tensor) 는 일정한 타입(dtype)을 가진 다차원 배열로, 넘파이의 np.array 와 비슷하다고 생각하면 편해요. 데이터가 어떤 모양으로 흐르는지 텐서부터 이해하면 이후의 모든 설명이 훨씬 수월해져요.
텐서 만들기
tf.constant() 로 값을 넣어 만들 수 있어요. "벡터" 혹은 "rank-1" 텐서는 값들의 리스트처럼 축(axis)이 하나고, "행렬" 혹은 "rank-2" 텐서는 축이 둘이에요. 생성 시점에 dtype 을 명시할 수도 있어요.
# float 텐서로 만들어 보기
rank_1_tensor = tf.constant([2.0, 3.0, 4.0])
print(rank_1_tensor)
# tf.Tensor([2. 3. 4.], shape=(3,), dtype=float32)
# dtype을 명시해 만들기
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)
텐서가 있으면 tf.reduce_max() 처럼 축소 연산을 바로 적용할 수 있고, tf.math.argmax() 로 최댓값 위치를, tf.nn.softmax() 로 확률 분포를 계산할 수 있어요.
c = tf.constant([[4.0, 5.0], [10.0, 1.0]])
print(tf.reduce_max(c)) # 최댓값
print(tf.math.argmax(c)) # 최댓값 인덱스
print(tf.nn.softmax(c)) # softmax
TensorFlow 함수는 텐서를 기대하는 자리에 tf.convert_to_tensor() 로 변환 가능한 값이면 무엇이든 받아요. 리스트나 넘파이 배열이 텐서로 자동 변환될 수 있죠.
모양(shape) 관련 용어
- Shape: 텐서 각 축의 길이(원소 개수).
- Rank: 텐서 축의 수. 스칼라는 0, 벡터는 1, 행렬은 2.
- Axis / Dimension: 텐서의 특정 차원.
"2차원 텐서"라는 말이 2차원 공간을 뜻하지는 않는다는 점을 유의하세요. 구체적인 크기는 tf.rank 와 tf.shape 함수로 얻을 수 있어요.
희소 텐서 (Sparse tensor)
대부분이 0인 큰 텐서는 값 전체를 저장하는 대신 인덱스와 값만 저장해 메모리를 아낄 수 있어요. tf.sparse.SparseTensor 에 indices, values, dense_shape 을 주어 만들고, tf.sparse.to_dense() 로 밀집 텐서로 변환할 수 있어요.
sparse_tensor = tf.sparse.SparseTensor(
indices=[[0, 0], [1, 2]],
values=[1, 2],
dense_shape=[3, 4])
print(tf.sparse.to_dense(sparse_tensor))