Source code for nni.nas.pytorch.nasbench201.nasbench201_ops

import torch
import torch.nn as nn


[docs]class ReLUConvBN(nn.Module): """ Parameters --- C_in: int the number of input channels C_out: int the number of output channels stride: int stride of the convolution padding: int zero-padding added to both sides of the input dilation: int spacing between kernel elements bn_affine: bool If set to ``True``, ``torch.nn.BatchNorm2d`` will have learnable affine parameters. Default: True bn_momentun: float the value used for the running_mean and running_var computation. Default: 0.1 bn_track_running_stats: bool When set to ``True``, ``torch.nn.BatchNorm2d`` tracks the running mean and variance. Default: True """ def __init__(self, C_in, C_out, kernel_size, stride, padding, dilation, bn_affine=True, bn_momentum=0.1, bn_track_running_stats=True): super(ReLUConvBN, self).__init__() self.op = nn.Sequential( nn.ReLU(inplace=False), nn.Conv2d(C_in, C_out, kernel_size, stride=stride, padding=padding, dilation=dilation, bias=False), nn.BatchNorm2d(C_out, affine=bn_affine, momentum=bn_momentum, track_running_stats=bn_track_running_stats) )
[docs] def forward(self, x): """ Parameters --- x: torch.Tensor input tensor """ return self.op(x)
[docs]class Pooling(nn.Module): """ Parameters --- C_in: int the number of input channels C_out: int the number of output channels stride: int stride of the convolution bn_affine: bool If set to ``True``, ``torch.nn.BatchNorm2d`` will have learnable affine parameters. Default: True bn_momentun: float the value used for the running_mean and running_var computation. Default: 0.1 bn_track_running_stats: bool When set to ``True``, ``torch.nn.BatchNorm2d`` tracks the running mean and variance. Default: True """ def __init__(self, C_in, C_out, stride, bn_affine=True, bn_momentum=0.1, bn_track_running_stats=True): super(Pooling, self).__init__() if C_in == C_out: self.preprocess = None else: self.preprocess = ReLUConvBN(C_in, C_out, 1, 1, 0, 0, bn_affine, bn_momentum, bn_track_running_stats) self.op = nn.AvgPool2d(3, stride=stride, padding=1, count_include_pad=False)
[docs] def forward(self, x): """ Parameters --- x: torch.Tensor input tensor """ if self.preprocess: x = self.preprocess(x) return self.op(x)
[docs]class Zero(nn.Module): """ Parameters --- C_in: int the number of input channels C_out: int the number of output channels stride: int stride of the convolution """ def __init__(self, C_in, C_out, stride): super(Zero, self).__init__() self.C_in = C_in self.C_out = C_out self.stride = stride self.is_zero = True
[docs] def forward(self, x): """ Parameters --- x: torch.Tensor input tensor """ if self.C_in == self.C_out: if self.stride == 1: return x.mul(0.) else: return x[:, :, ::self.stride, ::self.stride].mul(0.) else: shape = list(x.shape) shape[1] = self.C_out zeros = x.new_zeros(shape, dtype=x.dtype, device=x.device) return zeros
class FactorizedReduce(nn.Module): def __init__(self, C_in, C_out, stride, bn_affine=True, bn_momentum=0.1, bn_track_running_stats=True): super(FactorizedReduce, self).__init__() self.stride = stride self.C_in = C_in self.C_out = C_out self.relu = nn.ReLU(inplace=False) if stride == 2: C_outs = [C_out // 2, C_out - C_out // 2] self.convs = nn.ModuleList() for i in range(2): self.convs.append(nn.Conv2d(C_in, C_outs[i], 1, stride=stride, padding=0, bias=False)) self.pad = nn.ConstantPad2d((0, 1, 0, 1), 0) else: raise ValueError("Invalid stride : {:}".format(stride)) self.bn = nn.BatchNorm2d(C_out, affine=bn_affine, momentum=bn_momentum, track_running_stats=bn_track_running_stats) def forward(self, x): x = self.relu(x) y = self.pad(x) out = torch.cat([self.convs[0](x), self.convs[1](y[:, :, 1:, 1:])], dim=1) out = self.bn(out) return out