3. 텐서의 연산

jaeyun·2021년 1월 22일
0

파이토치 기초

목록 보기
3/8
post-thumbnail

이번에는 정의한 텐서의 연산에 대해서 설명하겠습니다.

텐서는 list, numpy처럼 사칙연산, 수학 함수, 선형 대수 계산 등이 가능합니다. 특히 대규모 데이터를 처리할 때, 이전보다 훨씬 빠른 속도로 연산할 수 있습니다.

텐서의 연산

텐서의 연산을 들어가기 앞서, 먼저 사용할 텐서를 정의하겠습니다.

x1 = torch.rand(3,3)
x2 = torch.rand(3,3)

(1) 텐서의 덧셈

x3 = x1 + x2

(2) 텐서의 뺄셈

x4 = x1 - x2

(3) 텐서의 곱셈

torch.mm을 사용해서 텐서를 곱합니다. 행렬의 곱이기 때문에 앞의 텐서 열과 뒤의 텐서 행이 같아야 합니다. 즉 x1는 (3,5), x2는(5,4) 여야 곱이 가능합니다. 만약 x2가 (7,7)일 경우 곱셈 연산이 불가능 합니다.

x5 = torch.mm(x1,x2)

(4) 텐서의 나눗셈

torch.div를 사용하여 연산해줍니다.


x6 = torch.div(x1,x2)

(5) 텐서 전체의 합

torch.sum을 사용하여 텐서 전체의 합을 구해줍니다.

x15 = torch.sum(x1)

(6) 텐서의 평균

torch.mean을 사용하여 텐서의 평균을 구해줍니다.

x16 = torch.mean(x1)

텐서의 차원 변경

(1) 차원 늘리기(unsqueeze)

torch.unsqueeze를 사용합니다. torch.unsqueeze(x1,0)은 x1텐서의 0차원을 늘린다는 뜻으로, [3,5]크기의 텐서를 [1,3,5]로 만들어 줍니다. 만약 torch.unsqueeze(x1,1)의 경우라면 [3,1,5]가 됩니다.

x7 = torch.unsqueeze(x1,0)

(2) 차원 줄이기(squeeze)

위와는 반대로 torch.squeeze를 사용하여 차원을 줄여줍니다. 위에서 정의한 텐서를 반대로 줄여봅시다.

torch.squeeze(x7)는 [3,1,5] 또는 [1,3,5]였던 차원을 [3,5]로 줄여줍니다.

x8 = torch.squeeze(x7)

(3) 차원 변경(view)

이번에는 차원을 줄일수도, 늘릴수도 있는 방법입니다. x1.view를 사용합니다. x1는 적용시킬 텐서를 뜻합니다. x1.view(9)는 x1를 차원이 1개인 9개의 텐서로 나타낸다는것을 뜻합니다.

x9 = x1.view(9)

(4) 차원 변경(transpose)

transpose함수는 사용하면 지정한 차원 간의 크기를 바꿔주면서 텐서의 모양이 변합니다. tensor_example.transpose(0,1)는 tensor_example의 첫번째(0번째 인덱스), 두번째(1번째 인덱스)의 차원이 변경됩니다. 즉, [4,5]였던 차원이 [5,4]로 변경됩니다.

tensor_example = torch.rand(4,5)
x10 = tensor_example.transpose(0,1)

텐서의 최대, 최소 찾기

(1) 텐서의 최소값 찾기(min, argmin)

torch.min을 사용하여 최소값을 찾고, torch.argmin을 사용하여 최소값의 위치를 찾을 수 있습니다.

x11 = torch.min(x1)
min_location = torch.argmin(x1)

(2) 텐서의 최대값 찾기(max, argmax)

torch.max를 사용하여 최대값을 찾고, torch.argmax를 사용하여 최대값의 위치를 찾을 수 있습니다.

x12 = torch.max(x1)
max_location = torch.argmax(x1)

텐서의 붙이기

(1) 텐서를 이어붙이기(cat)

텐서를 이어붙이는 concatenate의 줄임말로, torch.cat함수를 사용합니다. torch.cat([x1,x2],dim = 0)는 첫번 째 차원을 기준으로 x1와 x2를 합치는 것을 뜻합니다.

예를 들어 x1, x2의 크기가 [2,3]일때 torch.cat([x1,x2], dim = 0)이면, 첫번째 인덱스 자리에 텐서를 이어붙여 위의 그림과 같이 [4,3]인 텐서가 완성됩니다.

x13 = torch.cat([x1,x2],dim = 0)

(2) 텐서 쌓기(stack)

stack은 지정된 차원을 unsqueeze한 다음 일련의 텐서를 concatenate하게 됩니다. torch.stack([x1,x2], dim = 0)는 첫 번째 차원을 기준으로 텐서를 stack합니다.

예를 들어 x1, x2의 크기가 [2,3]일때 torch.stack([x1,x2], dim = 0)이면, 두 텐서 x1, x2를 각각 torch.unsqueeze(x1,0), torch.unsqueeze(x2,0)한 뒤, torch.cat([x1,x2],dim = 0)것과 같습니다. 즉, 결과로는 [2,2,3]이 됩니다.

x14 = torch.stack([x1,x2],dim = 0)

profile
벨로그에서는 인공지능 관련 포스팅만 합니다! 더 많은 정보는 소개를 참고해주세요!

0개의 댓글