[PyTorch] Tensor Function and Method

Young·2024년 8월 6일

PyTorch

목록 보기
3/7

📌 Tensor 기초 함수

1. Tensor의 기초 통계값을 구하는 함수

함수설명ex
minTensor의 최솟값torch.min()
maxTensor의 최댓값torch.max()
sumTensor의 합계torch.sum()
prodTensor의 곱torch.prod()
meanTensor의 평균torch.mean()
varTensor의 분산torch.var()
dim연산 차원 지정tensor.sum(dim=0)
sizeTensor의 크기tensor.size()
shapeTensor의 형태tensor.shape
numelTensor의 요소 개수tensor.numel()

예시

import torch

# 예시 tensor 생성
t = torch.tensor([[1, 2, 3], [4, 5, 6]])

# 기본 연산 함수 사용 예시
print("최솟값:", torch.min(t))
print("최댓값:", torch.max(t))
print("합계:", torch.sum(t))
print("곱:", torch.prod(t))
print("평균:", torch.mean(t))
print("분산:", torch.var(t))
print("차원 0 기준 합계:", t.sum(dim=0))
print("크기:", t.size())
print("형태:", t.shape)
print("요소 개수:", t.numel())

# 실행 결과
# 최솟값: 1
# 최댓값: 6
# 합계: 21
# 곱: 720
# 평균: 3.5000
# 분산: 2.9167
# 차원 0 기준 합계: tensor([5, 7, 9])
# 크기: torch.Size([2, 3])
# 형태: torch.Size([2, 3])
# 요소 개수: 6



2. Tensor를 생성하는 다양한 방법

(1) 특정 값(0, 1)을 가지는 Tensor 생성

  • 모든 값이 0이나 1인 Tensor
  • 특정 Tensor와 형태가 동일한데 값이 0이나 1인 Tensor
함수설명사용 예시
zeros모든 요소가 0인 Tensortorch.zeros()
ones모든 요소가 1인 Tensortorch.ones()
zeros_like입력 Tensor와 같은 크기의 0 Tensortorch.zeros_like()
ones_like입력 Tensor와 같은 크기의 1 Tensortorch.ones_like()

(2) 난수 값을 가지는 Tensor 생성

함수설명사용 예시
rand0과 1 사이의 균등 분포에서 난수를 생성하는 Tensortorch.rand()
randn평균이 0이고 표준 편차가 1인 표준 정규 분포에서 난수를 생성하는 Tensortorch.randn()
rand_like입력 Tensor와 같은 크기와 자료형을 가지는 난수 Tensor
(0과 1 사이의 균등 분포에서 난수 생성)
torch.rand_like()
randn_like입력 Tensor와 같은 크기와 자료형을 가지는 난수 Tensor
(평균이 0이고 표준 편차가 1인 표준 정규 분포에서 난수 생성)
torch.randn_like()

예시

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

# 함수 사용 예시
print("zeros(2,2):\n", torch.zeros(2, 2))
print("ones(2,2):\n", torch.ones(2, 2))
print("zeros_like(t):\n", torch.zeros_like(t))
print("ones_like(t):\n", torch.ones_like(t))
print("rand(2,2):\n", torch.rand(2, 2))
print("rand_like(t):\n", torch.rand_like(t))

# 실행 결과
# zeros(2,2):
#  tensor([[0., 0.],
#          [0., 0.]])
# ones(2,2):
#  tensor([[1., 1.],
#          [1., 1.]])
# zeros_like(t):
#  tensor([[0, 0],
#          [0, 0]])
# ones_like(t):
#  tensor([[1, 1],
#          [1, 1]])
# rand(2,2):
#  tensor([[0.1234, 0.5678],
#          [0.9012, 0.3456]])  # 실제 값은 매번 다름
# rand_like(t):
#  tensor([[0.7890, 0.2345],
#          [0.6789, 0.1234]])  # 실제 값은 매번 다름

(3) 지정 범위 값을 가지는 Tensor 생성

함수설명사용 예시
arange지정된 간격의 1차원 Tensortorch.arange()

예시

torch.arange(5) # tensor([0, 1, 2, 3, 4])
torch.arange(start=1, end=3, step=0.5) # tensor([1., 1.5, 2., 2.5])

(4) 초기화 되지 않은 Tensor 생성

  • 특정 값으로 설정되지 않은 Tensor로 메모리에 이미 존재하는 값으로 Tensor 생성
  • 불필요한 자원 소모를 줄여 성능 향상
  • 메모리 할당 후 즉시 계산에 사용하여 메모리 사용 최적화
함수설명사용 예시
empty초기화되지 않은 Tensortorch.empty()
fill_Tensor를 지정된 값으로 채움tensor.fill_()

torch.empty()

  • 지정된 크기의 텐서 생성 (But, 초기화 X)
  • 메모리를 할당하지만, 그 메모리에 어떤 특정한 값을 쓰지 않음
  • 결과적으로, 텐서의 요소들은 메모리에 이미 있던 쓰레기 값을 가지게 됨
    랜덤으로 생성된 것 같지만 실제로 무작위로 생성된 것은 아님
    ✨ empty로 생성된 텐서는 사용하기 전에 반드시 값을 할당해야 함

예시

torch.empty(3,2)
# tensor([[4.5916e-41, 1.4013e-45],
#         [0.0000e+00, 0.0000e+00],
#         [0.0000e+00, 1.4013e-45]])  # 값은 매번 다를 수 있음


t = torch.empty(2,3)
t.fill_(5)
# tensor([[5., 5., 5.],
#         [5., 5., 5.]])

PyTorch 텐서 초기화를 위한 in-place 연산 함수

함수설명사용 예시
fill_지정된 값으로 텐서를 채움tensor.fill_(5)
zero_모든 원소를 0으로 채움tensor.zero_()
ones_모든 원소를 1로 채움tensor.ones_()
uniform_균일 분포의 난수로 채움tensor.uniform_(0, 1)
normal_정규 분포의 난수로 채움tensor.normal_(mean=0, std=1)
random_지정된 범위의 정수 난수로 채움tensor.random_(0, 10)
add_텐서에 값을 더함tensor.add_(5)
sub_텐서에서 값을 뺌tensor.sub_(3)
mul_텐서에 값을 곱함tensor.mul_(2)
div_텐서를 값으로 나눔tensor.div_(2)

예시

t = torch.FloatTensor(2, 2)

t.fill_(5) # t를 5로 채움
#  tensor([[5., 5.],
#          [5., 5.]])

t.zero_() # t를 0으로 채움
#  tensor([[0., 0.],
#          [0., 0.]])

t.uniform_(0, 1) # t를 0~1 사이 균일 분포 난수로 채움
#  tensor([[0.1234, 0.5678],
#          [0.9012, 0.3456]])

t.normal_() # t를 정규 분포 난수로 채움
#  tensor([[-0.1234,  0.5678],
#          [ 0.9012, -0.3456]])

t.random_(0, 10) # t를 1~10사이 난수로 채움
#  tensor([[3., 7.],
#          [1., 9.]])

t.add_(1) # t에 1을 더함
#  tensor([[4., 8.],
#          [2., 10.]])

t.mul_(2) # t에 2를 곱함
#  tensor([[ 8., 16.],
#          [ 4., 20.]])

(5) List, Numpy로 Tensor 생성

# List로 Tensor 생성
list_2d_tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])

# Numpy 배열로 Tensor 생성
numpy_2d_array = np.array([[1, 2, 3], [4, 5, 6]])
numpy_2d_tensor = torch.from_numpy(numpy_2d_array)

(6) CPU Tensor 생성

함수설명사용 예시
IntTensor32비트 정수형 Tensortorch.IntTensor()
FloatTensor32비트 부동소수점 Tensortorch.FloatTensor()
ByteTensor8비트 부호 없는 정수형 Tensortorch.ByteTensor()
CharTensor8비트 부호 있는 정수형 Tensortorch.CharTensor()
ShortTensor16비트 정수형 Tensortorch.ShortTensor()
LongTensor64비트 정수형 Tensortorch.LongTensor()
DoubleTensor64비트 부동소수점 Tensortorch.DoubleTensor()

예시

a, b, c = 1, 2, 3

torch.IntTensor([a, b, c]) # tensor([1, 2, 3], dtype=torch.int32)
torch.FloatTensor([a, b, c]) # tensor([1., 2., 3.], dtype=torch.float32)

(7) CUDA Tensor

  • 대규모 데이터 처리와 복잡한 계산을 하기 위해 최근 GPU를 활용함
  • CUDA Tensor는 GPU Tensor에 포함되는 개념

AI 분야에서 GPU를 활용하는 이유
병렬 처리 능력 / 훈련, 추론 속도 향상 / 경제적 이점(시간 단축, 에너지 절약)

CUDA Tensor를 다루기 위한 기능들

기능Code
Tensor의 디바이스 확인tensor.device
CUDA 사용 가능 여부 확인torch.cuda.is_available()
CUDA device 이름 확인torch.cuda.get_device_name(device=0)
Tensor GPU에 할당torch.tensor([1, 2]).to(‘cuda’)
torch.tensor([1, 2]).cuda()
Tensor GPU -> CPUtensor.to(device = 'cpu')
tensor.cpu()

(8) Tensor 복제

Clone()

  • 새로운 텐서를 생성하고 원본 텐서의 내용을 복사
  • 새 텐서는 원본과 메모리를 공유 X (독립적)
  • 계산 그래프 유지 (requires_grad 속성 유지)
  • 주로 텐서의 완전한 복사본이 필요할 때 사용

Detach()

  • 원본 텐서와 동일한 저장 공간을 공유하는 새로운 뷰(view)를 반환
  • 계산 그래프에서 분리 (requires_grad=False)
  • 주로 역전파를 막고 텐서의 값만 필요할 때 사용

차이점

  • 메모리 사용
    clone : 새로운 메모리 할당
    detach : 원본 텐서와 메모리 공유
  • 계산 그래프
    clone : 계산 그래프 유지
    detach : 계산 그래프에서 분리
  • 변경 영향
    clone : clone()으로 생성된 텐서를 변경해도 원본에 영향을 주지 않음
    detach : detach()로 생성된 텐서를 변경하면 원본도 함께 변경
  • 사용 목적에 따라 적절한 방법을 선택해야 함
    ex) 역전파 없이 텐서 값만 필요한 경우 detach()를, 완전히 독립적인 복사본이 필요한 경우 clone()을 사용

예시

t = torch.tensor([1, 2, 3]) # tensor([1, 2, 3])
t1 = t.clone() # tensor([1, 2, 3])
t2 = t.detach() # tensor([1, 2, 3])

0개의 댓글