인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

Inflearn Community Q&A

김남욱's profile image
김남욱

asked

[PyTorch] Deep Learning Leading to Practical Artificial Intelligence - From Basics to Paper Implementation

datasets.py, models.py

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

Written on

·

391

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 을 선언해주면 되는게 아닌가 궁금증이 생겼는데, 해당 조건문을 해당 부분에도 사용하신 이유가 무엇인지 알고싶습니다.

 

딥러닝python인공신경망머신러닝 배워볼래요? pytorch

Answer 1

1

deeplearningbro님의 프로필 이미지
deeplearningbro
Instructor

안녕하세요 :)

 

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

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

 

좋은 질문 감사합니다!!

김남욱님의 프로필 이미지
김남욱
Questioner

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

헷갈리네요ㅠㅠ

deeplearningbro님의 프로필 이미지
deeplearningbro
Instructor

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

김남욱님의 프로필 이미지
김남욱
Questioner

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

김남욱's profile image
김남욱

asked

Ask a question