# Codeblock 7b def forward(self, features): #(1) residual = features #(2) print(f'features & residual\t: {residual.size()}') #(3) features, self_attn_weights = self.self_attention(query=features, key=features, value=features) print(f'after self attention\t: {features.size()}') print(f"self attn weights\t: {self_attn_weights.shape}") features = self.layer_norm_0(features + residual) #(4) print(f'after norm\t\t: {features.size()}') residual = features print(f'\nfeatures & residual\t: {residual.size()}') features = self.ffn(features) #(5) print(f'after ffn\t\t: {features.size()}') features = self.layer_norm_1(features + residual) print(f'after norm\t\t: {features.size()}') return features