채널 수, 이미지 크기의 변화를 이해하기 위해 gpt에게 물어봤음.
x
): MaxPool2d
와 Conv2d
함수로 2차원 데이터 임을 짐작할 수 있음.Conv1 (첫 번째 Conv Block):
MaxPool:
Conv2 (두 번째 Conv Block):
MaxPool:
Conv3 (세 번째 Conv Block):
MaxPool:
Conv4 (네 번째 Conv Block):
Up4:
Concatenation:
class U_Net(nn.Module):
def __init__(self, img_ch=3, output_ch=1):
super(U_Net, self).__init__()
self.MaxPool = nn.MaxPool2d(kernel_size=2, stride=2)
self.Conv1 = conv_block(ch_in=img_ch, ch_out=64)
self.Conv2 = conv_block(ch_in=64, ch_out=128)
self.Conv3 = conv_block(ch_in=128, ch_out=256)
self.Conv4 = conv_block(ch_in=256, ch_out=512)
self.Up4 = up_conv(ch_in=512, ch_out=256)
self.Up_conv4 = conv_block(ch_in=512, ch_out=256)
self.Up3 = up_conv(ch_in=256, ch_out=128)
self.Up_conv3 = conv_block(ch_in=256, ch_out=128)
self.Up2 = up_conv(ch_in=128, ch_out=64)
self.Up_conv2 = conv_block(ch_in=128, ch_out=64)
self.Conv_1x1 = nn.Conv2d(64, output_ch, kernel_size=1, stride=1, padding=0)
def forward(self, x):
# encoding path
x1 = self.Conv1(x)
x2 = self.MaxPool(x1)
x2 = self.Conv2(x2)
x3 = self.MaxPool(x2)
x3 = self.Conv3(x3)
x4 = self.MaxPool(x3)
x4 = self.Conv4(x4)
d4 = self.Up4(x4)
d4 = torch.cat((x3, d4), dim=1)
d4 = self.Up_conv4(d4)
d3 = self.Up3(d4)
d3 = torch.cat((x2, d3), dim=1)
d3 = self.Up_conv3(d3)
d2 = self.Up2(d3)
d2 = torch.cat((x1, d2), dim=1)
d2 = self.Up_conv2(d2)
net = self.Conv_1x1(d2)
return net
conv_block
: 여러 개의 Convolution layer를 사용하는 블록
up_conv
: 디코딩 단계에서 이미지 크기를 복원(업샘플링)
class conv_block(nn.Module):
def __init__(self, ch_in, ch_out):
super(conv_block, self).__init__()
self.conv = nn.Sequential(
nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=1, padding=1, bias=True),
nn.LeakyReLU(inplace=True),
nn.Conv2d(ch_out, ch_out, kernel_size=3, stride=1, padding=1, bias=True),
nn.LeakyReLU(inplace=True)
)
def forward(self, x):
x = self.conv(x)
return x
3x3 convolution layer
+ LeakyReLU 활성화 함수
)패턴이 2중으로 구성됨.class up_conv(nn.Module):
def __init__(self, ch_in, ch_out):
super(up_conv, self).__init__()
self.up = nn.Sequential(
nn.Upsample(scale_factor=2),
nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=1, padding=1, bias=True),
# nn.LeakyReLU(inplace=True)
nn.ReLU(inplace=True)
)
def forward(self, x):
x = self.up(x)
return x
업샘플링
nn.Upsample(scale_factor=2)
: 이미지의 크기를 2배로 확대
3x3 convolution layer 1개
nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=1, padding=1)
ReLU 활성화 함수
nn.ReLU(inplace=True)