망둥어집
[PYTORCH] unfold 함수 본문
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를 생성한다.
출력 결과를 시각적으로 그려 보면 아래와 같다.
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