|
|
|
|
|
|
| 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 |