• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

파이토치 책 내용 중 ResNet 구현 관련 질문 있습니다.

22.05.17 02:06 작성 조회수 317

0

출간하신 파이토치 책 내에서 ResNet 부분을 구현해보면서 Residual Block 구축 부분에서 궁금한점이 생겨 질문 드립니다.

class ResidualBlock(nn.Module):
  def __init__(selfin_channelsout_channelsstride=1):
    super(ResidualBlock, self).__init__()
    self.in_channels = in_channels
    self.out_channels = out_channels
    self.stride = stride

    self.conv_block = nn.Sequential(
        nn.Conv2d(self.in_channels, self.out_channels, kernel_size=3, stride=stride, padding=1, bias=False), nn.BatchNorm2d(self.out_channels), nn.ReLU(),
        nn.Conv2d(self.out_channels, self.out_channels, kernel_size=3, stride=1, padding=1, bias=False), nn.BatchNorm2d(self.out_channels) 
            )
    if self.stride != 1 or self.in_channels != self.out_channels :
      self.downsample = nn.Sequential(
          nn.Conv2d(self.in_channels, self.out_channels, kernel_size=1, stride=stride, bias=False), nn.BatchNorm2d(self.out_channels)
      )
    
  def forward(selfx):
    out = self.conv_block(x)
    if self.stride != 1 or self.in_channels != self.out_channels :
      x = self.downsample(x)
    out = F.relu(x + out)
    return out
 
다음 코드에서 forward 부분에 다음과 같은 조건문이 있으니,
(if self.stride != 1 or self.in_channels != self.out_channels :)
__init__ 에 있는 동일한 조건문은 따로 필요 없이 바로 self.downsample 을 선언해주면 되는게 아닌가 궁금증이 생겼는데, 해당 조건문을 해당 부분에도 사용하신 이유가 무엇인지 알고싶습니다.

 

답변 1

답변을 작성해보세요.

1

안녕하세요 :)

 

forward 부분에서 조건문이 없으면 에러가 납니다. 그 이유는 init에서는 해당 조건을 만족하는 경우에만 self.downsample이 만들어지도록 되어 있기 때문에 forward에 조건문이 없다면 모든 경우에 대해서 self.downsample을 사용하겠다는 의미로 모순이 생기게 됩니다.

다시 말해서 조건문을 사용하지 않으면 self.downsample이 선언되지 않았음에도 self.downsample을 사용하는 경우가 생겨 오류가 발생합니다.

 

좋은 질문 감사합니다!!

김남욱님의 프로필

김남욱

질문자

2022.05.17

init 부분에 조건문을 없애고 self.downsample 을 선언해주어도 forward 부분에 self.downsample 사용을 위한 조건문이 있으면, init에 따로 조건문이 없어도 해당 조건을 만족하는 경우에만 self.downsample 을 사용할 수 있는 것 아닌가요??

헷갈리네요ㅠㅠ

지금 물어보신 것은 처음 질문과 반대의 경우를 물어 보셨는데요. 가능 합니다! 다만 사용하지 않는 경우까지 레이어를 선언할 필요없기 때문에 if문을 넣었습니다. init에 if문 추가 한다고 속도가 느려지지 않으며 오히려 불필요한 레이어를 선언하여 모델 용량이 늘어 나겠죠!

김남욱님의 프로필

김남욱

질문자

2022.05.17

친절한 답변 정말로 감사합니다!! 이해가 되었습니다!!!