PyTorch 텐서 연산 이해하기: 학습 정리 및 예제
최근 PyTorch를 이용하여 텐서(tensor) 생성 및 연산에 대해 학습하면서 다양한 예제를 직접 실행해 보았습니다. 이번 포스팅에서는 스칼라, 벡터, 행렬 곱셈, 그리고 다차원 텐서 연산의 기본 개념과 함께 실습 예제를 정리하여 소개합니다.
1. 텐서 기본 개념
- 스칼라 텐서
하나의 값으로 이루어진 텐서입니다. 예를 들어, 아래와 같이 생성할 수 있습니다. scalar = torch.tensor(44)- 벡터(1차원 텐서)
여러 개의 숫자로 이루어진 1차원 텐서로, 다음과 같이 생성할 수 있습니다. vector = torch.tensor([1, 2, 3, 4])
2. 행렬(2차원 텐서) 및 행렬 곱셈
행렬 곱셈은 두 행렬의 연산을 수행할 때, 앞 행렬의 열 개수와 뒷 행렬의 행 개수가 동일해야 합니다.
예제:
m1 = torch.tensor([[2, 3, 4], [4, 5, 6]]) # 2×3 행렬
m2 = torch.tensor([[2, 3], [4, 5], [6, 7]]) # 3×2 행렬
# 행렬 곱셈 (2x3 * 3x2 = 2x2)
print(f'2x3 * 3x2 = {m1 @ m2}')
print(f'{(m1 @ m2).shape}차원')
위 연산은 m1 @ m2를 실행하여 2×2 행렬을 결과로 출력합니다.
만약 두 행렬의 크기가 맞지 않는 경우(예: 2×3과 2×3), 에러가 발생하게 됩니다. 이를 해결하기 위해 전치(transpose)를 사용하여 차원을 맞추어야 합니다.
# 3x2 * 3x2>>에러발생
m3 = torch.tensor([[2, 3], [4, 5], [6, 7]])
print(f'2x3 * 2x3 = {m3@m3}')
--------------------------------------------
m3 = torch.tensor([[2, 3], [4, 5], [6, 7]])
m4 = m3.T #전치해서 3x2로 만들어줌(행과 열을 바꿔줌)
print(m3.shape)
print(m4.shape)
# 3x2 * 2x3 = 3x3
print(f'3x2 * 2x3 = {m3@m4}')
print(f'{(m3@m4).shape}차원')
3. 벡터 연산의 주의사항
벡터 간의 덧셈이나 뺄셈은 두 벡터의 길이가 동일할 때만 가능합니다.
길이가 다른 벡터 간 연산을 시도하면 에러가 발생합니다.
예제:
v1 = torch.tensor([1, 2, 3])
v3 = torch.tensor([6, 7, 8])
print(f'v1 + v3 = {v1 + v3}')
길이가 다른 벡터 예시:
v2 = torch.tensor([4, 5])
# 다음 연산은 오류 발생: 서로 길이가 다르기 때문
print(f'v1 + v2 = {v1 + v2}')
4. 다차원 텐서(3D 텐서) 곱셈
3차원 이상의 텐서의 행렬 곱셈은 마지막 두 차원에 대해 적용되며, 그 앞의 차원은 브로드캐스팅 규칙에 따라 처리됩니다.
예제:
import torch
tensor_3d_c = torch.randn(3, 4, 2)
tensor_3d_d = torch.randn(3, 2, 5)
# 각 "높이"별로 (4x2) * (2x5) 행렬 곱셈을 수행하여 최종 결과는 3x4x5 텐서가 됩니다.
result = tensor_3d_c @ tensor_3d_d
print(f'3x4x2 * 3x2x5 = {result}')
print(f'{result.shape}차원')
🔍 브로드캐스팅 적용 방식
tensor_3d_c의 크기:(3, 4, 2)tensor_3d_d의 크기:(3, 2, 5)- 연산 결과(
result):(3, 4, 5)
이 연산에서 PyTorch는 마지막 두 차원(4×2와 2×5) 을 기준으로 행렬 곱셈을 수행하고, 첫 번째 차원인 3은 그대로 유지됩니다. 즉, 각 배치(3개)에 대해 독립적으로 행렬 곱셈이 수행됩니다.
만약 두 텐서가 배치 크기가 다르면 브로드캐스팅 규칙에 따라 PyTorch가 자동으로 크기를 맞춰 연산을 수행할 수도 있습니다.
예시: 만약 tensor_3d_c가 (1, 4, 2), tensor_3d_d가 (3, 2, 5)라면, PyTorch는 tensor_3d_c를 (3, 4, 2)로 브로드캐스트하여 연산을 수행합니다.
'Python > Deep Learning' 카테고리의 다른 글
| [PyTorch] 경사하강법 코드예제 (0) | 2025.02.11 |
|---|---|
| [딥러닝] 경사하강법을 사용한 신경망 학습법 (0) | 2025.02.10 |
| [딥러닝] PyTorch에서 Tensor 개념 (0) | 2025.02.05 |
| 딥러닝 발전과정,RNN (0) | 2025.02.03 |
| Llama 코드예시, 최적화 (2) | 2025.01.27 |