01. 데이터 생성 및 확인
- 스칼라 : 하나의 숫자
- 벡터 : 숫자와 방향
- 행렬 : 2차워 숫자 배열
- 텐서 : n-차원 숫자 배열
# 스칼라 생성
scalar = torch.tensor(7)
# 스칼라의 값 확인
print(scalar.item())
# 벡터 생성
tensor = torch.tensor([3, 4])
tensor_ex = torch.tensor([3.0, 6.0, 9.0],
dtype=None, # 텐서의 타입 설정 ( 데이터의 정확도 표현 )
device=None, # cpu와 cuda 설정 가능 / 다른 device끼리 연산하면 에러 발생
requires_grad=False) # gradient를 추적 설정
print(tensor)
tensor.shape # 텐서의 사이즈
tensor.ndim # 텐서의 차원
tensor.dtype # 텐서의 데이터 타입
tensor.device # 텐서의 연산 디바이스
# numpy 와 동일
zero_to_ten = torch.arange(start=0, end=10, step=1)
02. 랜덤, 영행렬, 일행렬
# 랜덤
rand_tensor = torch.rand(4, 4)
rand_img_tensor = torch.rand(size=(3, 244, 244)) # col, height, width
torch.manual_seed(0) # 랜덤 시드 설정
# 영행렬
zeros = torch.zeros(size=(3, 4))
ten_zeros = torch.zeros_like(input=zero_to_ten)
# 일행렬
ones = torch.ones(size=(3, 4))
ten_ones = torch.ones_like(input=zero_to_ten)
03. 타입 설정, 변환
# 타입 설정
tensor = torch.tensor([3.0, 6.0, 9.0], dtype=torch.float16) # 텐서의 타입 설정
# 타입 변환
tensor.type(torch.float64)
04. 연산 방법
# 단순 연산
tensor = torch.tensor([1, 2, 3])
tensor + 5, tensor - 5, tensor * 5, tensor / 4
"""
출력 결과
(tensor([6, 7, 8]),
tensor([-4, -3, -2]),
tensor([5, 10, 15]),
tensor([0.2500, 0.5000, 0.7500]))
"""
# tensor 연산은 numpy 와 동일
tensor * tensor # tensor([1, 2, 3])
"""
출력 결과
tensor([1, 4, 9])
"""
# 연산 메소드
torch.add(tensor, 10)
torch.subtract(tensor, 10)
torch.multiply(tensor, 10)
torch.divide(tensor, 10)
05. 행렬곱과 조건
# 행렬곱 연산자
tensor @ tensor
# 행렬곱 메소드
torch.matmul(tensor, tensor)
# 행렬곱 수작업
value = 0
for i in range(len(tensor)):
value += tensor[i] * tensor[i]
"""
행렬곱이 가능한 조건
- torch.Size([A, B]) @ torch.Size([B, C])
- 행렬곱을 할 때 B가 동일해야 한다.
- A와 C는 행렬곱의 결과의 size 가 된다. AxC
"""
06. 집계 메소드
# tensor 의 메소드
x.min()
x.max()
x.sum()
x.type(torch.float32).mean()
x.argmin()
x.argmax()
# torch의 메소드
torch.max(x)
torch.min(x)
torch.mean(x.type(torch.float32))
torch.sum(x)
07. shape, ndim 변형
Method |
One-line description |
torch.reshape(input, shape) |
size를 곱한 값의 약수만 reshape를 통해 shape를 바꿀 수 있다. |
torch.Tensor.view(shape) |
기존의 참조된 순서를 유지하며 형 변환. 인덱싱을 통해 값을 바꾸면 의도와 다르게 바뀔 수 있다. |
torch.stack(tensors, dim=0) |
Concatenate 를 axis 에 따라서 할 수 있다. 단 주어지는 tensor의 size가 같아야 한다. |
torch.squeeze(input) |
입력받은 tensor의 차원의 값이 1인 것을 제거 |
torch.unsqueeze(input, dim) |
1개의 1인 차원을 추가한 tensor 를 반환 |
torch.permute(input, dims) |
원하는 index 순서를 주어서 재배영한 tensor를 반환 |
08. 인덱싱은 numpy, pandas 와 상이
09. numpy 호환 방식
# numpy 기본 타입 = float64
# pytorch 기본 타입 = float32
array = np.arange(1.0, 8.0)
# tensor 로 변환
tensor = torch.from_numpy(array) # 메모리 복사, dtype=float64
# ndarray 로 변환
array = torch.arange(1.0, 8.0, 1.0)
numpy_array = tensor.numpy() # dtype=float32
10. GPU 설정
# 그래픽카드 확인
!nvidia-smi
# 쿠다 사용가능여부 확인
torch.cuda.is_available()
# 쿠다 사용가능한 개수 확인
torch.cuda.device_count()
# 디바이스 변수 설정
device = 'cuda' if torch.cuda.is_available() else "cpu"
# 텐서의 디바이스 확인
tensor.device
# 특정 device로 설정 변경
tensor = tensor.to(device)
# device 를 cuda에서 cpu로 변경 및 ndarray로 변경
tensor_on_gpu.cpu().numpy()
댓글