Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

망둥어집

[PYTORCH] unfold 함수 본문

Python

[PYTORCH] unfold 함수

dongjinkim 2020. 2. 27. 19:26

unfold 함수에 대해 이해할 일이 생겨서 정리해본다.

 

아래 블로그 글을 먼저 읽고 참고하면 도움이 된다.

https://seolhokim.github.io/deeplearning/2019/07/09/pytorch-unfold/

 

pytorch에서는 unfold함수를 아래와 같이 정의했다.

unfold함수를 통해 tensor의 dimension size들을 조절하여 원하는 tensor를 얻을 수 있다.

좀 더 직관적으로 tensor.unfold(axis, number_of_components, strides) 이런 식으로 생각하면 좋다.

 

아래에서 dimension, size, step에 대해 그림으로 더 쉽게 설명해봤다.

 

먼저 size[2, 2, 5, 5]를 갖는 tensor를 생성한다.

출력 결과를 시각적으로 그려 보면 아래와 같다.

size 위의 0 1 2 3은 dimension 정보이다.

 

1. unfold(3, 1, 1)

 

생성된 test tensor에 unfold(3, 1, 1)을 적용해 보았다.

3번째 dimension의 element들을 1개씩 1의 stride를  적용하여 tensor를 만들어 낸다.

3번째 dimension에 각각의 element들에 차원이 하나 더 추가되었다.

 

 

 

2. unfold(3, 1, 2)

 

test에 dimension과 element 수는 동일하고 stride를 2를 줘서 unfold를 진행해봤다.

dimension 3의 element들이 2씩차이가 나며 tensor가 만들어졌다.

3. unfold(2, 5, 1)

 

이번엔 unfold(2, 5, 1)을 진행해봤다.

test tensor의 2 dimension의 element가 5개씩(0, 5, 10, 15, 20 : 처음 tensor에서 새로 줄이라고 생각하면 쉽다.) 묶여서 tensor가 생성됐다.

 

4. unfold(2, 5, 2)

 

unfold_251에서 stride값을 2로 변경하여 unfold_252를 진행해보았다.

test의 2 dimension의 element 수가 5개 이므로 5개씩 묶어서 component를 만들면 처음 묶음으로 component 생성이 끝나서 stride가 의미가 없다.

 

5. unfold(3, 1, 1)

 

test의 1 dimention의 요소들끼리 2개씩 묶여서 tensor 생성.

 

 

각각의 그림들을 한 번에 같이 보는 게 이해하기 쉬운 거 같다.

 

 

참고 :

https://seolhokim.github.io/deeplearning/2019/07/09/pytorch-unfold/

https://pytorch.org/docs/stable/tensors.html?highlight=unfold#torch.Tensor.unfold

 

pytorch unfold에서의 차원

pytorch 뿐만이 아니라 항상 dimension에 관한 작업을 하다보면 reshape이나 concat, split, matmul 등 가끔 헷갈리는 연산들이 있었는데, 이번에 Stand-Alone-Self-Attention 구현을 하면서 다차원 행렬의 연산에 대해 조금 이해하는 계기가 되었다.

seolhokim.github.io

 

Comments