Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 파이썬
- Python
- paper review
- Study
- speaking
- 이분탐색
- bfs/dfs
- Coursera
- 스터디
- Fine-Tuning
- 데이터분석
- 플로이드와샬
- 최단경로
- English
- 머신러닝
- 완전탐색
- 프로그래머스
- Generative AI
- Scaling Laws
- LLM
- Lora
- 코딩테스트
- DP
- 그래프이론
- 코드트리
- 코딩테스트실력진단
- 파인튜닝
- 판다스
- 알고리즘
- peft
Archives
- Today
- Total
생각하는 아져씨
파이토치 기초 공부하기 - 텐서(Tensor)를 알아보자 본문
텐서란
텐서(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
'Machine & Deep Learning > Pytorch' 카테고리의 다른 글
파이토치 기초 공부하기 - 역전파(Backprop)를 알아보자 (0) | 2023.03.23 |
---|