Tensor란 무엇인가?
머신러닝을 공부하다보면 Tensor라는 말이 자주 쓰인다 TensorFlow 프레임웍에는 아예 이름에 Tensor가 들어가 있고, Pytorch에서 스칼라 값을 만들 때는 torch.tensor(100) 같이 사용하기도 한다. 도대체 Tensor가 무엇을 뜻하길래 프레임웍의 이름에도 들어가 있고 모델을 만드는 함수의 이름으로도 들어가는 것일까?
Tensor는 머신러닝에서 데이터 구조를 일반화한 개념으로, 벡터와 행렬을 포함하여 더 높은 차원의 데이터를 표현할 수 있는 다차원 배열이다. 0차원 스칼라, 1차원 벡터, 2차원 행렬, 그리고 n차원 배열을 Tensor를 사용해 표현할 수 있으며, Tensorflow나 Pytorch같은 프레임웍은 Tensor를 기본 데이터 구조로 채택한다. 이들 프레임웍들 내부에서는 Tensor 연산을 최적화하며, 연구자와 개발자가 복잡한 수학적 연산을 손쉽게 실행할 수 있게 도와준다.
Tensor의 종류
Tensor의 종류는 다음과 같다.
차원(Dimension) | 수학적인 이름 | 설명 | 예시 |
0 | 스칼라(Scalar) | 0차원 텐서, 크기값 표현 | x |
1 | 벡터(Vector) | 1차원 텐서, 배열 | [x1,x2,x3] |
2 | 행렬(Matrix) | 2차원 텐서, 표 | [[x1,x2,x3],[y1,y2,y3]] |
3 | 3차원 텐서(3-Tensor) | 3차원 텐서, 3차원 표 | [[[x1,x2,x3],[y1,y2,y3]],[[z1,z2,z3],[w1,w2,w3]]] |
n | n차원 텐서(n-Tensor) | n차원 텐서, higher dimensional |
각 라이브러리, 프레임웍의 Tensor
Numpy 라이브러리의 Tensor
Numpy 라이브러리에서 Tensor를 표현하는 방법에 대해 알아보자.
0차원 Tensor
0차원 Tensor는 단순히 array 함수로 값을 넘기는 것으로 표현된다.
import numpy as np
scalar = np.array(42)
print(scalar)
1차원 Tensor
1차원 텐서는 array 함수로 배열을 넘기는 것으로 표현된다.
vector = np.array([1, 2, 3])
2차원 Tensor
2차원 텐서는 array 함수로 2차원 배열을 넘기는 것으로 표현된다.
matrix = np.array([[1, 2, 3], [4, 5, 6]])
3차원 Tensor
3차원 텐서는 array 함수로 3차원 배열을 넘기는 것으로 표현된다.
tensor_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
각 구조 출력해보기
앞서 만든 Tensor들의 모양과 구조를 프린트 해보자.
import numpy as np
scalar = np.array(42)
vector = np.array([1, 2, 3])
matrix = np.array([[1, 2, 3], [4, 5, 6]])
tensor_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print("Scalar (0D Array):")
print("모양: " + str(scalar))
print("구조: " + str(scalar.shape))
print("\n")
print("Vector (1D Array):")
print("모양: " + str(vector))
print("구조: " + str(vector.shape))
print("\n")
print("Matrix (2D Array):")
print("모양: " + str(matrix))
print("구조: " + str(matrix.shape))
print("\n")
print("3D Tensor (3D Array):")
print("모양: " + str(tensor_3d))
print("구조: " + str(tensor_3d.shape))
그러면 다음과 같은 출력이 나온다.
Scalar (0D Array):
모양: 42
구조: ()
Vector (1D Array):
모양: [1 2 3]
구조: (3,)
Matrix (2D Array):
모양: [[1 2 3]
[4 5 6]]
구조: (2, 3)
3D Tensor (3D Array):
모양: [[[1 2]
[3 4]]
[[5 6]
[7 8]]]
구조: (2, 2, 2)
TensorFlow 프레임웍의 Tensor
이번에는 TensorFlow 프레임웍에서 Tensor를 표현하는 방법에 대해 알아보자.
0차원 Tensor
0차원 Tensor는 tf.Variable 함수로 값을 넘기는 것으로 표현된다.
import tensorflow as tf
scalar = tf.Variable(42)
1차원 Tensor
1차원 텐서는 tf.Variable 함수로 배열을 넘기는 것으로 표현된다.
vector = tf.Variable([1, 2, 3])
2차원 Tensor
2차원 텐서는 tf.Variable 함수로 2차원 배열을 넘기는 것으로 표현된다.
matrix = tf.Variable([[1, 2, 3], [4, 5, 6]])
3차원 Tensor
3차원 텐서는 tf.Variable 함수로 3차원 배열을 넘기는 것으로 표현된다.
tensor_3d = tf.Variable([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
각 구조 출력해보기
앞서 만든 Tensor들의 모양과 구조를 프린트 해보자.
import tensorflow as tf
scalar = tf.Variable(42)
vector = tf.Variable([1, 2, 3])
matrix = tf.Variable([[1, 2, 3], [4, 5, 6]])
tensor_3d = tf.Variable([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print("Scalar (0D Tensor):")
print("모양: " + str(scalar.numpy()))
print("구조: " + str(scalar.shape))
print("\n")
print("Vector (1D Tensor):")
print("모양: " + str(vector.numpy()))
print("구조: " + str(vector.shape))
print("\n")
print("Matrix (2D Tensor):")
print("모양: " + str(matrix.numpy()))
print("구조: " + str(matrix.shape))
print("\n")
print("3D Tensor (3D Tensor):")
print("모양: " + str(tensor_3d.numpy()))
print("구조: " + str(tensor_3d.shape))
그러면 다음과 같은 출력이 나온다.
Scalar (0D Tensor):
모양: 42
구조: ()
Vector (1D Tensor):
모양: [1 2 3]
구조: (3,)
Matrix (2D Tensor):
모양: [[1 2 3]
[4 5 6]]
구조: (2, 3)
3D Tensor (3D Tensor):
모양: [[[1 2]
[3 4]]
[[5 6]
[7 8]]]
구조: (2, 2, 2)
Pytorch 프레임웍의 Tensor
마지막으로 Pytorch 프레임웍에서 텐서를 표현하는 방법을 살펴보자.
0차원 Tensor
0차원 Tensor는 torch.tensor 함수로 값을 넘기는 것으로 표현된다.
import torch
scalar = torch.tensor(42)
1차원 Tensor
1차원 텐서는 torch.tensor 함수로 배열을 넘기는 것으로 표현된다.
vector = torch.tensor([1, 2, 3])
2차원 Tensor
2차원 텐서는 torch.tensor 함수로 2차원 배열을 넘기는 것으로 표현된다.
matrix = torch.tensor([[1, 2, 3], [4, 5, 6]])
3차원 Tensor
3차원 텐서는 torch.tensor 함수로 3차원 배열을 넘기는 것으로 표현된다.
tensor_3d = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
각 구조 출력해보기
앞서 만든 Tensor들의 모양과 구조를 프린트 해보자.
import torch
scalar = torch.tensor(42)
vector = torch.tensor([1, 2, 3])
matrix = torch.tensor([[1, 2, 3], [4, 5, 6]])
tensor_3d = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print("Scalar (0D Tensor):")
print("모양: " + str(scalar.item()))
print("구조: " + str(scalar.shape))
print("\n")
print("Vector (1D Tensor):")
print("모양: " + str(vector))
print("구조: " + str(vector.shape))
print("\n")
print("Matrix (2D Tensor):")
print("모양: " + str(matrix))
print("구조: " + str(matrix.shape))
print("\n")
print("3D Tensor (3D Tensor):")
print("모양: " + str(tensor_3d))
print("구조: " + str(tensor_3d.shape))
그러면 다음과 같은 출력이 나온다.
Scalar (0D Tensor):
모양: 42
구조: torch.Size([])
Vector (1D Tensor):
모양: tensor([1, 2, 3])
구조: torch.Size([3])
Matrix (2D Tensor):
모양: tensor([[1, 2, 3],
[4, 5, 6]])
구조: torch.Size([2, 3])
3D Tensor (3D Tensor):
모양: tensor([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
구조: torch.Size([2, 2, 2])