self.conv1 = nn.Conv2d(in_channels=in_channels,out_channels=out_channels,kernel_size=1,stride=1,padding=0)
self.conv2_1 = nn.Conv2d(in_channels=in_channels,out_channels=out_channels,kernel_size=3,stride=1,padding=1)
self.conv2_2 = nn.Conv2d(in_channels=out_channels,out_channels=out_channels,kernel_size=3,stride=1,padding=1)
x_1 = self.conv1(x)
x_2 = self.conv2_1(x)
x_2 = F.leaky_relu(x_2,0.2)
x_2 = self.conv2_2(x_2)
x_2 = F.leaky_relu(x_2,0.2)
x = x_1 + x_2
나눠서 X_2_1 과 X_2_2로 구분하여 입력채널을 반으로 나누어 한 부분은 인스턴스 정규화를 적용하고 다른 부분은 그 대로 둔 후 이들을 다시 합치는 HINBlock과 다르다.
gen_csff=False
self.gen_csff = gen_csff
: CSFF 계층을 사용할지 여부를 설정합니다.
self.up = nn.ConvTranspose2d(in_channels=in_channels,out_channels=out_channels,kernel_size=2,stride=2,padding=0)
: 업샘플링을 위한 컨볼루션 전치 계층을 정의합니다. 전치 컨볼루션은 일반적인 컨볼루션과 반저로 작동합니다. 일반 컨볼루션에서는 입력 이미지 위에 커널 또는 필터를 적용하여 출력 이미지의 크기를 줄이는 반면, 전치 컨볼루션은 커널을 사용하여 입력 이미지를 확대한다. 이 과정에서 커널은 입력의 각 포인트에 대해 출력 공간에 패턴을 생성하며, 이 패턴들이 중첩되어 최종적으로 크기가 더 큰 출력을 생성한다.
self.resb = ResBlock(in_channels,out_channels)
: ResBlock 계층을 초기화합니다.
if self.gen_csff : self.csff = nn.Conv2d(in_channels=out_channels,out_channels=out_channels,kernel_size=3,stride=1,padding=1)
: CSFF 계층을 필요에 따라 초기화합니다.
csff=None
x = self.up(x)
x = torch.cat((x,sc),1)
: 업샘플링 결과와 스킵 연결을 합친다.
x = self.resb(x)
if self.gen_csff : csff = self.csff(x)
return x, csff
: ResBlock 계층을 통과시키고 CSFF 계층이 있으면 그 결과를 csff에 저장한다.
self.conv1 = nn.Conv2d(in_channels=channels,out_channels=3,kernel_size=3,stride=1,padding=1)
self.conv2 = nn.Conv2d(in_channels=3,out_channels=channels,kernel_size=3,stride=1,padding=1)
self.conv3 = nn.Conv2d(in_channels=channels,out_channels=channels,kernel_size=3,stride=1,padding=1)
sam1 = self.conv1(x) # 첫 번째 컨볼루션 연산
x_out = sam1 # 중간 결과 저장
sam1 = img + sam1 # 입력 이미지와의 합
sam1 = self.conv2(sam1) # 두 번째 컨볼루션 연산
sam1 = torch.sigmoid(sam1) # 시그모이드 활성화 함수 적용
sam2 = self.conv3(x) # 세 번째 컨볼루션 연산
sam = torch.mul(sam1, sam2) # 두 결과의 요소별 곱셈
sam = x + sam # 입력과 최종 결과의 합
self.conv = nn.Conv2d(in_channels=3,out_channels=init_channel,kernel_size=3,stride=1,padding=1)
x = self.conv(x)
: 3개의 입력 채널에서 초기 채널 수로 컨볼루션 레이어 초기화 및 연산
self.conv1 = nn.Conv2d(in_channels=3,out_channels=in_channels,kernel_size=3,stride=1,padding=1)
self.conv2 = nn.Conv2d(in_channels=in_channels+sam_channels,out_channels=(in_channels+sam_channels)//2,kernel_size=1,stride=1,padding=0)
: 3개의 입력 채널에서 in_channels로 컨볼루션 레이어 초기화
: 입력 채널과 SAM 채널의 합을 반으로 줄이는 1x1 컨볼루션 레이어
x = self.conv1(img) # 첫 번째 컨볼루션 연산
x = torch.cat((x, sam), 1) # 컨볼루션 결과와 SAM 결과의 연결
x = self.conv2(x) # 두 번째 컨볼루션 연산
self.conv1 = nn.Conv2d(in_channels=channels,out_channels=channels,kernel_size=1,stride=1,padding=0)
self.conv2 = nn.Conv2d(in_channels=channels,out_channels=channels,kernel_size=1,stride=1,padding=0)
x = self.conv1(csff1) + self.conv2(csff2)
:입력 채널을 그대로 유지하는 1x1 컨볼루션 레이어 두 개와 결과의 합
출처: https://dacon.io/competitions/official/235746/codeshare/3024