생각하는 아져씨

파이토치 기초 공부하기 - 텐서(Tensor)를 알아보자 본문

Machine & Deep Learning/Pytorch

파이토치 기초 공부하기 - 텐서(Tensor)를 알아보자

azeomi 2023. 3. 23. 17:05

텐서란


텐서(Tensor)는 파이토치의 기본 단위이며 GPU 연산을 가능하게 한다. 또한 Numpy의 배열과 유사하여 손쉽게 다룰 수 있다.

배열(Array)이나 행렬(Matrix)과 유사한 특수한 자료 구조이다.

텐서를 사용하기 위해서는 다음의 라이브러리가 필요하다.

# 라이브러리 불러오기
import torch # Pytorch를 사용하기 위한 기본 라이브러리다. numpy와 유사한 함수를 제공해준다.
import numpy as np # Numpy를 사용하기 위한 기본 라이브러리다. 여기서 "as np"는 numpy를 np로 짧게 표기하겠다는 뜻이다.

 

 

텐서 만들기


빈 텐서 만들기

# 빈 텐서 생성
x = torch.empty(5,4) # 5x4 행렬 생성
print(x) # 초기화되지 않은 행렬인 경우 해당 시점에 할당된 메모리에 존재하던 값들이 초기값으로 나타난다.

데이터로부터 직접 생성

data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)

numpy API 와 비슷하게 활용하기

torch.ones(3,3) # 3x3 일 행렬

tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])
torch.zeros(2) # 2행 영 벡터

tensor([0., 0.])
torch.rand(5,6) # 5x6 랜덤 행렬, 표준정규분포를 기준으로 생성된다.

tensor([[0.4094, 0.9170, 0.2692, 0.5823, 0.7281, 0.7829],
        [0.3331, 0.9693, 0.1412, 0.3659, 0.9518, 0.0084],
        [0.0564, 0.0460, 0.6986, 0.0843, 0.6442, 0.8234],
        [0.9404, 0.9675, 0.9338, 0.4303, 0.3202, 0.6674],
        [0.2820, 0.6826, 0.1079, 0.6253, 0.8720, 0.4367]])

리스트, 넘파이 배열을 텐서로 만들기

arr = [13, 4]
nparray = np.array([1, 2, 3]]

torch.tensor(arr)
>> tensor([13,4])

torch.tensor(nparray)
>> tensor([1, 2, 3])

다른 텐서로부터 생성하기

x_ones = torch.ones_like(x_data) # x_data의 속성을 유지합니다.
print(f"Ones Tensor: \n {x_ones} \n")

x_rand = torch.rand_like(x_data, dtype=torch.float) # x_data의 속성을 덮어씁니다.
print(f"Random Tensor: \n {x_rand} \n")

>>
Ones Tensor:
 tensor([[1, 1],
        [1, 1]])

Random Tensor:
 tensor([[0.4281, 0.0805],
        [0.1475, 0.9391]])

 

 

텐서의 크기와 타입 확인하기


텐서의 크기와 타입 확인은 매우 자주 사용된다.

  • 텐서의 크기(사이즈)
# x is Tensor
x.size()

>> torch.Size([5, 4])
  • 텐서의 타입(Type)
type(x)
>> torch.Tensor

 

텐서의 연산


텐서는 전치(transposing), 인덱싱(indexing), 슬라이싱(slicing), 수학 계산, 선형 대수, 임의 샘플링(random sampling) 등 다양한 연산을 할 수 있다. 각 연산들은 GPU에서 실행할 수 있고, GPU에서 사용하고 싶다면 tensor 변수에 gpu를 할당해줘야 한다.

  • gpu 확인 후 gpu에 할당해주기
if torch.cuda.is_avaliable():
    tensor = tensor.to('cuda')
    print(f'Device tensor is stored on: {tensor.device}'}
  • 텐서의 덧셈
x = torch.rand(2,2) # 2x2 랜덤 행렬
y = torch.rand(2,2) # 2x2 랜덤 행렬

x+y # 두 텐서의 합

torch.add(x,y) # 두 텐서의 합의 또 다른 표현

y.add(x) # 두 텐서의 합의 또 다른 표현이지만 이는 y에 x를 더한다는 의미다.
# 텐서의 덧셈을 inplace 방식으로도 할 수 있다.

print("원래 y: ", y)
y.add_(x) # underbar _ 로 표시하면 inplace 방식으로 된다.
print("y=y+x: ",y)

# y.add_는 y에 x를 더한 값을 y에 대체한다.(inplace 방식)

원래 y:  tensor([[0.8684, 0.8021],
        [0.5172, 0.7097]])
y=y+x:  tensor([[1.1698, 1.1643],
        [1.1235, 0.7714]])
  • 텐서의 곱셈
tensor.mul(tensor)
또는
tensor*tensor
또는
torch.multiply(input, other)
또는
torch.mul(input, other)
  • 텐서 합치기

1) torch.cat(list, dim)

# torch.cat : 일련의 텐서를 연결한다.
tensor = torch.ones(4, 4)
tensor[:,1] = 0
>>
tensor([[1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.]])

# tensor를 1차원을 기준으로 합친다.
t1 = torch.cat([tensor, tensor, tensor], dim = 1)
>>
tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
        [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
        [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
        [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]])

👉 torch.cat, torch.stack의 차이점이 있다. 참고: https://sanghyu.tistory.com/85

 

 

텐서의 크기 변환하기


텐서에서는 크기 변환이 굉장히 많이 쓰인다.

# x의 사이즈가 [8,8] 일 때,
# 크기를 바꿔주는 view 8x8 -> 64 (64짜리 벡터텐서로 바뀐다.)
a = x.view(64)
>> torch.Size([64])
# 3차원으로 바꾸고 싶다면 -> 3개(x,y,z)로 표시
b = x.view(-1,4,4) # -1은 원래 크기가 되게 하는 값. 8x8 -> -1x4x4 즉, 4x4x4이다. (원래 원소는 64개니까)
# -1은 원래 들어가야 할 숫자를 자동으로 계산해서 들어가게 해준다.
print(b.size()) 
>> torch.Size([4, 4, 4])

# 따라서 -1은 원래 크기가 되게 하는 값이 자동으로 지정되기 때문에 한 번만 사용할 수 있다. 
# 예를 들어 x.view(-1,-1,4)와 같은 선언은 오류가 난다.

 

 

단일 텐서에서 값 가져오기


텐서에서 값을 뽑아야 하는 일이 많다. 텐서를 출력한다고 해서 값을 얻을 수 있는 것은 아니다.

item() 함수를 사용해야 한다.

x = torch.ones(1)

print(x)  # 텐서의 형태로 들어오게 된다.
print(x.item()) # .item()은 손실 함숫값과 같이 숫자가 하나인 텐서를 텐서가 아닌 값으로 만들어 준다.

>>
tensor([1.])
1.0 (이게 값)

 

참조


https://tutorials.pytorch.kr/beginner/blitz/tensor_tutorial.html

 

텐서(Tensor)

텐서(tensor)는 배열(array)이나 행렬(matrix)과 매우 유사한 특수한 자료구조입니다. PyTorch에서는 텐서를 사용하여 모델의 입력과 출력뿐만 아니라 모델의 매개변수를 부호화(encode)합니다. GPU나 다른

tutorials.pytorch.kr