questionet

넘파이, 텐서플로에서 '차원', '축' 의 개념 본문

Learning questions/기초 개념

넘파이, 텐서플로에서 '차원', '축' 의 개념

orthanc 2021. 2. 2. 01:08

이미지 출처 jalammar.github.io/visual-numpy/

numpy에서 

dim, axis, rank, shape, size 의 의미

1. size 는 총 element의 개수를 뜻한다.


2. dim 은 텐서가 존재하는 축의 개수를 뜻한다.
여기서 축이란,
1차원 벡터,  2차원 행렬, 3차원,...,n차원 텐서에서의
각 1, 2, n을 말한다.

위의 넘파이 배열 b와 그것을 시각화한 그림을 보면

1차원 벡터가 총 8개 있고 [1,2]     [3,4]     [5,6]     [7,8]   >>> dim1
[1,2]     [3,4]   와  [5,6]     [7,8]  을 묶어 2차원 행렬 2개를 만든 후 [[1,2] , [3,4]]     [[5,6] , [7,8]]  >>> dim2
각 행렬이 3차원 상에 배열된다.  [ [[1,2] , [3,4]] , [[5,6] , [7,8]] ]  >>> dim3

※ dim을 '축'이 아니라 '차원'이라는 단어로 쓰기도 한다.
이때 벡터나 행렬의 '차원' 과 헷갈리면 안 된다.
벡터, 행렬이 2차원이라고 할 때 차원은 열의 개수를 의미한다 


3. shape 는 각 축(차원)에 존재하는 원소의 수를 뜻한다.

[[[1,2] , [3,4]] , [[5,6] , [7,8]]] 여기서 가장 안쪽에 있는 1차원 벡터 안에는 원소가 2개씩 있다 : [1,2]     [3,4]     [5,6]     [7,8]
                                               그 다음 2차원 행렬 안에는 1차원 벡터들이 2개씩 있다 : [[1,2] , [3,4]]     [[5,6] , [7,8]]
                                               마지막 3차원에는 2차원 행렬이 2개 있다 : [[[1,2] , [3,4]] , [[5,6] , [7,8]]]

4. rank는 텐서가 몇 차원인지를 나타낸다.
scalar는 rank 가 0인 텐서다.  shape는 [ ]  이렇게 표시한다.

[1,2,3] 같은 벡터는 rank가 1인 텐서다.                                   (shape 는 [3] 이 된다.)

[[1,2,3] , [4,5,6]] 과 같은 행렬은 rank가 2인 텐서다.              (shape는 [2,3] 이 된다.)

[[[1,2,3]],[[7,8,9]]] 과 같은 3차원 배열은 rank가 3인 텐서다. (shape는 [2,1,3] 이 된다.)


5. axis는 축을 의미하는 데, 

axis = 0 은  행렬에서 행을 가리키는 축이고
axis = 1 은  행렬에서 열을 가로키는 축이다.

 

넘파이나 텐서플로로 배열을 만들 때
왼쪽 그림처럼 

4 x 3 행렬을 2개 만든다고 해보자.

NLP task에 쓰이는 데이터 입력값으로
이 배열을 해석해보면

문장의 개수가 총 8개이고
각 문장의 단어는 3개씩인 말뭉치의 각 단어를
실수로 인코딩한 뒤

배치처리를 하기 위해
배치사이즈를 2로 둔
데이터셋으로 간주해 볼 수 있다. 

단어 임베딩을 거친 후라면 각 단어를 3차원으로 임베딩한 총 8개의 단어 임베딩 배열을 
2개의 미니배치로 나눈 것으로 볼 수도 있다.

그런데 shape을 잘 보면 (배치사이즈 x 행렬의 행의 개수 x 열의 개수) 로 배열이 생성되는 것을 볼 수 있다.

(행렬의 행의 개수 x 열의 개수 x 배치사이즈)로 하지 않은 이유가 뭘까? 

 

 

차원이 늘어나면
오른쪽 그림과 같이
생각하면 되니 훨씬 간단할 것 같은데 말이다.

그런데 오른쪽 그림 같은 형태로
넘파이 배열을 선언하려면
np.random.random((3,2,4,3))
이라고 써야 한다.

 

jalammar.github.io/visual-numpy/여기에서는 그 이유를 아래와 같이 설명하고 있다.

NumPy’s order for printing n-dimensional arrays is that
the last axis is looped over the fastest, while the first is the slowest.

'Learning questions > 기초 개념' 카테고리의 다른 글

파이썬, 넘파이, 퍼셉트론  (0) 2021.10.15
Mathmatical Notation  (0) 2021.04.16
Linear classifier  (0) 2021.01.17
validation set (dev set)이 필요한 이유  (0) 2021.01.04
Lec02 요약  (0) 2021.01.04
Comments