기술나눔

pytorch의 축에 대한 이해

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

import torch
x = torch.arange(16).reshape(1,4,4)
print(x)
print('--------')
a = x.sum(axis = 1,keepdim=True)
a2 = x.sum(axis = 1,keepdim=False)
a3 = x.sum(axis = 0,keepdim=True)
a4 = x.sum(axis = 0,keepdim=False)
a5 = x.sum(axis = 2,keepdim=True)
print(a)
print(a2)
print('----------')
print(a3)
print(a4)
print(a5)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
 import torch
x = torch.arange(16).reshape(4,4)
print(x)
print('--------')
a = x.sum(axis = 1,keepdim=True)
a2 = x.sum(axis = 1,keepdim=False)
print(a)
print(a2)
print(x/a) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

이 두 가지 예를 결합하여 다양한 상황에서 축의 변화를 자세히 설명합니다.
PyTorch의 특정 축에 따른 텐서 및 합산에 대한 차원 연산을 이해하는 데는 약간의 시간이 걸립니다. 두 가지 예를 통해 이러한 작업을 단계별로 분석하고 다양한 상황에서 축 변경을 자세히 설명하겠습니다.

첫 번째 예

import torch
x = torch.arange(16).reshape(1, 4, 4)
print(x)
print('--------')
a = x.sum(axis=1, keepdim=True)
a2 = x.sum(axis=1, keepdim=False)
a3 = x.sum(axis=0, keepdim=True)
a4 = x.sum(axis=0, keepdim=False)
a5 = x.sum(axis=2, keepdim=True)
print(a)
print(a2)
print('----------')
print(a3)
print(a4)
print(a5)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
초기 텐서
tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11],
         [12, 13, 14, 15]]])
  • 1
  • 2
  • 3
  • 4

이것은 의 모양이다 (1, 4, 4) 텐서의. 4x4 행렬을 포함하는 배치로 생각할 수 있습니다.

축 1을 따른 합계
  1. x.sum(axis=1, keepdim=True)

차원을 유지하면서 축 1(즉, 두 번째 차원의 방향인 4)을 따라 합산합니다.

tensor([[[24, 28, 32, 36]]])
  • 1

모양이 된다 (1, 1, 4)

  1. x.sum(axis=1, keepdim=False)

축 1을 따라 합산하며 차원은 유지되지 않습니다.

tensor([[24, 28, 32, 36]])
  • 1

모양이 된다 (1, 4)

축 0을 따른 합계
  1. x.sum(axis=0, keepdim=True)

차원을 유지하면서 축 0(즉, 첫 번째 차원의 방향, 1)을 따라 합산합니다.

tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11],
         [12, 13, 14, 15]]])
  • 1
  • 2
  • 3
  • 4

원본 텐서는 0번 축에 요소가 하나만 있기 때문에 결과는 원본 텐서와 동일하며 모양은 다음과 같습니다. (1, 4, 4)

  1. x.sum(axis=0, keepdim=False)

축 0을 따라 합산하면 차원이 유지되지 않습니다.

tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
  • 1
  • 2
  • 3
  • 4

모양이 된다 (4, 4)

축 2를 따른 합
  1. x.sum(axis=2, keepdim=True)

차원을 유지하면서 축 2(즉, 세 번째 차원, 4의 방향)를 따라 합산합니다.

tensor([[[ 6],
         [22],
         [38],
         [54]]])
  • 1
  • 2
  • 3
  • 4

모양이 된다 (1, 4, 1)

핵심
  • keepdim=True 합산된 차원은 유지되고 결과의 차원 수는 변경되지 않지만 합산된 차원의 크기는 1이 됩니다.
  • keepdim=False 합산된 차원이 제거되고 결과의 차원 수가 1만큼 감소합니다.

두 번째 예

import torch
x = torch.arange(16).reshape(4, 4)
print(x)
print('--------')
a = x.sum(axis=1, keepdim=True)
a2 = x.sum(axis=1, keepdim=False)
print(a)
print(a2)
print(x/a)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
초기 텐서
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
  • 1
  • 2
  • 3
  • 4

이것은 의 모양이다 (4, 4) 텐서의.

축 1을 따른 합계
  1. x.sum(axis=1, keepdim=True)

차원을 유지하면서 축 1(즉, 두 번째 차원의 방향인 4)을 따라 합산합니다.

tensor([[ 6],
        [22],
        [38],
        [54]])
  • 1
  • 2
  • 3
  • 4

모양이 된다 (4, 1)

  1. x.sum(axis=1, keepdim=False)

축 1을 따라 합산하며 차원은 유지되지 않습니다.

tensor([ 6, 22, 38, 54])
  • 1

모양이 된다 (4,)

행 합계로 나눈 요소
  1. x / a
tensor([[0.0000, 0.1667, 0.3333, 0.5000],
        [0.1818, 0.2273, 0.2727, 0.3182],
        [0.2105, 0.2368, 0.2632, 0.2895],
        [0.2222, 0.2407, 0.2593, 0.2778]])
  • 1
  • 2
  • 3
  • 4

이는 각 요소의 합계를 해당 행으로 나눈 결과입니다.

tensor([[ 0/6,  1/6,  2/6,  3/6],
        [ 4/22,  5/22,  6/22,  7/22],
        [ 8/38,  9/38, 10/38, 11/38],
        [12/54, 13/54, 14/54, 15/54]])
  • 1
  • 2
  • 3
  • 4

축 및 차원 변경 사항 요약

  • 축=0: 첫 번째 차원(행)을 따라 연산하고, 합산 후 다른 차원의 합이 남습니다.
  • 축=1: 2차원(열)을 따라 연산되며, 1차원과 3차원의 합이 합산된 후에 남습니다.
  • 축=2: 세 번째 차원(깊이)을 따라 작동하며 처음 두 차원의 합은 합산 후에 남습니다.

사용 keepdim=True 차원을 유지하면 합산된 차원은 1이 됩니다.사용keepdim=False 이면 합산된 차원이 제거됩니다.

의심:

reshape(1, 4, 4) 대신 행이 열에 있는 이유는 reshape(4, 4)가 행에 있는 경우에만 해당됩니까?

텐서 구조

먼저 기본 개념을 검토해 보겠습니다.

  • 2D 텐서(행렬): 행과 열이 있습니다.
  • 3D 텐서: 여러 개의 2차원 행렬로 구성되며 "깊이" 차원을 가진 행렬의 스택으로 간주할 수 있습니다.

예시 1: 2차원 텐서 (4, 4)

import torch
x = torch.arange(16).reshape(4, 4)
print(x)
  • 1
  • 2
  • 3

산출:

tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11],
        [12, 13, 14, 15]])
  • 1
  • 2
  • 3
  • 4

이 텐서의 모양은 다음과 같습니다. (4, 4)는 4x4 행렬을 나타냅니다.

  • 좋아요수평:

    • 라인 0: [ 0, 1, 2, 3]
    • 라인 1: [ 4, 5, 6, 7]
    • 2호선: [ 8, 9, 10, 11]
    • 3행: [12, 13, 14, 15]
  • 목록수직:

    • 열 0: [ 0, 4, 8, 12]
    • 열 1: [ 1, 5, 9, 13]
    • 열 2: [ 2, 6, 10, 14]
    • 열 3: [ 3, 7, 11, 15]

예시 2: 3차원 텐서 (1, 4, 4)

x = torch.arange(16).reshape(1, 4, 4)
print(x)
  • 1
  • 2

산출:

tensor([[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11],
         [12, 13, 14, 15]]])
  • 1
  • 2
  • 3
  • 4

이 텐서의 모양은 다음과 같습니다. (1, 4, 4)는 1x4x4 3차원 텐서를 나타냅니다.

  • 첫 번째 차원은 1, 배치 크기를 나타냅니다.
  • 두 번째 차원은 4는 행 수(행렬당 행)를 나타냅니다.
  • 세 번째 차원은 4는 열(각 행렬의 열) 수를 나타냅니다.

축에 따른 합에 대한 설명

축 1을 따른 합계(두 번째 차원)
  1. 2차원 텐서의 경우 (4, 4)
a = x.sum(axis=1, keepdim=True)
print(a)
  • 1
  • 2

산출:

tensor([[ 6],
        [22],
        [38],
        [54]])
  • 1
  • 2
  • 3
  • 4
  • 축 1은 행의 방향이며 각 행의 요소가 합산됩니다.
    • [0, 1, 2, 3] => 0+1+2+3 = 6
    • [4, 5, 6, 7] => 4+5+6+7 = 22
    • [8, 9, 10, 11] => 8+9+10+11 = 38
    • [12, 13, 14, 15] => 12+13+14+15 = 54
  1. 3차원 텐서의 경우 (1, 4, 4)
a = x.sum(axis=1, keepdim=True)
print(a)
  • 1
  • 2

산출:

tensor([[[24, 28, 32, 36]]])
  • 1
  • 축 1은 첫 번째 행렬의 행 방향입니다. 각 행의 요소를 합산합니다.
    • [0, 1, 2, 3] + [4, 5, 6, 7] + [8, 9, 10, 11] + [12, 13, 14, 15]
    • 열당 합계: 24 = 0+4+8+12, 28 = 1+5+9+13, 32 = 2+6+10+14, 36 = 3+7+11+15

"행이 열이 됩니다"처럼 보이는 이유는 무엇입니까?

존재하다 (1, 4, 4) 3차원 텐서에서는 첫 번째 차원이 배치 크기를 나타내기 때문에 각 4x4 행렬이 연산 시 여전히 2차원 방식으로 처리되는 것으로 보입니다. 그러나 배치 차원이 추가되므로 합계 연산에서 2차원 텐서와 다르게 동작합니다.

구체적으로:

  • 축 1(두 번째 차원)을 따라 합산할 때 각 행렬의 행을 합산합니다.
  • 축 0(첫 번째 차원)을 따라 합산할 때 배치 차원을 합산합니다.

요약하다

  • 2D 텐서: 행과 열의 개념이 직관적입니다.
  • 3D 텐서: 배치 차원이 도입된 후 행 및 열 연산은 다르게 보이지만 실제로는 여전히 각 2차원 행렬에서 연산을 수행하고 있습니다.
  • 축을 따라 합산할 때는 합의 크기를 이해하는 것이 중요합니다.