딥러닝 꿀팁
Pytorch에서 쓸 때마다 헷갈리는 unfold, fold 정리
handzoo
2024. 1. 9. 20:56
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
|
x = torch.randn(4, 2, 12) #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에 대해서 헷갈리지 않길.