inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[파이토치] 실전 인공지능으로 이어지는 딥러닝 - 기초부터 논문 구현까지

datasets.py, models.py

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

442

김남욱

작성한 질문수 63

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

답변 1

1

딥러닝호형

안녕하세요 :)

 

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

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

 

좋은 질문 감사합니다!!

0

김남욱

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

헷갈리네요ㅠㅠ

0

딥러닝호형

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

0

김남욱

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

수업자료 제공 부탁드립니다.

0

118

2

코드가 어디에 있는지 모르겠습니다.

0

117

2

논문 구현

0

209

2

overfitting이 나는 이유가 궁금합니다.

1

185

2

분류 성능이 잘 안 나오는 이유

0

227

1

AutoEncoder 차원 질문

1

260

2

사전 학습 모델에서의 layer 변경에 대한 질문

1

227

1

7강 폴더 만들

0

268

1

4-3강 cross-validation에서의 best model 선정 기준

0

462

1

regression 문제에 대한 결과 시각화

0

220

1

Loss function 관련하여 질문드립니다.

0

974

1

early stopping 코드 문의

0

333

1

예측 그래프

0

364

1

데이터 불균형

1

368

1

8강 전이 학습 질문

0

409

2

data의 gpu처리 질문

0

248

1

nn.Linear(1024, 10) 관련 질문드립니다.

0

297

1

학습과 평가시 Loss 함수가 다른 이유

0

256

1

전처리 관련해서 질문 있습니다.

0

232

1

데이터 엔지니어의 역량을 기르려면 어떻게 해야할까요?

0

950

2

역전파 내용 중 미분 관련 질문 드립니다

1

285

1

8강 전이학습에서 kernel size 관련 질문 드립니다.

1

969

1

이미지분류-합성곱신경망(CNN) 피쳐맵 질문입니다.

1

594

1

14강 데이터 불균형 RandomRotation

1

488

1