| 37 | |
| 38 | |
| 39 | def aligned_bilinear(tensor, factor): |
| 40 | assert tensor.dim() == 4 |
| 41 | assert factor >= 1 |
| 42 | assert int(factor) == factor |
| 43 | if factor == 1: |
| 44 | return tensor |
| 45 | |
| 46 | h, w = tensor.size()[2:] |
| 47 | tensor = F.pad(tensor, pad=(0, 1, 0, 1), mode="replicate") |
| 48 | oh = factor * h + 1 |
| 49 | ow = factor * w + 1 |
| 50 | tensor = F.interpolate(tensor, |
| 51 | size=(oh, ow), |
| 52 | mode='bilinear', |
| 53 | align_corners=True) |
| 54 | tensor = F.pad(tensor, |
| 55 | pad=(factor // 2, 0, factor // 2, 0), |
| 56 | mode="replicate") |
| 57 | return tensor[:, :, :oh - 1, :ow - 1] |
| 58 | |
| 59 | class SinusoidalPositionEmbeddings(nn.Module): |
| 60 | def __init__(self, dim): |