broadcasting

indexing & slicing

import torch

x = torch.arange(0, 256, dtype = torch.int64, device = 'cpu').float()
print(f"original x size: {x.size()}")
x_expanded = x[None, :, None, None]
print(f"expanded x size: {x_expanded.size()}")
original x size: torch.size([256])
expanded x size: torch.Size([1, 256, 1, 1])
x = torch.randn(4, 4, 7, 3)
print(x.size())

x_ = x[None, :, None, :, None, :, None, :]
print(x_.size())
torch.Size([4, 4, 7, 3])
torch.Size([1, 4, 1, 4, 1, 7, 1, 3])
  • None 지정해주는만큼 차원 확장가능하나 전체 인덱싱(:)은 원래 텐서 갯수만큼 할당 가능

expand

x = 10000 ** (torch.arange(0, 256, dtype = torch.int64, device = 'cpu').float() / 256)
x = x[None, :, None].float()

print(f"before slicing x shape: {x.size()}")
torch.Size([1, 256, 1])
x_expanded = x.expand(100, -1, 50)
print(f"before slicing x_expanded shape: {x_expanded.size()}")
torch.Size([100, 256, 50])
  • 특정 차원의 텐서를 반복해서 생성해주는 함수이며 특정 차원의 크기가 1인 tensor에만 적용 가능
  • expand(-1): 차원유지
  • expand(n): 차원의 크기가 1인 tensor에 n만큼 차원 확장

triu & tril

삼각행렬, triangular matrix

  • 선형대수에서 삼각행렬은 정사각행렬의 특수한 경우로 주대각선을 기준으로 대각항의 위쪽이나 아래쪽 항들의 값이 모두 0인 경우를 의미

삼각행렬1

  • 하삼각행렬(lower triangular matrix)

하삼각행렬

  • 상삼각행렬(upper triangular matrix)

상삼각행렬

triu

  • 상삼각행렬 만들어주는 함수
in_tensor = torch.randn(3, 3)
print(in_tensor)
tensor([[ 1.1567,  1.6308, -2.5685],
        [-0.9405, -0.3915, -1.8426],
        [-0.2034,  0.2296,  0.5827]])
upper_tri_matrix = torch.triu(in_tensor, diagonal = 0)
print(f"Upper triangular Matrix:\n{upper_tri_matrix}")
Upper triangular Matrix:
tensor([[ 1.1567,  1.6308, -2.5685],
        [ 0.0000, -0.3915, -1.8426],
        [ 0.0000,  0.0000,  0.5827]])

tril

  • 하삼각행렬 만들어주는 함수
lower_tri_matrix = torch.tril(in_tensor)
print(f"Lower triangular Matrix:\n{lower_tri_matrix}")
Lower triangular Matrix:
tensor([[ 1.1567,  0.0000,  0.0000],
        [-0.9405, -0.3915,  0.0000],
        [-0.2034,  0.2296,  0.5827]])