Pytorch에서 쓸 때마다 헷갈리는 unfold, fold 정리
딥러닝 꿀팁

Pytorch에서 쓸 때마다 헷갈리는 unfold, fold 정리

by handzoo 2024. 1. 9.

unfold와 fold의 나의 쓰임새는 frame별 에너지를 구해서 필터링할 때 썼었다.

이미지는 괜찮은데, 신호를 다루는 입장에서는 함수에 어떤 파라미터를 넣어야 하는지 볼때마다 헷갈린다.

 

Unfold

 

원본 그림은 여기서 확인 가능하다.

위 그림이 제일 잘 나타낸 그림이라고 생각 된다. 

torch.nn.Unfold는 너무 image domain에 맞춰있는 느낌이다.

신호를 다룰 때에 쓰기 편한 torch.tensor.unfold를 바탕으로 소개한다.

torch.tensor.unfold를 사용할 때 한결 마음이 편해질 것이다(그러나 역은 없다..ㅠㅠ)

Tensor.unfold(dimension, size, step)
  • dimension: 어떤 dimension을 자를 것인지
  • size: 신호에서의 window size를 생각하면 된다 혹은 문제 설정에 따라 chunk size
  • step: 신호에서의 hop size를 생각하면 된다

 

 

Unfold 예제

1
2
3
4
= torch.randn(4212#batch, channel, length
(pad x optionally)
unfold_x = x.unfold(dim=2, size=3, step=1)
print(unfold_x.shape)#(4, 2, 10, 3) [batch, channel, num_chunk, chunk_len]
cs

 

 

 

 

Fold

 

torch.nn.functional.fold를 바탕으로 작성했다. fold는 위와 반대로, 주욱 재연결해주는 역할을 한다.

 

F.fold(input=input_tensor, output_size=(1, num_samples), kernel_size=(1, window_size), stride=step_size)

Input shape: (channel * chunk_len, num_chunks)

Output shape: (batch, channel, num_samples)

 

Fold 예제

1
2
3
4
batch, channel, num_chunk, chunk_len = unfold_x.size()
unfold_x = unfold_x.reshape(batch, channel*chunk_len, num_chunk)
stereo_signal = F.fold(input = unfold_x, output_size=(1, x.size(-1)), kernel_size=(1, chunk_len), stride=step_size)
#stereo_signal shape : [batch, channel, 1, num_samples]
cs

 

 

 

window_size와 chunk_len을, 그리고 step_size와 hop_size를 혼용해서 사용했다. 헷갈리지 않길.

나도 이제는 unfold, fold에 대해서 헷갈리지 않길.


TOP

Designed by 티스토리