PyTorch의 Document
https://pytorch.org/docs/stable/index.html
PyTorch documentation — PyTorch 1.13 documentation
Shortcuts
pytorch.org
PyTorch의 여러 기능 함수들에 대해 볼 수 있다.
Torch 목차의 순서대로 3가지씩 함수를 뽑아 정리하였습니다
Random sampling
randn
PyTorch의 torch.randn() 함수는 정규 분포(가우시안 분포)에서 난수를 생성하는 함수입니다. 함수는 입력된 shape에 따라 주어진 차원을 가진 텐서를 반환합니다.
torch.randn(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False, memory_format=torch.preserve_format) -> Tensor
- *size: 생성될 텐서의 차원을 나타내는 가변 인수입니다. 예를 들어 torch.randn(2, 3)은 2x3 크기의 텐서를 생성합니다.
- out: 결과값을 저장할 출력 텐서입니다.
- dtype: 출력 텐서의 데이터 형식입니다. 기본값은 torch.float32입니다.
- layout: 생성될 텐서의 레이아웃입니다.
- device: 생성될 텐서를 저장할 디바이스입니다. 기본값은 CPU입니다.
- requires_grad: 연산을 추적하기 위해 텐서에 gradient를 계산해야 하는지 여부를 나타내는 플래그입니다.
- memory_format: 생성될 텐서의 메모리 형식입니다.
import torch
# 2x3 크기의 텐서를 생성합니다.
x = torch.randn(2, 3)
# 텐서의 크기를 출력합니다.
print(x.size()) # 출력: torch.Size([2, 3])
# 생성된 텐서의 값을 출력합니다.
print(x) # 출력: tensor([[-0.9181, -0.4192, 0.0072],
# [-0.2315, -0.1465, -0.0403]])
randperm
PyTorch의 torch.randperm() 함수는 주어진 범위 내에서 무작위로 정수를 생성하여 이를 순열(Permutation)로 반환하는 함수입니다.
torch.randperm(n, *, generator=None, out=None, device=None, dtype=torch.int64) -> Tensor
- n: 생성할 순열의 길이를 나타내는 정수입니다.
- generator: 순열을 생성하는 데 사용할 랜덤 생성기입니다. 기본값은 None이며, 이 경우 기본 생성기가 사용됩니다.
- out: 결과값을 저장할 출력 텐서입니다.
- device: 생성될 텐서를 저장할 디바이스입니다. 기본값은 CPU입니다.
- dtype: 출력 텐서의 데이터 형식입니다. 기본값은 torch.int64입니다
import torch
# 0부터 9까지의 정수로 이루어진 순열을 생성합니다.
x = torch.randperm(10)
# 생성된 순열을 출력합니다.
print(x) # 출력: tensor([9, 0, 7, 2, 8, 1, 6, 5, 4, 3])
possion
PyTorch의 torch.poisson() 함수는 포아송 분포(Poisson distribution)에서 난수를 생성하는 함수입니다.
torch.poisson(input, generator=None, *, out=None) -> Tensor
- input: 포아송 분포에서의 평균 발생 횟수를 나타내는 텐서입니다.
- generator: 난수 생성기입니다. 기본값은 None이며, 이 경우 기본 생성기가 사용됩니다.
- out: 결과값을 저장할 출력 텐서입니다.
import torch
# 평균 발생 횟수가 3인 포아송 분포에서 2x3 크기의 난수를 생성합니다.
x = torch.poisson(torch.tensor(3.), (2, 3))
# 생성된 텐서를 출력합니다.
print(x) # 출력: tensor([[3., 1., 3.],
# [2., 3., 1.]])
Math opreations - Pointwise Ops
point wiseops??
PyTorch에서 pointwise ops는 요소별(element-wise) 연산을 의미합니다. 즉, 두 개 이상의 텐서가 있을 때, 각 텐서의 같은 위치에 있는 요소들끼리 연산을 수행하는 것입니다.
log1p
PyTorch에서 log1p() 함수는 입력값에 1을 더한 후 로그 값을 계산하는 함수입니다. 이 함수는 작은 값의 로그 값을 계산할 때 수치 안정성(numerical stability)을 보장하기 위해 사용됩니다. 즉, 아주 작은 값의 로그 값을 계산할 때 수치적으로 불안정한 상황을 방지하기 위해 사용됩니다.
torch.log1p(input, *, out=None) -> Tensor
- input: 입력값으로 사용될 텐서입니다.
- out: 결과값을 저장할 출력 텐서입니다.
import torch
# 아주 작은 값(1e-7)의 로그 값을 계산합니다.
x = torch.tensor(1e-7)
y = torch.log1p(x)
# 결과를 출력합니다.
print(y) # 출력: tensor(9.9999e-08)
이 코드는 아주 작은 값(1e-7)의 로그 값을 log() 대신 log1p() 함수를 사용하여 계산하고, 그 값을 출력합니다. log1p() 함수는 log() 함수와 달리 아주 작은 값의 로그 값을 계산할 때 수치 안정성을 보장하기 때문에, 이 예시에서는 정확한 결과를 출력할 수 있습니다.
rad2deg
PyTorch에서 rad2deg() 함수는 라디안 값을 도 단위로 변환하는 함수입니다. 즉, 입력된 라디안 값을 180/π를 곱해 도 단위로 변환합니다.
torch.rad2deg(input, *, out=None) -> Tensor
- input: 입력값으로 사용될 텐서입니다.
- out: 결과값을 저장할 출력 텐서입니다.
import torch
# 라디안 값을 도 단위로 변환합니다.
x = torch.tensor(3.14159)
y = torch.rad2deg(x)
# 결과를 출력합니다.
print(y) # 출력: tensor(180.)
이 코드는 3.14159 라디안 값을 rad2deg() 함수를 사용하여 도 단위로 변환하고, 그 값을 출력합니다. rad2deg() 함수는 입력값을 180/π를 곱하여 도 단위로 변환하기 때문에, 이 예시에서는 180이라는 정확한 결과를 출력할 수 있습니다.
clamp
PyTorch에서 clamp() 함수는 입력된 텐서의 각 요소(element)를 주어진 범위 안으로 잘라내는 함수입니다. 범위를 벗어나는 요소는 모두 주어진 최솟값(min) 또는 최댓값(max)으로 설정됩니다.
torch.clamp(input, min=None, max=None, *, out=None) -> Tensor
- input: 입력값으로 사용될 텐서입니다.
- min: 잘라낼 범위의 최솟값입니다. 이 값을 지정하지 않으면 텐서의 가장 작은 값이 최솟값으로 사용됩니다.
- max: 잘라낼 범위의 최댓값입니다. 이 값을 지정하지 않으면 텐서의 가장 큰 값이 최댓값으로 사용됩니다.
- out: 결과값을 저장할 출력 텐서입니다.
import torch
# 입력값의 요소를 주어진 범위 안으로 잘라냅니다.
x = torch.tensor([-2, 0, 2, 4, 6])
y = torch.clamp(x, min=0, max=4)
# 결과를 출력합니다.
print(y) # 출력: tensor([0, 0, 2, 4, 4])
이 코드는 [-2, 0, 2, 4, 6]이라는 입력값의 요소를 0과 4라는 범위 안으로 잘라냅니다. 이를 위해 clamp() 함수를 사용하고, 그 결과를 출력합니다. 이 예시에서는 입력값의 요소 중 0보다 작은 값은 모두 0으로, 4보다 큰 값은 모두 4로 설정되어 출력됩니다.
Math operations - Reduction Ops
Reduction Ops??
PyTorch에서 reduction ops는 텐서의 차원을 축소하고 합치는(reduce) 연산을 의미합니다. 이러한 연산은 텐서의 크기를 줄이고, 특정 차원에 대한 통계 정보를 계산할 때 유용합니다.
prod
PyTorch의 prod 함수는 주어진 차원(axis)을 따라 텐서의 모든 요소의 곱을 반환합니다. 예를 들어, 다음과 같은 코드는 1차원 텐서의 모든 요소를 곱한 결과를 반환합니다:
import torch
x = torch.tensor([2, 4, 6])
y = torch.prod(x)
print(y) # 출력: tensor(48)
import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
y = torch.prod(x)
print(y) # 출력: tensor(720)
prod 함수의 dim 매개변수를 사용하여 곱할 차원(axis)을 지정할 수 있습니다. 예를 들어, 다음 코드는 2차원 텐서에서 첫 번째 차원을 따라 요소의 곱을 계산합니다:
import torch
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
y = torch.prod(x, dim=0)
print(y) # 출력: tensor([ 4, 10, 18])
위 코드에서 torch.prod(x, dim=0)은 텐서 x의 첫 번째 차원을 따라 요소의 곱을 계산하여 1차원 텐서 y에 저장합니다. 즉, y의 첫 번째 요소는 1과 4의 곱, 두 번째 요소는 2와 5의 곱, 세 번째 요소는 3과 6의 곱입니다.
count_nonzero
PyTorch의 count_nonzero 함수는 텐서에서 0이 아닌 원소의 개수를 반환합니다. 예를 들어, 다음과 같이 사용할 수 있습니다.
import torch
x = torch.tensor([[1, 0, 3], [0, 5, 0]])
y = torch.count_nonzero(x)
print(y) # 출력: tensor(3)
count_nonzero 함수는 또한 특정 차원에 대해서만 0이 아닌 원소의 개수를 세어줄 수 있습니다. 예를 들어, 다음과 같은 코드는 x의 각 행에 대해 0이 아닌 원소의 개수를 계산합니다.
import torch
x = torch.tensor([[1, 0, 3], [0, 5, 0]])
y = torch.count_nonzero(x, dim=1)
print(y) # 출력: tensor([2, 1])
argmax
PyTorch의 argmax 함수는 텐서에서 가장 큰 값을 가지는 원소의 인덱스를 반환합니다. 예를 들어, 다음과 같이 사용할 수 있습니다.
import torch
x = torch.tensor([1, 5, 3, 2, 4])
y = torch.argmax(x)
print(y) # 출력: tensor(1)
import torch
x = torch.tensor([[1, 5, 3], [2, 4, 6]])
y = torch.argmax(x, dim=0)
print(y) # 출력: tensor([1, 1, 1])
Math operations - Comparison Ops
allclose
PyTorch의 allclose 함수는 두 개의 텐서가 상대적으로 동일한 값을 갖는지 확인하는 함수입니다. 즉, 두 텐서 간의 차이가 허용 오차(atol, rtol) 내에 있는지 확인합니다.
import torch
x = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([1.0001, 2.0002, 3.0003])
# 허용 오차를 지정하여 x와 y의 차이를 비교합니다.
result = torch.allclose(x, y, rtol=1e-3, atol=1e-3)
print(result) # 출력: False
위 코드에서 x와 y는 각각 크기가 3인 1차원 텐서입니다. torch.allclose(x, y, rtol=1e-3, atol=1e-3)은 x와 y의 차이가 상대적인 오차 0.001(rtol=1e-3)와 절대적인 오차 0.001(atol=1e-3) 내에 있는지 확인합니다. x와 y는 각 원소의 값이 0.0001 이상 차이나므로, allclose 함수는 False를 반환합니다.
allclose 함수는 텐서뿐만 아니라 숫자나 numpy 배열과 같은 다른 타입의 객체도 비교할 수 있습니다. 다음은 이러한 사용 예시입니다.
import torch
import numpy as np
x = 1.0
y = 1.0001
# 허용 오차를 지정하여 x와 y의 차이를 비교합니다.
result = torch.allclose(x, y, rtol=1e-3, atol=1e-3)
print(result) # 출력: False
# numpy 배열과 비교합니다.
a = np.array([1.0, 2.0, 3.0])
b = np.array([1.0001, 2.0002, 3.0003])
result = torch.allclose(torch.from_numpy(a), torch.from_numpy(b), rtol=1e-3, atol=1e-3)
print(result) # 출력: False
argsort
PyTorch의 argsort 함수는 주어진 텐서의 각 요소를 정렬한 후, 정렬된 요소의 인덱스를 반환합니다.
예를 들어, x = torch.tensor([3, 1, 4, 2]) 라는 텐서가 있을 때, x.argsort()를 실행하면 [1, 3, 0, 2]를 반환합니다. 이는 인덱스 1에 위치한 값이 가장 작은 값이며, 인덱스 2에 위치한 값이 가장 큰 값이라는 의미입니다.
argsort 함수는 기본적으로 오름차순으로 정렬하며, 내림차순으로 정렬하려면 torch.argsort(x, descending=True)를 사용합니다.
다음은 argsort 함수의 사용 예시입니다.
import torch
x = torch.tensor([3, 1, 4, 2])
# x를 오름차순으로 정렬한 후, 정렬된 값의 인덱스를 반환합니다.
sorted_indices = torch.argsort(x)
print(sorted_indices) # 출력: tensor([1, 3, 0, 2])
# x를 내림차순으로 정렬한 후, 정렬된 값의 인덱스를 반환합니다.
desc_sorted_indices = torch.argsort(x, descending=True)
print(desc_sorted_indices) # 출력: tensor([2, 0, 3, 1])
topk
예를 들어, x = torch.tensor([3, 1, 4, 2]) 라는 텐서가 있을 때, x.topk(k=2)를 실행하면 (tensor([4, 3]), tensor([2, 0]))을 반환합니다. 이는 텐서 x에서 가장 큰 값 2개는 4와 3이며, 해당 값들의 인덱스는 각각 2와 0이라는 의미입니다.
topk 함수는 또한, 가장 작은 값 k개를 반환하도록 largest=False로 설정할 수 있습니다. 예를 들어, x.topk(k=2, largest=False)를 실행하면 (tensor([1, 2]), tensor([1, 3]))을 반환합니다. 이는 텐서 x에서 가장 작은 값 2개는 1과 2이며, 해당 값들의 인덱스는 각각 1과 3이라는 의미입니다.
다음은 topk 함수의 사용 예시입니다.
import torch
x = torch.tensor([3, 1, 4, 2])
# x에서 가장 큰 값 2개와 해당 값들의 인덱스를 반환합니다.
top_values, top_indices = torch.topk(x, k=2)
print(top_values) # 출력: tensor([4, 3])
print(top_indices) # 출력: tensor([2, 0])
# x에서 가장 작은 값 2개와 해당 값들의 인덱스를 반환합니다.
bottom_values, bottom_indices = torch.topk(x, k=2, largest=False)
print(bottom_values) # 출력: tensor([1, 2])
print(bottom_indices) # 출력: tensor([1, 3])
Math operations - Other Operations
triu
triu 함수는 주어진 텐서에서 상삼각 행렬(upper triangular matrix)을 반환합니다. 상삼각 행렬은 주 대각선 위에 있는 요소가 모두 0인 행렬을 말합니다.
다음은 triu 함수의 사용 예시입니다.
import torch
x = torch.tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# x에서 상삼각 행렬을 반환합니다.
result = torch.triu(x)
print(result)
# 출력:
# tensor([[1, 2, 3],
# [0, 5, 6],
# [0, 0, 9]])
einsum
einsum 함수는 PyTorch에서 제공하는 텐서 연산 중 하나로, Einstein 표기법(Einstein notation)을 사용하여 텐서 곱셈과 축소 연산을 동시에 수행할 수 있습니다.
torch.einsum(equation, *operands)
여기서 equation은 Einstein 표기법을 사용하여 작성된 문자열입니다. 이 문자열은 텐서 연산을 지정합니다. operands는 2개 이상의 텐서를 나타내는 파라미터입니다.
다음은 einsum 함수를 사용한 예시입니다.
import torch
# 3x4 크기의 랜덤 텐서를 생성합니다.
x = torch.randn(3, 4)
# x의 각 열의 합을 계산합니다.
result = torch.einsum('ij->j', x)
print(result)
# 출력:
# tensor([ 0.0614, -1.7438, -0.4757, -1.3057])
이 예시에서는 크기가 3x4인 랜덤한 텐서 x를 생성합니다. einsum 함수를 사용하여 x의 각 열의 합을 계산합니다. 이를 위해 einsum 함수의 equation 인자에 'ij->j'를 전달합니다. 이것은 입력 텐서 x에서 축 0을 삭제하고, 축 1을 유지하여 결과 텐서를 얻는 것을 의미합니다. 이 결과 텐서는 크기가 4인 벡터가 됩니다.
bucketize
PyTorch의 bucketize 함수는 입력값을 일정한 간격으로 나누어서 각 구간에 해당하는 버킷 번호를 반환합니다. 이 함수는 이산화(discretization) 작업에 사용됩니다.
torch.bucketize(input, boundaries, out=None, right=False)
여기서 input은 이산화(discretization)를 수행할 1차원 텐서(tensor)입니다. boundaries는 구간을 정하는 경계값(boundaries)으로, 오름차순으로 정렬된 1차원 텐서입니다. out은 결과를 저장할 출력 텐서입니다. 만약 out이 제공되지 않으면, 새로운 텐서가 생성됩니다. right는 경계값이 포함될 구간을 선택하는 옵션으로, 기본값은 False입니다.
다음은 bucketize 함수의 예시입니다:
import torch
x = torch.tensor([1.0, 2.4, 3.2, 4.1, 5.0])
boundaries = torch.tensor([2.0, 4.0])
result = torch.bucketize(x, boundaries)
print(result)
위 코드는 x 텐서를 [2.0, 4.0] 경계값을 가지는 구간으로 나누어 결과를 출력합니다
tensor([0, 1, 1, 2, 2])
Math operations - BLAS and LAPACK operations
BLAS -> Basic Linear Algebra Subprograms
LAPACK -> Linear Algebra PACKage
addmm
qr
PyTorch의 torch.qr(input) 함수는 입력 행렬(input matrix)을 직교행렬(orthogonal matrix) q 와 상삼각행렬(upper triangular matrix) r 로 분해합니다. 즉, input = q @ r 을 만족하는 q 와 r 을 찾아 반환합니다.
QR 분해는 주로 선형 대수학에서 활용되며, 다양한 문제에 활용될 수 있습니다. 예를 들어, 최소 자승법(least squares) 문제나 고유값(eigenvalue) 및 고유벡터(eigenvector) 계산 문제에 사용됩니다.
q, r = torch.qr(input)
input 은 QR 분해할 입력 행렬이며, q 와 r 은 각각 분해된 직교행렬과 상삼각행렬입니다. 반환된 q 와 r 은 다음과 같은 조건을 만족합니다.
- q 는 크기가 (m, m) 인 직교행렬(orthogonal matrix)입니다.
- r 는 크기가 (m, n) 인 상삼각행렬(upper triangular matrix)입니다.
q 는 선형 연산으로 사용할 수 있습니다. 예를 들어, q @ q.T 는 항상 단위행렬(identity matrix)이 되며, q.T @ q 는 상삼각행렬이 됩니다. r 은 input 의 선형독립인 열벡터로 이루어진 행렬의 랭크(rank)를 계산할 때 사용할 수 있습니다.
'AI > Pytorch' 카테고리의 다른 글
모듈 분석,Docstring,repr (0) | 2023.03.16 |
---|---|
Custom Model, Conatiner, Module (0) | 2023.03.16 |
PyTorch Document 2 (0) | 2023.03.16 |
Pytorch basic (0) | 2023.03.13 |
PyTorch 개요 (0) | 2023.03.12 |