Creating 2 Residual Block in the Same Class

Case 1:

class _ResGraphConv(nn.Module):
    def __init__(self, adj, input_dim, output_dim, hid_dim, p_dropout):
        super(_ResGraphConv, self).__init__()

        self.gconv1 = _GraphConv(adj, input_dim, output_dim, p_dropout)
        self.gconv2 = _GraphConv(adj, input_dim, output_dim, p_dropout)

    def forward(self, x):
        residual = x
        out = self.gconv1(x)
        out = self.gconv2(out)
        return residual + out
		
class MyGCNConv(nn.Module):
    def __init__(self, adj, input_dim, output_dim, hid_dim, p_dropout):
        super(MyGCNConv, self).__init__()
        layers = []
        for i in range(2):
			layers.append(_ResGraphConv(adj, input_dim, hid_dim, output_dim, p_dropout=p_dropout))
		
        self.myLayers = nn.Sequential(*layers)
		
    def forward(self, x):
        out = self.myLayers(x)
        return out

Case 2:

class _ResGraphConv(nn.Module):
    def __init__(self, adj, input_dim, output_dim, hid_dim, p_dropout):
        super(_ResGraphConv, self).__init__()

        self.gconv1 = _GraphConv(adj, input_dim, output_dim, p_dropout)
        self.gconv2 = _GraphConv(adj, input_dim, output_dim, p_dropout)
        self.gconv3 = _GraphConv(adj, input_dim, output_dim, p_dropout)
        self.gconv4 = _GraphConv(adj, input_dim, output_dim, p_dropout)

    def forward(self, x):
        residual = x
        out = self.gconv1(x)
        out = self.gconv2(out)
        out = residual + out
        y = out
        residual = out
        out = self.gconv3(y)
        out = self.gconv4(out)
        return residual + out
		
class MyGCNConv(nn.Module):
    def __init__(self, adj, input_dim, output_dim, hid_dim, p_dropout):
        super(MyGCNConv, self).__init__()
		self.myLayers = _ResGraphConv(adj, input_dim, hid_dim, output_dim,p_dropout=p_dropout)
		
    def forward(self, x):
        out = self.myLayers(x)
        return out

Is there any difference between these two and Is there any disadvantage of using case 2?

I want to create 2 residual block in the same class.

Both approaches look equal in their execution, so you could pick whichever fits your use case best.

1 Like

Thank you so much for the answer.