1. 여러 종류의 텐서 만들기
실전에서 자주 사용하는 Tensor 선언
1. 초기화 되지 않은 tensor : torch.empty(n,n)
2. 무작위 초기화 tensor : torch.rand(n,n)
3. 0으로 이루어진 tensor : torch.zeros(n,n)
4. 1로만 이루어진 tensor : tensor.ones(n,n)
5. 입력 받은 값으로 만드는 tensor : torch.tensor([a,b,c])
6. 가우시안 분포를 따르는 tensor : torch.randn(n,n)
7.주어진 텐서와 같은 크기의 무작위 tensor : torch.randn_like(x)
데이터 타입을 명시하고 싶다면 dtype=torch.<datatype> 를 붙여주자!
tensor가 가지는 성질들 확인하기
x = torch.rand(2,2, dtype=torch.float16) #임의의 텐서 선언, 데이터 타입 선언
print(x.dtype) #데이터 타입 확인하기
print(x.size()) #텐서의 사이즈 확인하기
Python
복사
GPU를 이용하여 Tensor 만들기
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(device)
# GPU tensor 방법 1
x_gpu1 = torch.ones_like(x1, device=device)
print(x_gpu)
# GPU tensor 방법 2
x_gpu2 = x2.to(device)
print(x_gpu2)
result = x_gpu1 + x_gpu2
print(result) # GPU tensor 끼리의 연산이므로 결과 또한 GPU tensor이다.
print(result.to('cpu', torch.int)) # cpu tensor로 변환
Python
복사
Numpy Array Pytorch Tensor 전환 하기
b = a.numpy() : tensor를 array로 변경한다.
b = torch.from_numpy(a) : array를 tensor로 변경한다.
GPU 단에서 생성된 텐서는 .numpy() 를 통해 array로 변경하지 못한다. 따라서 .to('cpu') 를 통해 cpu로 변경 한 뒤 변환해 주어야 한다.
다차원 tensor 만들기
# []의 개수를 통해 몇 차원 tensor인지 유추가 가능하다.
t0 = torch.tensor(1)
t1 = torch.tensor([1,2,3]) # 1d
t2 = torch.tensor([[1,2],[3,4]]) # 2d
t3 = torch.tensor([[[1,2],[3,4],[5,6]], [[1,2],[3,4],[5,6]]]) # 3d
print(t2.ndim) # 축의 개수 나타낸다
Python
복사
2. Tensor를 이용해 연산하기 (Operation)
기본 사칙 연산 + 내적, SVD
1. Addition
•
z = x + y
•
z = torch.add(x,y)
•
y.add_(x)
2. Subtraction
•
z = x - y
•
z = torch.sub(x,y)
•
z = x.sub(y)
3. Multiplication
•
z = x * y
•
z = torch.mul(x,y)
•
z = x.mul(y)
5. Dot Product
•
z = torch.matmul(x,y)
•
z = torch.mm(x,y)
4. Division
•
z = x / y
•
z = torch.div(x,y)
•
z = x.div(y)
6. SVD
•
z = torch.svd(x)
자주 쓰이는 수학 연산 (1)
import math
a = torch.rand(1,2)
print(torch.abs(a)) # 절대값
print(torch.ceil(a)) # 올림
print(torch.floor(a)) # 내림
print(torch.round(a)) # 반올림
print(torch.clamp(a, -0.5, 0.5)) #구간 사이의 값으로 만든다!
Python
복사
자주 쓰이는 수학 연산 (2)
a = torch.rand(1,2)
print(torch.min(a)) # 최솟값
print(torch.max(a)) # 최대값
print(torch.mean(a)) # 평균
print(torch.std(a)) # 표준편차
print(torch.prod(a)) # 전체 곱셈
Python
복사
행, 열 사이의 원소 비교하기
x = torch.rand(2,2)
# 같은 행 또는 열에 있는 원소들을 비교하고
# 해당하는 원소의 index를 표시한다.
print(x.max(dim=0)) # 같은 col끼리 비교
print(x.max(dim=1)) # 같은 row끼리 비교
print(x.min(dim=0)) # 같은 col끼리 비교
print(x.min(dim=1)) # 같은 row끼리 비교
Python
복사
3. Tensor 조작하기 (Manipulation)
indexing을 통해 원소 접근하기
x = torch.tensor([[1,2],[3,4]])
print(x)
print(x[0,0]) # 행렬의 (0,0) 원소에 접근
print(x[0,1])
print(x[1,0])
print(x[1,1])
print(x[:,0])
print(x[:,1])
print(x[0,:])
print(x[1,:])
Python
복사
stack, cat, chunk, split,
tensor 모양 변환하기
view(), reshape() 둘 중 하나를 사용하면 되는데, 일반적으로 reshape()를 주로 사용한다!
x = torch.randn(4, 4) # 4 by 4 사이즈의 텐서 생성
v1 = x.view(16) # 16 사이즈의 텐서 생성
v2 = x.view(-1, 8) # 2 by 8 사이즈의 텐서 생성
r1 = x.reshape(16) # 16 사이즈의 텐서 생성
r2 = x.view(-1, 8) # 2 by 8 사이즈의 텐서 생성
Python
복사
tensor 차원 축소/확장하기
squeeze() 함수를 이용하면 tensor의 차원 중에서 1인 것을 축소 할 수 있습니다.
torch.squeeze(input, dim) 의 형태로 사용하며 축소하고 싶은 차원의 index를 dim에 넣는다.
input.squeeze(dim) 의 형태로도 사용할 수 있다.
x = torch.randn(1,5,5,7,1)
s1 = torch.squeeze(x,0)
print(s1.shape)
s2 = torch.squeeze(x,4)
print(s2.shape)
Python
복사
unsqueeze() 함수를 이용하면 주어진 tensor에 임의로 1의 차원을 확장할수 있습니다.
torch.unsqueeze(input, dim) 의 형태로 사용하며 확장하고 싶은 차원의 index를 dim에 넣는다.
input.unsqueeze(dim) 의 형태로도 사용할 수 있다.
x = torch.randn(3,3)
u1 = torch.unsqueeze(x,0)
print(u1.shape)
u2 = torch.unsqueeze(x,1)
print(u2.shape)
u3 = torch.unsqueeze(x,2)
print(u3.shape)
Python
복사
tensor를 이어붙이기
주어지는 두 개의 tensor를 concatenate하기 위해 사용하는 함수는 두 가지가 있다.
바로 cat() 과 stack() 이다.
torch.cat((x,y,z), dim) 함수를 이용하면 원하는 차원 방향으로 텐서를 쌓는다.
x = torch.FloatTensor([1,4])
y = torch.FloatTensor([2,5])
z = torch.FloatTensor([3,6])
a = torch.cat([x,y,z], dim = 0)
print(a)
a = torch.cat([x,y,z], dim = 1)
print(a)
Python
복사
tensor 자르기
Tensor를 임의의 숫자의 개수로 나누는 기능이다. 이를 위해서 split() 과 chunk() 를 사용한다.
torch.chunk(tensor, chunks, dim=0) 또는 torch.split(tensor,split_size,dim=0) 를 이용한다.
x = torch.randn(4,3)
x_01, x_02 = torch.chunk(x, 2, dim=0)
x_11, x_12 = torch.chunk(x,2,dim=1)
Python
복사