이 글은 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
'''






