출간하신 파이토치 책 내에서 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 을 선언해주면 되는게 아닌가 궁금증이 생겼는데, 해당 조건문을 해당 부분에도 사용하신 이유가 무엇인지 알고싶습니다.
init 부분에 조건문을 없애고 self.downsample 을 선언해주어도 forward 부분에 self.downsample 사용을 위한 조건문이 있으면, init에 따로 조건문이 없어도 해당 조건을 만족하는 경우에만 self.downsample 을 사용할 수 있는 것 아닌가요??
헷갈리네요ㅠㅠ