A skip connection just requires passing the return value from one layer to one further down:

  
      github.com
  
  
    mattmacy/vnet.pytorch/blob/master/vnet.py#L169 134

#     # to what is in the actual prototxt, not the intent
#     self.down_tr32 = DownTransition(16, 2)
#     self.down_tr64 = DownTransition(32, 3)
#     self.down_tr128 = DownTransition(64, 3)
#     self.down_tr256 = DownTransition(128, 3)
#     self.up_tr256 = UpTransition(256, 3)
#     self.up_tr128 = UpTransition(128, 3)
#     self.up_tr64 = UpTransition(64, 2)
#     self.up_tr32 = UpTransition(32, 1)
#     self.out_tr = OutputTransition(16)
def forward(self, x):
    out16 = self.in_tr(x)
    out32 = self.down_tr32(out16)
    out64 = self.down_tr64(out32)
    out128 = self.down_tr128(out64)
    out256 = self.down_tr256(out128)
    out = self.up_tr256(out256, out128)
    out = self.up_tr128(out, out64)
    out = self.up_tr64(out, out32)
    out = self.up_tr32(out, out16)
    out = self.out_tr(out)



  
  
    
    
  
  


Models will typically add or concatenate the skip connection:

  
      github.com
  
  
    mattmacy/vnet.pytorch/blob/master/vnet.py#L101 118

    self.up_conv = nn.ConvTranspose3d(inChans, outChans // 2, kernel_size=2, stride=2)
    self.bn1 = ContBatchNorm3d(outChans // 2)
    self.do1 = passthrough
    self.do2 = nn.Dropout3d()
    self.relu1 = ELUCons(elu, outChans // 2)
    self.relu2 = ELUCons(elu, outChans)
    if dropout:
        self.do1 = nn.Dropout3d()
    self.ops = _make_nConv(outChans, nConvs, elu)


def forward(self, x, skipx):
    out = self.do1(x)
    skipxdo = self.do2(skipx)
    out = self.relu1(self.bn1(self.up_conv(out)))
    xcat = torch.cat((out, skipxdo), 1)
    out = self.ops(xcat)
    out = self.relu2(torch.add(out, xcat))
    return out




class OutputTransition(nn.Module):