Week1-Day2
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
- 흑백이미지 처리에서 행렬 곱을 이용해 대칭 이동 수행 가능(상하, 좌우)
댓글남기기