hinet block, hinet layer 구현

행동하는 개발자·2024년 4월 24일
0

Image

목록 보기
6/8

HINBlock

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

: 첫 번째 합성곱 결과와 세 번째 합성곱 결과를 더함

HINLayer

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

profile
끊임없이 뭔가를 남기는 사람

0개의 댓글