인프런 커뮤니티 질문&답변
파이토치 책 내용 중 ResNet 구현 관련 질문 있습니다.
작성
·
432
0
출간하신 파이토치 책 내에서 ResNet 부분을 구현해보면서 Residual Block 구축 부분에서 궁금한점이 생겨 질문 드립니다.
class ResidualBlock(nn.Module):
def __init__(self, in_channels, out_channels, stride=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(self, x):
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을 사용하는 경우가 생겨 오류가 발생합니다.
좋은 질문 감사합니다!!





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