2 분 소요

Tensor의 모양 변경

view
  • 메모리가 연속적으로 할당된 경우에 사용 가능

  • tensor.is_contiguous() : tensor 메모리가 연속적으로 할당되었는지 확인

  • torch.flatten(바꾸고자 하는 tensor) or tensor.flatten(): 평탄화 작업

  • torch.flatten(바꾸고자 하는 tensor ,0) : 0번째 차원부터 마지막 차원까지 flatten 수행

  • torch.flatten(바꾸고자 하는 tensor, 0, 2): 0번째 차원부터 2번째 차원까지만 flatten 수행

reshape
  • 메모리가 연속적이지 않아도 사용 가능
  • 안전하고 유연성이 좋으나 성능 down

  • 메모리 연속성 확실하면 view 사용하는 것이 성능적으로 이득
transpose
  • tensor의 특정한 두 차원의 축을 서로 바꿈
  • tensor.transpose(0,1) : 0차원 축과 1차원 축 변경
squeeze
  • a = torch.squeeze(b): b 텐서의 dim = 1인 차원을 축소
  • a = torch.squeeze(b, dim = 0) : b텐서의 특정 차원의 dim = 1인 차원을 축소
unsqueeze
  • dim 1인 특정 차원의 확장 함수
  • a = torch.unsqueeze(b, dim = 0): b 텐서의 0차원에 dim= 1인 차원 확장
stack
  • 새로운 차원을 생성하여 tensor들간의 결합
  • ` torch.stack((red_channel, green_channel, blue_channel), dim = 1)` : dim-1 인 축을 생성해서 결합
cat
  • 기존의 차원 유지하며 tensor들을 연결
  • torch.cat(a,b): dim = 0 기준으로 a,b tensor 연결
  • torch.cat((a,b),1): dim = 1 기준으로 a,b tensor 연결 (이때 차원을 맞춰줘야 연결가능!, reshape 이용)

##### expand

  • tensor의 차원의 크기가 1일 때 해당 차원의 크기를 확장함
  • a= torch.tensor([[1,3]]) 이면 a의 크기는 [1,2]
  • b = a.expand(4,2)를 하면 크기가 1인 차원을 4로 확장
repeat
  • expand 메소드를 활용하면 특정 차원의 크기가 1이어야 하는 단점
  • tensor 요소들을 반복해서 확장, 차원의 크기에 제약이 없다는 장점
  • 메모리 추가 할당을 하기 때문에 하지않는 expand보다 메모리 효율성 bad
  • tensor.repeat(2,4): dim 0 축으로 2번 반복, dim 1 축으로 4번 반복

Tensor의 기초연산

더하기
  • torch.add(a,b)
  • a.add_(b): in-place 방식, 메모리 사용량 줄일 수 있다는 장점
  • 크기가 다른 두 tensor를 더하게 되면 같은 크기로 확장하여 요소들을 연산하게 됨
빼기
  • torch.sub(a,b)
  • a.sub_(b): in-place 방식
  • add와 마찬가지로 크기가 다른 tensor끼리 빼면 확장해서 연산
  • torch.mul(i,j): i가 스칼라값일 경우 스칼라 곱 수행
  • 둘다 tensor일 경우 각 요소별로 곱한 값 출력
  • i.mul_(j): in-place 방식

  • 크기가 다를 경우 확장해서 연산
나누기
  • torch.div(a,b):
  • a.div_(b)

  • 확장 연산
거듭제곱
  • torch.pow(s, n)
  • s.pow_(n)
  • torch.pow(s, 1/n) : 거듭제곱근 연산
비교연산
  • torch.eq(a,b) : a,b가 대응요소들이 서로 같은지 출력
  • boollean tensor로 출력
  • torch.ne(a,b)
  • torch.gt(a,b)
  • torch.ge(a,b)
  • torch.lt(a,b)
  • torch.le(a,b)

Tensor의 논리연산

  • torch.logical_and(x,y) : 둘다 참
  • torch.logical_or(x,y): 둘 중에 하나 이상 참
  • torch.logical_xor(x,y): 둘 중에 하나만 참

Tensor의 노름

  • 1-D tensor의 노름은 Vector가 원점에서 얼마나 떨어져있는지이다.
  • 1-D tensor의 노름에는 L1, L2 L∞ 노름 등이 있다.

L1 노름
  • L1 노름은 요소들의 절댓값의 합
  • L1 노름을 맨해튼 노름이라고도 부름
  • torch.norm(a, p = 1)
L2 노름
  • 요소의 제곱합의 제곱근
  • 유클리드 노름이라고 부름
  • torch.norm(a, p =2)
L∞ 노름
  • 요소의 절대값 중 최대값
  • torch.norm(a, p = float(‘inf’))

유사도

  • 두 1-D tensor 가 얼마나 유사한지에 대한 측정값
맨해튼 유사도
  • 맨해튼 거리를 역수로 변환하여 계산한 값
  • 1에 가까울수록 두 tensor가 유사하다고 판단

  • manhattan_distance = torch.norm(b – c, p = 1) : 맨해튼 거리
  • 1 / (1 + manhattan_distance) : 맨해튼 유사도
유클리드 유사도
  • euclidean_distance = torch.norm(b – c, p = 2) : 유클리드 거리
  • 1 / (1 + euclidean_distance): 유클리드 유사도
코사인 유사도
  • cosine_similarity = torch.dot(b, c) / (torch.norm(b, p = 2) * (torch.norm(c, p = 2))

2-D 텐서의 행렬 곱셈 연산

  • a.matmul(b), a.mm(b), a @ b
  • 흑백이미지 처리에서 행렬 곱을 이용해 대칭 이동 수행 가능(상하, 좌우)

댓글남기기