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에 대해서 헷갈리지 않길.
'딥러닝 꿀팁' 카테고리의 다른 글
딥러닝 iteration 돌다가 중간에 죽었음 뜰 때는 pin_memory를 먼저 보라 (0) | 2024.02.27 |
---|---|
for문과 같은 loop문 없이 tensor을 특정 조건으로 훑고 선택 및 변경하기 (1) | 2023.07.10 |
[파이썬]리스트에서 특정 column 내용 추출하기 (0) | 2023.05.24 |
왜 torch.zeros를 쓰지 않고 torch.new_zeros를 사용할까 (0) | 2023.05.16 |
모델을 Evaluation시 필수적으로 넣어줘야 할 것 (0) | 2023.05.16 |