- 다차원 Arrays 를 표현하는 PyTorch 클래스
- Tensor를 생성하는 함수도 거의 동일
import numpy as np
n_array = np.arange(10).reshape(2,5)
print(n_array)
print("ndim : ", n_array.ndim, "shape : ", n_array.shape)

import torch
t_array = torch.FloatTensor(n_array)
print(t_array)
print("ndim : ", t_array.ndim, "shape : ", t_array.shape)

data = [[3,5], [10,5]]
x_data = torch.tensor(data)
x_data

nd_array_ex = np.array(data)
tensor_array = torch.from_numpy(nd_array_ex)
tensor_array

기본적으로 tensor가 가질 수 있는 data 타입은 numpy와 동일
한 가지 다른점은 GPU를 쓸 수 있다는 것!
기본적으로 numpy에서 사용하던 사용법이 PyTorch에 그대로 적용됨
- view : reshape과 동일하게 tensor의 shape를 변환
- squeeze : 차원의 개수가 1인 차원을 삭제 (압축)
- unsqueeze : 차원의 개수가 1인 차원을 추가
tensor_ex = torch.rand(size = (2,3,2))
tensor_ex.view([-1,6])

tensor_ex.reshape([-1,6])


n1 = np.arange(10).reshape(2,5)
t1 = torch.FloatTensor(n1)
t1

t1+t1

t1-t1

t1+10

행렬곱셈 연산은 dot이 아닌 mm 사용
n1 = np.arange(10).reshape(2,5)
t1 = torch.FloatTensor(n1)
n2 = np.arange(10).reshape(5,2)
t2 = torch.FloatTensor(n2)
t1.mm(t2)

t1.dot(t2)

t1.matmul(t2)

mm은 matmul은 broadcasting 지원에서 차이가 있음
matmul은 broadcasting을 지원함 -> 결과를 햇갈리게 하는 요소가 있으므로 반드시 이해가 필요
a = torch.rand(5, 2, 3)
b = torch.rand(5)
a.mm(b)

a = torch.rand(5, 2, 3)
b = torch.rand(3)
a.matmul(b)

a=torch.rand(5,2,3)에서
첫번째 5는 batch를 의미
2 by 3와 3 by 1의 연산
-> 2 by 1 으로 5개가 찍힘!
a[0].mm(torch.unsqueeze(b,1))

a[1].mm(torch.unsqueeze(b,1))

a[2].mm(torch.unsqueeze(b,1))

a[3].mm(torch.unsqueeze(b,1))

a[4].mm(torch.unsqueeze(b,1))

Torch는 numpy와 operation이 거의 비슷하다
reshape 대신 view를 쓰세요
unsqueeze와 squeeze의 차이를 이해하라
mm과 dot, matmul의 차이를 알면 좋겠다!
nn.functional 모듈을 통해 다양한 수식 변환을 지원함!
import torch
import torch.nn.functional as F
tensor = torch.FloatTensor([0.5, 0.7, 0.1])
h_tensor = F.softmax(tensor, dim=0)
h_tensor

y = torch.randint(5, (10,5))
y_label = y.argmax(dim=1)
y_label

torch.nn.functional.one_hot(y_label)

import itertools
a = [1,2,3]
b = [4,5]
list(itertools.product(a,b))

tensor_a = torch.tensor(a)
tensor_b = torch.tensor(b)
torch.cartesian_prod(tensor_a, tensor_b)

PyTorch의 핵심은 자동 미분의 지원 -> backward 함수 사용
w = torch.tensor(2.0, requires_grad=True) ##미분하는 변수
y = w**2
z = 10*y + 25
z.backward()
w.grad ## z를 w로 미분한값

편미분
a = torch.tensor([2., 3.], requires_grad=True)
b = torch.tensor([6., 4.], requires_grad=True)
Q = 3*a**3 - b**2
external_grad = torch.tensor([1., 1.])
Q.backward(gradient=external_grad)
a.grad

b.grad

| 강의 복습내용 [week2-9] PyTorch Troubleshooting (0) | 2023.03.16 |
|---|---|
| 강의 복습내용 [week2-7] Multi-GPU 학습 (0) | 2023.03.16 |
| 강의 복습내용 [week2-5] 모델 불러오기 (0) | 2023.03.14 |
| 강의 복습내용 [week2-4] PyTorch Datasets & Dataloaders (0) | 2023.03.13 |
| 강의 복습내용 [week2-3] AutoGrad & Optimizer (0) | 2023.03.13 |
댓글 영역