import torch import torch.nn as nn class UNet(nn.Module): def __init__(self): super(UNet, self).__init__() # Encoder self.enc1 = nn.Sequential( nn.Conv2d(3, 64, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(64, 64, kernel_size=3, padding=1), nn.ReLU(inplace=True) ) self.pool1 = nn.MaxPool2d(2) self.enc2 = nn.Sequential( nn.Conv2d(64, 128, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(128, 128, kernel_size=3, padding=1), nn.ReLU(inplace=True) ) self.pool2 = nn.MaxPool2d(2) # Middle self.middle = nn.Sequential( nn.Conv2d(128, 256, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(256, 256, kernel_size=3, padding=1), nn.ReLU(inplace=True) ) # Decoder self.up1 = nn.ConvTranspose2d(256, 128, kernel_size=2, stride=2) self.dec1 = nn.Sequential( nn.Conv2d(256, 128, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(128, 128, kernel_size=3, padding=1), nn.ReLU(inplace=True) ) self.up2 = nn.ConvTranspose2d(128, 64, kernel_size=2, stride=2) self.dec2 = nn.Sequential( nn.Conv2d(128, 64, kernel_size=3, padding=1), nn.ReLU(inplace=True), nn.Conv2d(64, 64, kernel_size=3, padding=1), nn.ReLU(inplace=True) ) self.final = nn.Conv2d(64, 1, kernel_size=1) def forward(self, x): enc1 = self.enc1(x) enc2 = self.enc2(self.pool1(enc1)) middle = self.middle(self.pool2(enc2)) up1 = self.up1(middle) cat1 = torch.cat([up1, enc2], dim=1) dec1 = self.dec1(cat1) up2 = self.up2(dec1) cat2 = torch.cat([up2, enc1], dim=1) dec2 = self.dec2(cat2) return self.final(dec2) def get_unet(): return UNet()