이상한 pytorch6: 차원과 합

ddang ddang ball·2022년 11월 8일
0

파이토치

목록 보기
6/6
post-thumbnail

오늘은 기본적인 파이토치를 다뤄볼 것이다.
그중에서 "덧셈"을 다뤄볼 것이다.

우선 3*3*3의 3차원 행렬을 만들어보자.

기본

a = torch.arange(1, 28).reshape(3, 3, 3)

이걸로 1부터 27까지의 행렬을 (3, 3, 3)의 형태로 바꿀 수 있었다.

1개의 리스트의 3개의 원소가 있고, 1개의 뭉탱이에는 3개의 리스트가 있고
이런 뭉탱이가 3개나 있다는 뜻이다.

부연 설명을 위해 그림을 그려봤다.
3차원이란 초록색인 3개의 뭉탱이를 가지고 있으며
이 초록색에는 3개의 파란 리스트가 있다.
그리고 파란리스트 1개당 3개의 노랑으로 구성되어있다.

여기서 torch.sum(a)를 한다면?
tensor(378)가 나온다. 1부터 27까지 모두 더한 값이 나온다.

여기서 중요한 점은 우리는 차원을 조작하면서 합을 구할 수 있다.

차원 조작

torch.sum(대상, 차원)이런식으로 지정할 수 있다.
3차원이라서 차원 인덱스는 0, 1, 2로 구성되어 있다.

dim = 0

우선 차원 인덱스를 0으로 지정해보자.

torch.sum(a, dim = 0)

상상도 못한 값이 나왔다. 이건 어떻게 더해진 걸까?
자세히 살펴보면
0번째 원소의 경우

0번 뭉탱이의 0번째 리스트의 0번 원소 +
1번 뭉탱이의 0번째 리스트의 0번 원소 +
2번 뭉탱이의 0번째 리스트의 0번 원소

이런식으로 더해지게 된다.

dim = 0인 경우 서로 다른 뭉탱이에서 같은 위치에 존재하는 원소끼리 더해지게 된다.

0번째원소

1+10+19 = 30으로 나온다.

1번째원소

2+11+20 = 33이 나온다.

2번째원소

3+12+21로 36이 나온다. (아주 좋다.)

3번째원소

4+13+22=39가 나온다.

이런식으로 노란색 칠한 것들끼리 더해지게 된다.

요약

dim = 1

torch.sum(a, dim = 1)

이번에는 dim = 1인 경우이다.

왜 이렇게 나올까? 생각해보면 dim = 0인경우 다른 뭉탱이, 같은 리스트위치, 같은 원소위치임을 생각해본다.
같은 뭉탱이, 다른 리스트의 위치, 같은 원소위치임을 생각할 수 있다.

확인해보자

이런식으로 더하면 1+4+7해서 12가 나온다.

1번째의 경우

이렇게 2+5+8로 15가 나온다. 아주 좋다!

그럼 4번째는요??

11+14+17 = 42가 나온다. 맞다!!

요약

dim = 2인 경우

torch.sum(a, dim = 2)

이건 같은 뭉탱이위치, 같은 리스트위치, 다른 원소위치끼리 합을 더하는 것을 알 수 있다.

0번째

1번째

2번째

이런식으로 9번 더해진다.

요약

1번만 더하고 끝내게?

dim은 2개이상 정할 수 있다!!!

예를 들어 torch.sum(a, dim = (0, 1))이런 식이다!!

torch.sum(a, dim = (0, 1))

이게 뭐에요...?

117이랑 126이랑 135는 어디서 나왔어요...?

일단

torch.sum(a, dim = 0)

의 결과값을 살펴보자

여기서 자세히 살펴보면, 30+39+48을 하면 117이 나오는 것을 볼 수 있다!

126은 33+42+51을 하여 나왔다.

0번째 117이 나오는 과정

1번째

2번째

방금은 세로끼리 더하여 값이 나왔다.
그럼 만약에 저상태에서 세로가 아닌 가로끼리 더하고 싶으면 어떻게 할까??

torch.sum(a, dim = (0, 2))

1에서 2로 바꾸면 된다!

0번째의 경우

30+33+36 =99 99가 나왔다.

1번째 원소는?

39+42+45로 126이 나왔다. 아주 좋다!

그렇다!

torch.sum(a, dim = (0, 2))

이 경우에는
우선

torch.sum(a, dim = 0)

을 적용한 다음 그 상태에서
2의 방향으로 합친다고 생각하면 될거 같다!

참고로

torch.sum(a, dim = (1, 0))
torch.sum(a, dim = (0, 1))


이 2개의 코드는 모두 같은 결과값을 만든다!

+차원을 다루는 연산은 sum이외에도 mean, min, max를 할 때에도 적용된다. 심지어 소프트맥스에서도 차원을 다룰줄 알아야한다. 조만간 소프트맥스와 차원으로 돌아오겠다.

profile
배우고 싶은것은 많으나 용두사미인 사람.

0개의 댓글