self.out_channels = out_channels
: 출력 채널 수를 인스턴스 변수로 저장
self.conv1 = nn.Conv2d(in_channels=in_channels, out_channels=self.out_channels, kernel_size=1, padding=0, stride=1)
: 1x1 커널 크기의 합성곱 레이어를 생성하여 self.conv1에 할당
self.conv2_1 = nn.Conv2d(in_channels=in_channels, out_channels=self.out_channels, kernel_size=3, padding=1, stride=1)
: 3x3 커널 크기의 합성곱 레이어를 생성하여 self.conv2_1에 할당
self.IN = nn.InstanceNorm2d(out_channels//2)
: 인스턴스 정규화 레이어를 생성. 정규화는 출력 채널의 절반에 대해서만 수행됩니다.
self.conv2_2 = nn.Conv2d(in_channels=self.out_channels, out_channels=self.out_channels, kernel_size=3, padding=1, stride=1)
: 또 다른 3x3 커널 크기의 합성곱 레이어를 생성하여 self.conv2_2에 할당.
x_1 = self.conv1(x)
: 첫 번째 합성곱 레이어를 입력 x에 적용
x_2 = self.conv2_1(x)
: 두 번째 합성곱 레이어를 입력 x에 적용
x_2_1 = x_2[:,:self.out_channels//2,:,:]
: x_2의 결과에서 채널의 앞 절반만을 슬라이싱
x_2_1 = self.IN(x_2_1)
: 슬라이싱한 결과에 인스턴스 정규화 적용
x_2_2 = x_2[:,self.out_channels//2:,:,:]
: x_2의 결과에서 채널의 나머지 절반을 슬라이싱
x_2 = torch.cat((x_2_1, x_2_2), 1)
: 정규화된 절반과 나머지 절반을 채널 방향으로 결합
x_2 = F.leaky_relu(x_2, 0.2)
: leaky ReLU 활성화 함수 적용, 음의 기울기는 0.2
x_2 = self.conv2_2(x_2)
: 세 번째 합성곱 레이어를 적용
x_2 = F.leaky_relu(x_2, 0.2)
x = x_1 + x_2
: 첫 번째 합성곱 결과와 세 번째 합성곱 결과를 더함
self.hinb = HINBlock(in_channels, out_channels)
: HINBlock 인스턴스를 생성, 입력 채널과 출력 채널을 파라미터로 전달
self.csff_conv = nn.Conv2d(in_channels=out_channels, out_channels=out_channels, kernel_size=3, stride=1, padding=1)
: 출력 채널과 동일한 채널 수를 유지하며 3x3 커널 크기의 합성곱을 정의
self.sc_conv = nn.Conv2d(in_channels=out_channels, out_channels=out_channels, kernel_size=1, stride=1, padding=0)
: 출력 채널을 유지하며 1x1 커널 크기의 합성곱을 정의, 주로 채널 수의 조정이나 정보 집약을 목적으로 사용
self.down = nn.Conv2d(in_channels=out_channels, out_channels=out_channels, kernel_size=4, stride=2, padding=1)
:# 다운샘플링을 위해 4x4 커널 크기의 합성곱을 정의, 스트라이드는 2로 설정하여 출력 이미지의 크기를 줄임
출처: https://chat.openai.com/c/fe5d75b6-20f8-4d86-9d77-9fcca75af71a