File size: 1,718 Bytes
73dbe16
 
 
8cbf94e
73dbe16
8cbf94e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73dbe16
 
 
 
 
 
 
 
 
 
8cbf94e
73dbe16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8cbf94e
 
 
 
 
 
73dbe16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import torch
from torch import nn

class MLP(nn.Module):

    def __init__(self,dim):
        super().__init__()
        self.proj_1 =  nn.Linear(dim,dim,bias=False)
        self.proj_2 =  nn.Linear(dim,dim,bias=False)        
        self.gelu = nn.GELU()
       
             	   
    def forward(self, x):
       
        x = self.proj_1(x)
        x = self.gelu(x)          
        x = self.proj_2(x)
        
                          
        return x
        

class Context_PReLUBlock(nn.Module):

    def __init__(self, d_model, num_tokens):
        super().__init__()
       
         
        self.context_prelu = nn.PReLU(d_model * num_tokens)
        self.token_norm = nn.LayerNorm(d_model)
        self.local_mapping = MLP(d_model)
                        
        
    def forward(self, x):
                  
       
        
        residual = x
        
        x = self.token_norm(x)
        
        dim0 = x.shape[0]
        dim1 = x.shape[1]
        dim2 = x.shape[2]
        context = x.reshape([dim0,dim1*dim2])
        
                       
        readout = self.context_prelu(context)        
        
        x = readout.reshape([dim0,dim1,dim2])
            
        x = x + residual
            
        residual = x

        x = self.local_mapping(x)
                                          
        out = x + residual
        
        
        return out



class Context_PReLU(nn.Module):
    def __init__(self, d_model,num_tokens, num_layers):
        super().__init__()
        
        self.model = nn.Sequential(
            *[Context_PReLUBlock(d_model,num_tokens) for _ in range(num_layers)]
        )

    def forward(self, x):
       
        return self.model(x)