| import torch |
| import torch.nn as nn |
|
|
| class UNet(nn.Module): |
| def __init__(self): |
| super(UNet, self).__init__() |
|
|
| |
| 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) |
|
|
| |
| 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) |
| ) |
|
|
| |
| 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() |
|
|