Tensor들 간의 연결 : cat() 함수
b = torch.tensor([[0, 1], [2, 3]])
c = torch.tensor([[4, 5]])
- dim = 0을 기준으로 b와 c 연결
- d = torch.cat((b, c)) → d = [[0, 1], [2, 3], [4, 5]]
- dim = 1을 기준으로 b와 c 연결
- dim = 1을 기준으로 했을 때 b와 c의 크기가 다르므로 reshape 필요
- e = torch.cat((b, c.reshape(2, 1), 1) → e = [[0, 1, 4], [2, 3, 5]]
Tensor의 크기 확장 : expand(), repeat() 메서드
- expand() : 주어진 Tensor의 차원 중 일부의 크기가 1일 때, 해당 차원의 크기를 확장
- f = torch.tensor([[1, 2, 3]]) → g = f.expand(4, 3)
- [1, 2, 3] → [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
- repeat() : 주어진 Tensor의 요소들을 반복하는 방식으로 크기를 확장
- 일부 차원의 크기가 1이어야 한다는 제약은 없으나, 메모리 효율성이 떨어짐
- h = torch.tensor([[1, 2], [3, 4]]) → i = h.repeat(2, 3)
- [[1, 2], [3, 4]] → [[1, 2, 1, 2, 1, 2], [3, 4, 3, 4, 3, 4], [1, 2, 1, 2, 1, 2], [3, 4, 3, 4, 3, 4]]
Tensor의 산술연산
- 더하기 연산
- 함수 방식 : torch.add(a, b)
- in-place 방식 : a.add_(b)
- 빼기 연산
- 함수 방식 : torch.sub(f, e)
- in-place 방식 : f.sub_(e)
- 곱하기 연산
- 스칼라곱 연산 : torch.mul(i, j)
- 요소별 곱하기 연산
- 함수 방식 : torch.mul(k, l)
- in-place 방식 : k.mul_(l)
- 나누기 연산
- 함수 방식 : torch.div(o, p)
- in-place 방식 : o.div_(p)
- 거듭제곱 연산
- Tensor s의 각 요소들에 대해 n제곱 : torch.pow(s, n)
- Tensor t의 요소들을 Tensor u의 대응요소들만큼 거듭제곱
- 함수 방식 : torch.pow(t, u)
- in-place 방식 : t.pow_(u)
- 제곱근 연산
- Tensor s의 각 요소들에 대한 n제곱근 : torch.pow(s, 1/n)
- 크기가 다른 Tensor의 연산 → broadcasting
- torch.add(c, d)
- torch.sub(g, h)
- torch.mul(m, n)
- torch.div(q, r) → 부동소수점(.float()으로) 맞춰줘야함 !
Tensor의 비교연산 (Boolean Tensor로 출력)
- torch.eq() : equal
- torch.ne() : nonequal
- torch.gt() : greater than
- torch.ge() : greater than or equal
- torch.lt() : lower than
- torch.le() : lower than or equal
Tensor의 논리연산
- 논리곱(AND) : 입력된 신호가 모두 참일 때, 출력이 참이 되는 연산 → torch.logical_and(x, y)
- 논리합(OR) : 입력된 신호 중 하나라도 참일 때, 출력이 참이 되는 연산 → torch.logical_or(x, y)
- 배타적 논리합(XOR) : 입력된 신호가 하나만 참일 때, 출력이 참이 되는 연산 → torch.logical_xor(x, y)
Tensor의 노름
- 1-D Tensor의 노름은 Vector가 원점에서 얼마나 떨어져 있는지를 의미한다.
- L1 노름은 1-D Tensor에 포함된 요소의 절대값의 합으로 정의할 수 있다.
- L2 노름은 1-D Tensor에 포함된 요소의 제곱합의 제곱근으로 정의할 수 있다.
- L∞ 노름은 1-D Tensor에 포함된 요소의 절대값 중 최대값으로 정의할 수 있다.
유사도
유사도란 두 1-D Tensor(=Vector)가 얼마나 유사한지에 대한 측정값
→ 군집화(Clustering) 알고리즘에서 데이터들이 얼마나 유사한지를 판단하는 중요한 기준이 됨
이때 군집화란 비지도 학습의 한 형태로서, 유사한 데이터들을 그룹으로 묶는 기법
- 맨해튼 유사도
- 두 1-D Tensor 사이의 맨해튼 거리를 역수로 변환하여 계산한 값
- 맨해튼 거리 계산 : manhattan_distance = torch.norm(b-c, p=1)
- 맨해튼 유사도 계산 : 1 / (1 + manhattan_distance)
- 맨해튼 유사도의 값이 1에 가까울수록 두 Tensor가 유사하다고 판단
- 두 1-D Tensor 사이의 맨해튼 거리를 역수로 변환하여 계산한 값
- 유클리드 유사도
- 두 1-D Tensor 사이의 유클리드 거리를 역수로 변환하여 계산한 값
- 유클리드 거리 계산 : euclidean_distance = torch.norm(b-c, p=2)
- 유클리드 유사도 계산 : 1 / (1 + euclidean_distance)
- 유클리드 유사도의 값이 1에 가까울수록 두 Tensor가 유사하다고 판단
- 두 1-D Tensor 사이의 유클리드 거리를 역수로 변환하여 계산한 값
- 코사인 유사도
- 두 1-D Tensor 사이의 각도를 측정하여 계산한 값
- cosine_similarity = torch.dot(b, c) / (torch.norm(b, p = 2) * (torch.norm(c, p = 2))
- 코사인 유사도의 값이 1에 가까울 수록 두 Tensor가 유사하다고 판단
2-D Tensor의 행렬 곱셈 연산
2-D Tensor(=Matrix)의 행렬 곱셈은 두 행렬을 결합하여 새로운 행렬을 생성하는 연산으로, 신경망 구현에 핵심이 되는 연산이다.
행렬 곱셈 연산의 코드 표현
D = torch.tensor([[1, 1, 3], [4, 5, 6], [7, 8, 9]])
E = torch.tensor([[1, 0], [1, -1], [2, 1]])
D.matmul(E) / D.mm(E) / D @ E
행렬 곱셈 연산의 활용
G = torch.tensor([[255, 114, 140], [39, 255, 46], [61, 29, 255]])
H = torch.tensor([[0, 0, 1], [0, 1, 0], [1, 0, 0]])
1. 흑백 이미지의 좌우로 대칭 이동
I = G @ H
2. 흑백 이미지의 상하로 대칭 이동
J = H @ G
행렬 H는 대칭 변환을 수행하는 특수한 행렬이다. 행렬 H를 행렬G의 오른쪽에서 곱할 때, 행렬 H는 행렬 G를 좌우 대칭으로 바꾼다. 행렬 H를 행렬G의 왼쪽에서 곱할 때, 행렬 H는 행렬 G를 상하 대칭으로 바꾼다.
'NAVER Boostcamp AI Tech > 주간학습정리' 카테고리의 다른 글
Day 5. 이진 분류(Binary Classification) (0) | 2024.08.25 |
---|---|
Day 4. 선형 회귀(Linear Regression) (0) | 2024.08.25 |
Day 2. Tensor 생성과 조작 (0) | 2024.08.25 |
Day 1. PyTorch 기초 (0) | 2024.08.25 |