Derma / unet_model.py
sheikh987's picture
Upload 3 files
e5c53c9 verified
Raw
History Blame Contribute Delete
2.03 kB
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()