오늘은 기본적인 파이토치를 다뤄볼 것이다.
그중에서 "덧셈"을 다뤄볼 것이다.
우선 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로 구성되어 있다.
우선 차원 인덱스를 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가 나온다.
이런식으로 노란색 칠한 것들끼리 더해지게 된다.
요약
torch.sum(a, dim = 1)
이번에는 dim = 1인 경우이다.
왜 이렇게 나올까? 생각해보면 dim = 0인경우 다른 뭉탱이, 같은 리스트위치, 같은 원소위치임을 생각해본다.
같은 뭉탱이, 다른 리스트의 위치, 같은 원소위치임을 생각할 수 있다.
확인해보자
이런식으로 더하면 1+4+7해서 12가 나온다.
1번째의 경우
이렇게 2+5+8로 15가 나온다. 아주 좋다!
그럼 4번째는요??
11+14+17 = 42가 나온다. 맞다!!
요약
torch.sum(a, dim = 2)
이건 같은 뭉탱이위치, 같은 리스트위치, 다른 원소위치끼리 합을 더하는 것을 알 수 있다.
0번째
1번째
2번째
이런식으로 9번 더해진다.
요약
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를 할 때에도 적용된다. 심지어 소프트맥스에서도 차원을 다룰줄 알아야한다. 조만간 소프트맥스와 차원으로 돌아오겠다.