ResNet:网络复现
手画网络结构终归不如直接实现一遍搞得清楚,直接上网络结构代码,Res-152改良版(根据后续版本,残差块里的“卷积、批量归一化和激活”结构改成了“批量归一化、激活和卷积”) # Mxnet 实现 # 残差模块 class Residual(nn.Block): def __init__(self, num_channels, num_channels_out, use_1x1conv=False, strides=1, **kwargs): super(Residual, self).__init__(**kwargs) self.conv1 = nn.Conv2D(num_channels, kernel_size=1) self.conv2 = nn.Conv2D(num_channels, kernel_size=3, padding=1, strides=strides) self.conv3 = nn.Conv2D(num_channels, kernel_size=1) if use_1x1conv: self.conv4 = nn.Conv2D(num_channels, kernel_size=1, strides=strides) else: self.conv4 = None self.bn1 = nn.BatchNorm() self.bn2 = nn.BatchNorm() self.bn3 = nn.BatchNorm() def forward(self, X): Y = self.conv1(nd.relu(self.bn1(X))) Y = self.conv2(nd.relu(self.bn2(Y))) Y = self.conv3(nd.relu(self.bn3(Y))) if self.conv4: X = self.conv4(X) return nd.relu(Y + X) # 残差层 def resnet_block(num_channels, num_channels_out, num_residuals, first_block=False): blk = nn.Sequential() for i in range(num_residuals): if i == 0 and not first_block: blk.add(Residual(num_channels, num_channels_out, use_1x1conv=True, strides=2)) else: blk.add(Residual(num_channels, num_channels_out))...