이 글은 PyTorch를 이용한 딥러닝 개발 시에 Tensor 연산에 대한 내용을 빠르게 참조하기 위해 정리한 글입니다.
#1. 난수값으로 구성된 2×3 텐서 생성
import torch x = torch.rand(2,3) print(x)
#2. 정규분포 난수값으로 구성된 2×3 텐서 생성
import torch x = torch.randn(2,3) print(x)
#3. [0,10) 까지의 정수형 난수값으로 구성된 2×3 텐서 생성
import torch x = torch.randint(0,10,size=(2,3)) print(x)
#4. 0으로 채워진 2×3 텐서 생성
import torch x = torch.zeros(2,3) print(x)
#5. 다른 텐서의 형상과 동일한 Zero 텐서 생성하기
import torch ref = torch.rand(2,3) x = torch.zeros_like(ref) print(x)
#6. 1로 채워진 2×3 텐서 생성하기
import torch x = torch.ones(2,3) print(x)
#7. 다른 텐서의 형상과 동일한 1값으로 구성된 텐서 생성하기
import torch ref = torch.rand(2,3) x = torch.ones_like(ref) print(x)
#8. 텐서의 타입 얻기
import torch x = torch.rand(2,3) print(x.type()) # torch.FloatTensor print(type(x)) #
#9. 요소값을 정수형 값으로 변환한 텐서 생성하기
import torch x = torch.rand(2,3) + 1.5 int_x = x.type(dtype=torch.IntTensor) print(int_x)
#10. 넘파이 배열로부터 텐서 만들기, 텐서로부터 넘파이 배열 만들기
import torch import numpy as np x1 = np.ndarray(shape=(2,3), dtype=int, buffer=np.array([1,2,3,4,5,6])) x2 = torch.from_numpy(x1) print(x2, x2.type()) x3 = x2.numpy() print(x3)
#11. 요소값 배열을 통해 실수형 텐서 만들기
import torch x = torch.FloatTensor([[1,2,3],[4,5,6]]) print(x)
#12. 텐서를 GPU에, 또는 CPU로 옮기기
import torch x = torch.FloatTensor([[1,2,3],[4,5,6]]) cpu = torch.device('cpu') gpu = torch.device('cuda') if torch.cuda.is_available(): x_gpu = x.to(gpu) print(x_gpu) x_cpu = x_gpu.to(cpu) print(x_cpu)
#13. 텐서의 크기
import torch x = torch.FloatTensor(2,3,4,4) print(x.size()) # torch.Size([2, 3, 4, 4]) print(x.size()[1:2]) torch.Size([3])
#14. 텐서의 요소값 접근
import torch x = torch.randn(4,3) print(x) ''' output: tensor([[ 0.1477, 0.4707, -0.7333], [ 0.8718, 0.1213, 0.6299], [ 0.2991, 1.1437, -0.7631], [ 1.3319, 0.8322, -2.4153]]) ''' print(x[1:3,:]) ''' output: tensor([[ 0.8718, 0.1213, 0.6299], [ 0.2991, 1.1437, -0.7631]]) '''
#15. 인덱스값으로 지정된 요소값으로 구성된 새로운 텐서 생성하기(값 복사됨)
import torch x = torch.randn(4,3) print(x) '''output: tensor([[-0.1728, 0.0887, -0.0186], [ 0.9492, -0.0452, 0.5660], [-0.4184, -0.2162, 1.0297], [-0.5110, 0.2452, 1.0734]]) ''' selected = torch.index_select(x,dim=1,index=torch.LongTensor([0,2])) print(selected) '''output: tensor([[-0.1728, -0.0186], [ 0.9492, 0.5660], [-0.4184, 1.0297], [-0.5110, 1.0734]]) '''
#16. 마스크 텐서로 새로운 텐서 생성하기
import torch x = torch.randn(2,3) print(x) '''output: tensor([[ 0.1622, 1.1205, -0.4761], [ 0.9225, 0.2151, 0.2192]]) ''' mask = torch.BoolTensor([[False, False, True],[False,True,False]]) out = torch.masked_select(x, mask) print(out) '''output: tensor([-0.4761, 0.2151]) '''
#17. 2개의 텐서 결합하기
import torch x = torch.FloatTensor([[1,2,3],[4,5,6]]) y = torch.FloatTensor([[-1,-2,-3],[-4,-5,-6]]) z1 = torch.cat([x,y], dim=0) print(z1) ''' tensor([[ 1., 2., 3.], [ 4., 5., 6.], [-1., -2., -3.], [-4., -5., -6.]]) ''' z2 = torch.cat([x,y], dim=1) print(z2) ''' tensor([[ 1., 2., 3., -1., -2., -3.], [ 4., 5., 6., -4., -5., -6.]]) '''
#18. 2개의 텐서 결합하기(stack 함수)
import torch x = torch.FloatTensor([[1,2,3],[4,5,6]]) x_stack = torch.stack([x,x,x,x],dim=0) print(x_stack) ''' tensor([[[1., 2., 3.], [4., 5., 6.]], [[1., 2., 3.], [4., 5., 6.]], [[1., 2., 3.], [4., 5., 6.]], [[1., 2., 3.], [4., 5., 6.]]]) ''' y_stack = torch.stack([x,x,x,x],dim=1) print(y_stack) ''' tensor([[[1., 2., 3.], [1., 2., 3.], [1., 2., 3.], [1., 2., 3.]], [[4., 5., 6.], [4., 5., 6.], [4., 5., 6.], [4., 5., 6.]]]) '''
#19. 하나의 텐서를 n개로 분해하기
import torch z1 = torch.FloatTensor([ [ 1., 2., 3.], [ 4., 5., 6.], [-1., -2., -3.], [-4., -5., -6.] ]) x_1,x_2 = torch.chunk(z1,2,dim=0) print(x_1,x_2,sep='\n') ''' tensor([[1., 2., 3.], [4., 5., 6.]]) tensor([[-1., -2., -3.], [-4., -5., -6.]]) ''' y_1,y_2 = torch.chunk(z1,2,dim=1) print(y_1,y_2,sep='\n') ''' tensor([[ 1., 2.], [ 4., 5.], [-1., -2.], [-4., -5.]]) tensor([[ 3.], [ 6.], [-3.], [-6.]]) '''
#20. 하나의 텐서를 분리하기
import torch z1 = torch.FloatTensor([ [ 1., 2., 3.], [ 4., 5., 6.], [-1., -2., -3.], [-4., -5., -6.] ]) x1,x2 = torch.split(z1,2,dim=0) print(x1,x2,sep='\n') ''' tensor([[1., 2., 3.], [4., 5., 6.]]) tensor([[-1., -2., -3.], [-4., -5., -6.]]) ''' y1,y2 = torch.split(z1,2,dim=1) print(y1,y2,sep='\n') ''' tensor([[ 1., 2.], [ 4., 5.], [-1., -2.], [-4., -5.]]) tensor([[ 3.], [ 6.], [-3.], [-6.]]) ''' y = torch.split(z1,2,dim=1) for i in y: print(i) ''' tensor([[ 1., 2.], [ 4., 5.], [-1., -2.], [-4., -5.]]) tensor([[ 3.], [ 6.], [-3.], [-6.]]) '''
#21. 1개 요소를 갖는 축 제거
import torch x1 = torch.FloatTensor(10,1,3,1,4) x2 = torch.squeeze(x1) print(x1.size(),x2.size()) # torch.Size([10, 1, 3, 1, 4]) torch.Size([10, 3, 4])
#22. unsqueeze 연산
import torch x1 = torch.FloatTensor(10,3,4) x2 = torch.unsqueeze(x1, dim=0) print(x1.size(),x2.size()) # torch.Size([10, 3, 4]) torch.Size([1, 10, 3, 4]) x3 = torch.unsqueeze(x1, dim=1) print(x1.size(),x3.size()) # torch.Size([10, 3, 4]) torch.Size([10, 1, 3, 4])
#23. 다양한 분포를 갖는 텐서 만들기
import torch import torch.nn.init as init x1 = init.uniform_(torch.FloatTensor(3,4),a=0,b=9) print(x1) x2 = init.normal_(torch.FloatTensor(3,4),std=0.2) print(x2) x3 = init.constant_(torch.FloatTensor(3,4),3.1415926) print(x3)
#24. 텐서간의 합
import torch x1 = torch.FloatTensor([[1,2,3],[4,5,6]]) x2 = torch.FloatTensor([[1,2,3],[4,5,6]]) add1 = torch.add(x1,x2) print(add1) add2 = x1+x2 print(add2)
#25. 텐서의 브로드케스트 합
import torch x1 = torch.FloatTensor([[1,2,3],[4,5,6]]) x2 = x1 + 10 print(x2)
#26. 텐서 요소간의 곱
import torch x1 = torch.FloatTensor([[1,2,3],[4,5,6]]) x2 = torch.FloatTensor([[1,2,3],[4,5,6]]) x3 = torch.mul(x1,x2) print(x3) ''' tensor([[ 1., 4., 9.], [16., 25., 36.]]) ''' x4 = x1*x2 print(x4) ''' tensor([[ 1., 4., 9.], [16., 25., 36.]]) '''
#27. 텐서 요소간의 나누기
import torch x1 = torch.FloatTensor([[1,2,3],[4,5,6]]) x2 = torch.FloatTensor([[1,2,3],[4,5,6]]) x3 = torch.div(x1,x2) print(x3) ''' tensor([[1., 1., 1.], [1., 1., 1.]]) ''' x4 = x1/x2 print(x4) ''' tensor([[1., 1., 1.], [1., 1., 1.]]) '''
#28. 텐서 요소의 제곱
import torch x1 = torch.FloatTensor([[1,2,3],[4,5,6]]) x2 = torch.pow(x1,2) print(x2) ''' tensor([[ 1., 4., 9.], [16., 25., 36.]]) ''' x3 = x1**2 print(x3) ''' tensor([[ 1., 4., 9.], [16., 25., 36.]]) '''
#29. 텐서 요소의 지수 연산
import torch x1 = torch.FloatTensor([[1,2,3],[4,5,6]]) x2 = torch.exp(x1) print(x2)
#30. 텐서 요소의 로그 연산
import torch x1 = torch.FloatTensor([[1,2,3],[4,5,6]]) x2 = torch.log(x1) print(x2)
#31. 행렬곱
import torch x1 = torch.FloatTensor([[1,2,3],[4,5,6]]) x2 = torch.FloatTensor([[1,2,3],[4,5,6],[7,8,9]]) x3 = torch.mm(x1,x2) print(x3) ''' tensor([[30., 36., 42.], [66., 81., 96.]]) '''
#32. 배치 행렬곱 연산(맨 앞에 batch 차원은 유지하면서 뒤에 요소들의 행렬곱)
import torch x1 = torch.FloatTensor([ [[1,2,3],[4,5,6]], [[1,2,3],[4,5,6]], ]) x2 = torch.FloatTensor([ [[1,2,3],[4,5,6],[7,8,9]], [[1,2,3],[4,5,6],[7,8,9]], ]) x3 = torch.bmm(x1,x2) print(x3) ''' tensor([[[30., 36., 42.], [66., 81., 96.]], [[30., 36., 42.], [66., 81., 96.]]]) '''
#33. 벡터의 내적
import torch x1 = torch.tensor([1,2,3,4]) x2 = torch.tensor([2,3,4,5]) x3 = torch.dot(x1,x2) print(x3) # tensor(40)
#34. 텐서의 전치
import torch x1 = torch.tensor([[1,2,3],[4,5,6],[7,8,9]]) print(x1) x2 = x1.t() print(x2)
#35. 텐서의 내부 차원 간 바꿈
import torch hwc_img_data = torch.rand(100, 64, 32, 3) print(hwc_img_data.size()) # torch.Size([100, 64, 32, 3]) chw_img_data = hwc_img_data.transpose(1,2) print(chw_img_data.size()) # torch.Size([100, 32, 64, 3]) chw_img_data = chw_img_data.transpose(1,3) print(chw_img_data.size()) # torch.Size([100, 3, 64, 32])
#36. 벡터의 내적, 행렬과 벡터의 곱, 행렬간 곱
import torch m = torch.randn(100,10) v = torch.randn(10) d = torch.matmul(v,v) # = torch.dot, 벡터의 내적 print(d) v2 = torch.matmul(m,v) # = torch.mv, 행렬과 벡터의 곱 print(v2) m2 = torch.matmul(m.t(), m) # = torch.mm, 행렬 곱 print(m2)
#37. 다항분포 확률값 기반의 샘플링
import torch x1 = torch.FloatTensor( [ [1,2,3,4,5,6,7,8,9], [9,8,7,6,5,4,3,2,1], [1,2,3,4,5,6,7,8,9], [9,8,7,6,5,4,3,2,1] ] ) i = torch.multinomial(x1.exp(), 1) print(i) ''' output: tensor([[8], [0], [7], [1]]) '''
torch.multinomial 함수는 2개의 인자를 받는데, 첫번째 인자는 확률로 해석될 수 있는 텐서이고 두번째는 샘플링할 개수이다. 첫번째 인자는 확률로 해석할 수 있지만, 정규화될 필요는 없다. 여기서 정규화란 더해서 1이 되어야 한다는 의미이다. 결과에서 보면 알 수 있듯이 샘플링된 값의 인덱스 값이 반환된다.
#38. 상위 n개 가져오기
import torch x = torch.rand(10) print(x) # tensor([0.9097, 0.3766, 0.6321, 0.0760, 0.0137, 0.1760, 0.0655, 0.7696, 0.5172, 0.4140]) scores, indices = torch.topk(x, 3) for i in range(0,3): print(indices[i].item(), scores[i].item()) '''output: 0 0.909696102142334 7 0.769554853439331 2 0.6320836544036865 '''