| | |
| | |
| |
|
| | import torch |
| | import torch.nn as nn |
| | import torch.nn.functional as F |
| |
|
| | from modules.campplus.layers import DenseLayer |
| |
|
| |
|
| | class CosineClassifier(nn.Module): |
| | def __init__( |
| | self, |
| | input_dim, |
| | num_blocks=0, |
| | inter_dim=512, |
| | out_neurons=1000, |
| | ): |
| |
|
| | super().__init__() |
| | self.blocks = nn.ModuleList() |
| |
|
| | for index in range(num_blocks): |
| | self.blocks.append( |
| | DenseLayer(input_dim, inter_dim, config_str='batchnorm') |
| | ) |
| | input_dim = inter_dim |
| |
|
| | self.weight = nn.Parameter( |
| | torch.FloatTensor(out_neurons, input_dim) |
| | ) |
| | nn.init.xavier_uniform_(self.weight) |
| |
|
| | def forward(self, x): |
| | |
| | for layer in self.blocks: |
| | x = layer(x) |
| |
|
| | |
| | x = F.linear(F.normalize(x), F.normalize(self.weight)) |
| | return x |
| |
|
| | class LinearClassifier(nn.Module): |
| | def __init__( |
| | self, |
| | input_dim, |
| | num_blocks=0, |
| | inter_dim=512, |
| | out_neurons=1000, |
| | ): |
| |
|
| | super().__init__() |
| | self.blocks = nn.ModuleList() |
| |
|
| | self.nonlinear = nn.ReLU(inplace=True) |
| | for index in range(num_blocks): |
| | self.blocks.append( |
| | DenseLayer(input_dim, inter_dim, bias=True) |
| | ) |
| | input_dim = inter_dim |
| |
|
| | self.linear = nn.Linear(input_dim, out_neurons, bias=True) |
| |
|
| | def forward(self, x): |
| | |
| | x = self.nonlinear(x) |
| | for layer in self.blocks: |
| | x = layer(x) |
| | x = self.linear(x) |
| | return x |