(self, x, l, l_mask)
| 714 | ) |
| 715 | |
| 716 | def forward(self, x, l, l_mask): |
| 717 | B, HW = x.size(0), x.size(1) |
| 718 | x = x.permute(0, 2, 1) # (B, key_channels, H*W) |
| 719 | l_mask = l_mask.permute(0, 2, 1) # (B, N_l, 1) -> (B, 1, N_l) |
| 720 | |
| 721 | query = self.f_query(x) # (B, key_channels, H*W) if Conv1D |
| 722 | query = query.permute(0, 2, 1) # (B, H*W, key_channels) |
| 723 | key = self.f_key(l) # (B, key_channels, N_l) |
| 724 | value = self.f_value(l) # (B, self.value_channels, N_l) |
| 725 | key = key * l_mask # (B, key_channels, N_l) |
| 726 | value = value * l_mask # (B, self.value_channels, N_l) |
| 727 | n_l = value.size(-1) |
| 728 | query = query.reshape(B, HW, self.num_heads, self.key_channels//self.num_heads).permute(0, 2, 1, 3) |
| 729 | # (b, num_heads, H*W, self.key_channels//self.num_heads) |
| 730 | key = key.reshape(B, self.num_heads, self.key_channels//self.num_heads, n_l) |
| 731 | # (b, num_heads, self.key_channels//self.num_heads, n_l) |
| 732 | value = value.reshape(B, self.num_heads, self.value_channels//self.num_heads, n_l) |
| 733 | # # (b, num_heads, self.value_channels//self.num_heads, n_l) |
| 734 | l_mask = l_mask.unsqueeze(1) # (b, 1, 1, n_l) |
| 735 | |
| 736 | sim_map = torch.matmul(query, key) # (B, self.num_heads, H*W, N_l) |
| 737 | sim_map = (self.key_channels ** -.5) * sim_map # scaled dot product |
| 738 | |
| 739 | sim_map = sim_map + (1e4*l_mask - 1e4) # assign a very small number to padding positions |
| 740 | sim_map = F.softmax(sim_map, dim=-1) # (B, num_heads, h*w, N_l) |
| 741 | out = torch.matmul(sim_map, value.permute(0, 1, 3, 2)) # (B, num_heads, H*W, self.value_channels//num_heads) |
| 742 | out = out.permute(0, 2, 1, 3).contiguous().reshape(B, HW, self.value_channels) # (B, H*W, value_channels) |
| 743 | out = out.permute(0, 2, 1) # (B, value_channels, HW) |
| 744 | out = self.W(out) # (B, value_channels, HW) |
| 745 | out = out.permute(0, 2, 1) # (B, HW, value_channels) |
| 746 | |
| 747 | return out |
| 748 |
nothing calls this directly
no outgoing calls
no test coverage detected