Een U-Net bouwen: laagdefinities
In deze en de volgende oefening bouw je een U-Net-architectuur vanaf nul. Hier begin je met het definiëren van de __init__()-methode, waarin je lagen en blokken van lagen definieert die het model zal gebruiken.
De encoder en getransponeerde convolutie zijn al voor je gedefinieerd. Wat overblijft zijn de convolutionele blokken van de decoder. Je moet het juiste aantal input- en outputkanalen aan elk van hen doorgeven, met inachtneming van de skip-connections.
Het eerste blok, dec1, neemt als input de concatenatie van de output van upconv3 met de output van enc3. De output van dec1 moet op zijn beurt gelijk zijn aan de output van enc3. Kun je alle ontbrekende input- en outputgroottes invullen?
Deze oefening maakt deel uit van de cursus
Deep Learning voor afbeeldingen met PyTorch
Oefeninstructies
- Definieer de drie convolutionele blokken in de decoder door het juiste aantal input- en outputkanalen aan elk van hen door te geven.
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
class UNet(nn.Module):
def __init__(self, in_channels, out_channels):
super(UNet, self).__init__()
self.enc1 = self.conv_block(in_channels, 64)
self.enc2 = self.conv_block(64, 128)
self.enc3 = self.conv_block(128, 256)
self.enc4 = self.conv_block(256, 512)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
self.upconv3 = nn.ConvTranspose2d(512, 256, kernel_size=2, stride=2)
self.upconv2 = nn.ConvTranspose2d(256, 128, kernel_size=2, stride=2)
self.upconv1 = nn.ConvTranspose2d(128, 64, kernel_size=2, stride=2)
# Define the decoder blocks
self.dec1 = self.conv_block(____, ____)
self.dec2 = self.conv_block(____, ____)
self.dec3 = self.conv_block(____, ____)
self.out = nn.Conv2d(64, out_channels, kernel_size=1)