speaker_identify / models /classifier.py
DuyTa's picture
Upload folder using huggingface_hub
f831146 verified
import torch.nn as nn
import torch.nn.functional as F
#### Additional DynamicLinearClassifier Layer for training ####
class DynamicLinearClassifier(nn.Module):
def __init__(self,output_size, input_size=250, num_layers=3, dropout_prob=0.5):
super(DynamicLinearClassifier, self).__init__()
self.hidden_layers = nn.ModuleList()
self.batch_norms = nn.ModuleList()
layer_sizes = [int(input_size - i * (input_size - output_size) / (num_layers + 1)) for i in range(1, num_layers + 1)]
self.hidden_layers.append(nn.Linear(input_size, layer_sizes[0]))
self.batch_norms.append(nn.BatchNorm1d(layer_sizes[0]))
for i in range(1, num_layers):
self.hidden_layers.append(nn.Linear(layer_sizes[i-1], layer_sizes[i]))
self.batch_norms.append(nn.BatchNorm1d(layer_sizes[i]))
self.output_layer = nn.Linear(layer_sizes[-1], output_size)
self.dropout = nn.Dropout(dropout_prob)
self.loss_layer = nn.CrossEntropyLoss(reduction='mean')
def forward(self, x):
for i, hidden_layer in enumerate(self.hidden_layers):
x = hidden_layer(x)
x = self.batch_norms[i](x)
x = F.relu(x)
x = self.dropout(x)
x = self.output_layer(x)
return x
def loss(self, predictions, labels):
loss_val = self.loss_layer(predictions, labels)
return loss_val
class LinearClassifier(nn.Module):
def __init__(self, output_size,input_size=250):
super(LinearClassifier, self).__init__()
self.linear1 = nn.Linear(input_size, 1)
self.linear2 = nn.Linear(1,output_size)
self.loss_layer = nn.CrossEntropyLoss(reduction='mean')
def forward(self, x):
input = self.linear1(x)
return self.linear2(input)
def loss(self, predictions, labels):
loss_val = self.loss_layer(predictions, labels)
return loss_val