Linear Algebra
🙇‍♀️

Tensor Operation 살펴보기

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
복사