File size: 1,813 Bytes
497b3ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import torch
import torch.nn as nn

class biLSTM(nn.Module):
    """
    The LSTM model that will be used to perform Sentiment analysis.
    """
    
    def __init__(self, 
                # объем словаря, с которым мы работаем, размер входа для слоя Embedding
                vocab_size: int, 
                # размер выходного эмбеддинга каждый элемент последовательности
                # будет описан вектором такой размерности
                embedding_dim: int, 
                # размерность hidden state LSTM слоя
                hidden_dim: int,
                # число слоев в LSTM
                n_layers: int,                
                drop_prob=0.5,
                seq_len = 128) -> None:
        
        super().__init__()
        self.hidden_dim = hidden_dim
        self.n_layers = n_layers
        self.seq_len = seq_len
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        self.lstm = nn.LSTM(embedding_dim, 
                            hidden_dim, 
                            n_layers, 
                            dropout=drop_prob, 
                            batch_first=True,
                            bidirectional=True
                            )
        
        self.do = nn.Dropout()
        
        self.fc1 = nn.Linear(2*hidden_dim * self.seq_len, 256)
        self.fc2 = nn.Linear(256, 1)
        self.sigmoid = nn.Sigmoid()
        
    def forward(self, x):
        embeds = self.embedding(x)
        lstm_out, _ = self.lstm(embeds)  
        out = self.fc2(torch.tanh(self.do(self.fc1(lstm_out.flatten(1)))))
        sig_out = self.sigmoid(out)
        
        return sig_out