# Codeblock 5 class Encoder(nn.Module): def __init__(self): super().__init__() self.norm_0 = nn.LayerNorm(EMBED_DIM) #(1) self.multihead_attention = nn.MultiheadAttention(EMBED_DIM, #(2) num_heads=NUM_HEADS, batch_first=True) self.norm_1 = nn.LayerNorm(EMBED_DIM) #(3) self.ffn = nn.Sequential( #(4) nn.Linear(in_features=EMBED_DIM, out_features=FFN_SIZE), nn.GELU(), nn.Linear(in_features=FFN_SIZE, out_features=EMBED_DIM), ) def forward(self, x): residual = x print(f'residual dim\t: {residual.size()}') x = self.norm_0(x) print(f'after norm\t: {x.size()}') x = self.multihead_attention(x, x, x)[0] print(f'after attention\t: {x.size()}') x = x + residual print(f'after addition\t: {x.size()}') residual = x print(f'residual dim\t: {residual.size()}') x = self.norm_1(x) print(f'after norm\t: {x.size()}') x = self.ffn(x) print(f'after ffn\t: {x.size()}') x = x + residual print(f'after addition\t: {x.size()}') return x