We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
I'm reproducing this paper and code and I have one question. At model/resnet.py, I think that bn-relu are duplicated in PreAct ResNet18.
model/resnet.py
def CIFAR_ResNet18(pretrained=False, **kwargs): return CIFAR_ResNet(PreActBlock, [2,2,2,2], **kwargs)
and
class CIFAR_ResNet(nn.Module): def __init__(self, block, num_blocks, num_classes=10, bias=True): super(CIFAR_ResNet, self).__init__() self.in_planes = 64 self.conv1 = conv3x3(3,64) self.bn1 = nn.BatchNorm2d(64) self.layer1 = self._make_layer(block, 64, num_blocks[0], stride=1) self.layer2 = self._make_layer(block, 128, num_blocks[1], stride=2) self.layer3 = self._make_layer(block, 256, num_blocks[2], stride=2) self.layer4 = self._make_layer(block, 512, num_blocks[3], stride=2) self.linear = nn.Linear(512*block.expansion, num_classes, bias=bias) def _make_layer(self, block, planes, num_blocks, stride): strides = [stride] + [1]*(num_blocks-1) layers = [] for stride in strides: layers.append(block(self.in_planes, planes, stride)) self.in_planes = planes * block.expansion return nn.Sequential(*layers) def forward(self, x, lin=0, lout=5): out = x out = self.conv1(out) out = self.bn1(out) # <---------------------------------------- out = F.relu(out) # <---------------------------------------- out1 = self.layer1(out) out2 = self.layer2(out1) out3 = self.layer3(out2) out = self.layer4(out3) out = F.avg_pool2d(out, 4) out4 = out.view(out.size(0), -1) out = self.linear(out4) return out
self.layer1 in CIFAR_ResNet is PreActBlock shown below
self.layer1
PreActBlock
class PreActBlock(nn.Module): '''Pre-activation version of the BasicBlock.''' expansion = 1 def __init__(self, in_planes, planes, stride=1): super(PreActBlock, self).__init__() self.bn1 = nn.BatchNorm2d(in_planes) self.conv1 = conv3x3(in_planes, planes, stride) self.bn2 = nn.BatchNorm2d(planes) self.conv2 = conv3x3(planes, planes) self.shortcut = nn.Sequential() if stride != 1 or in_planes != self.expansion*planes: self.shortcut = nn.Sequential( nn.Conv2d(in_planes, self.expansion*planes, kernel_size=1, stride=stride, bias=False) ) def forward(self, x): out = F.relu(self.bn1(x)) # <---------------------------------------- shortcut = self.shortcut(out) out = self.conv1(out) out = self.conv2(F.relu(self.bn2(out))) out += shortcut return out
I think the input of PreActBlock has already passed through bn-relu.
When I printed this network,
==> Building model: CIFAR_ResNet18 CIFAR_ResNet( (conv1): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False) (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) # <---------------------------------------- (layer1): Sequential( (0): PreActBlock( (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) # <---------------------------------------- (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False) (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False) (shortcut): Sequential() )
The text was updated successfully, but these errors were encountered:
No branches or pull requests
I'm reproducing this paper and code and I have one question.
At
model/resnet.py
, I think that bn-relu are duplicated in PreAct ResNet18.and
self.layer1
in CIFAR_ResNet isPreActBlock
shown belowI think the input of
PreActBlock
has already passed through bn-relu.When I printed this network,
The text was updated successfully, but these errors were encountered: