def __init__(self, in_channels, out_channels, expansion_factor, stride=1, bias=False, depthwise_bias=False, **kwargs): super().__init__() self.stride = stride hidden_channels = int(round(in_channels * expansion_factor)) if hidden_channels == in_channels: self.conv1 = ai8x.Empty() else: self.conv1 = ai8x.FusedConv2dBNReLU(in_channels, hidden_channels, 1, padding=0, bias=bias, **kwargs) if stride == 1: if depthwise_bias: self.conv2 = ai8x.FusedDepthwiseConv2dBNReLU( hidden_channels, hidden_channels, 3, padding=1, stride=stride, bias=depthwise_bias, **kwargs) else: self.conv2 = ai8x.FusedDepthwiseConv2dReLU(hidden_channels, hidden_channels, 3, padding=1, stride=stride, bias=depthwise_bias, **kwargs) else: if depthwise_bias: self.conv2 = ai8x.FusedMaxPoolDepthwiseConv2dBNReLU( hidden_channels, hidden_channels, 3, padding=1, pool_size=stride, pool_stride=stride, bias=depthwise_bias, **kwargs) else: self.conv2 = ai8x.FusedMaxPoolDepthwiseConv2dReLU( hidden_channels, hidden_channels, 3, padding=1, pool_size=stride, pool_stride=stride, bias=depthwise_bias, **kwargs) self.conv3 = ai8x.FusedConv2dBN(hidden_channels, out_channels, 1, bias=bias, **kwargs) if (stride == 1) and (in_channels == out_channels): self.resid = ai8x.Add() else: self.resid = self.NoResidual()
def __init__( self, num_classes=100, num_channels=3, dimensions=(32, 32), # pylint: disable=unused-argument bias=False, **kwargs): super().__init__() self.conv1 = ai8x.FusedConv2dReLU(num_channels, 16, 3, stride=1, padding=1, bias=bias, **kwargs) self.conv2 = ai8x.FusedConv2dReLU(16, 20, 3, stride=1, padding=1, bias=bias, **kwargs) self.conv3 = ai8x.FusedConv2dReLU(20, 20, 3, stride=1, padding=1, bias=bias, **kwargs) self.conv4 = ai8x.FusedConv2dReLU(20, 20, 3, stride=1, padding=1, bias=bias, **kwargs) self.resid1 = ai8x.Add() self.conv5 = ai8x.FusedMaxPoolConv2dReLU(20, 20, 3, pool_size=2, pool_stride=2, stride=1, padding=1, bias=bias, **kwargs) self.conv6 = ai8x.FusedConv2dReLU(20, 20, 3, stride=1, padding=1, bias=bias, **kwargs) self.resid2 = ai8x.Add() self.conv7 = ai8x.FusedConv2dReLU(20, 44, 3, stride=1, padding=1, bias=bias, **kwargs) self.conv8 = ai8x.FusedMaxPoolConv2dReLU(44, 48, 3, pool_size=2, pool_stride=2, stride=1, padding=1, bias=bias, **kwargs) self.conv9 = ai8x.FusedConv2dReLU(48, 48, 3, stride=1, padding=1, bias=bias, **kwargs) self.resid3 = ai8x.Add() self.conv10 = ai8x.FusedMaxPoolConv2dReLU(48, 96, 3, pool_size=2, pool_stride=2, stride=1, padding=1, bias=bias, **kwargs) self.conv11 = ai8x.FusedMaxPoolConv2dReLU(96, 512, 1, pool_size=2, pool_stride=2, padding=0, bias=bias, **kwargs) self.conv12 = ai8x.FusedConv2dReLU(512, 128, 1, stride=1, padding=0, bias=bias, **kwargs) self.conv13 = ai8x.FusedMaxPoolConv2dReLU(128, 128, 3, pool_size=2, pool_stride=2, stride=1, padding=1, bias=bias, **kwargs) self.conv14 = ai8x.Conv2d(128, num_classes, 1, stride=1, padding=0, bias=bias, wide=True, **kwargs)
def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, bias=False, se_ratio=None, expand_ratio=1, fused=False, **kwargs): super().__init__() self.has_se = (se_ratio is not None) and (0 < se_ratio <= 1) self.in_channels = in_channels self.out_channels = out_channels self.stride = stride self.expand_ratio = expand_ratio self.fused = fused # Expansion phase (Inverted Bottleneck) inp = in_channels # number of input channels out = in_channels * expand_ratio # number of output channels if expand_ratio != 1: if fused is True: self.expand_conv = ai8x.FusedConv2dBNReLU( inp, out, kernel_size=kernel_size, padding=1, batchnorm='Affine', bias=bias, eps=1e-03, momentum=0.01, **kwargs) else: self.expand_conv = ai8x.FusedConv2dBNReLU(inp, out, 1, batchnorm='Affine', bias=bias, eps=1e-03, momentum=0.01, **kwargs) # Depthwise Convolution phase if fused is not True: self.depthwise_conv = ai8x.FusedConv2dBNReLU( in_channels=out, out_channels=out, groups=out, # groups makes it depthwise padding=1, kernel_size=kernel_size, stride=stride, batchnorm='Affine', bias=bias, eps=1e-03, momentum=0.01, **kwargs) # Squeeze and Excitation phase if self.has_se: num_squeezed_channels = max(1, int(in_channels * se_ratio)) self.se_reduce = ai8x.FusedConv2dReLU( in_channels=out, out_channels=num_squeezed_channels, kernel_size=1, stride=1, bias=bias, **kwargs) self.se_expand = ai8x.Conv2d(in_channels=num_squeezed_channels, out_channels=out, kernel_size=1, stride=1, bias=bias, **kwargs) # Output Convolution phase final_out = out_channels self.project_conv = ai8x.FusedConv2dBN(in_channels=out, out_channels=final_out, kernel_size=1, batchnorm='Affine', bias=bias, eps=1e-03, momentum=0.01, **kwargs) # Skip connection self.resid = ai8x.Add()