def test_SeparableConv2d_gpu(self): separ_conv = autograd.SeparableConv2d(8, 16, 3, padding=1) x = np.random.random((10, 8, 28, 28)).astype(np.float32) x = tensor.Tensor(device=gpu_dev, data=x) #y = separ_conv(x) y1 = separ_conv.spacial_conv(x) y2 = separ_conv.depth_conv(y1) dy1, dW_depth, _ = y2.creator.backward(y2.data) dx, dW_spacial, _ = y1.creator.backward(dy1) self.check_shape(y2.shape, (10, 16, 28, 28)) self.check_shape(dy1.shape(), (10, 8, 28, 28)) self.check_shape(dW_depth.shape(), (16, 8, 1, 1)) self.check_shape(dx.shape(), (10, 8, 28, 28)) self.check_shape(dW_spacial.shape(), (8, 1, 3, 3))
def __init__(self, in_filters, out_filters, reps, strides=1, padding=0, start_with_relu=True, grow_first=True): super(Block, self).__init__() if out_filters != in_filters or strides != 1: self.skip = autograd.Conv2d(in_filters, out_filters, 1, stride=strides, padding=padding, bias=False) self.skipbn = autograd.BatchNorm2d(out_filters) else: self.skip = None self.layers = [] filters = in_filters if grow_first: self.layers.append(autograd.ReLU()) self.layers.append( autograd.SeparableConv2d(in_filters, out_filters, 3, stride=1, padding=1, bias=False)) self.layers.append(autograd.BatchNorm2d(out_filters)) filters = out_filters for i in range(reps - 1): self.layers.append(autograd.ReLU()) self.layers.append( autograd.SeparableConv2d(filters, filters, 3, stride=1, padding=1, bias=False)) self.layers.append(autograd.BatchNorm2d(filters)) if not grow_first: self.layers.append(autograd.ReLU()) self.layers.append( autograd.SeparableConv2d(in_filters, out_filters, 3, stride=1, padding=1, bias=False)) self.layers.append(autograd.BatchNorm2d(out_filters)) if not start_with_relu: self.layers = self.layers[1:] else: self.layers[0] = autograd.ReLU() if strides != 1: self.layers.append(autograd.MaxPool2d(3, strides, padding + 1))
def __init__(self, num_classes=1000): """ Constructor Args: num_classes: number of classes """ super(Xception, self).__init__() self.num_classes = num_classes self.conv1 = autograd.Conv2d(3, 32, 3, 2, 0, bias=False) self.bn1 = autograd.BatchNorm2d(32) self.conv2 = autograd.Conv2d(32, 64, 3, 1, 1, bias=False) self.bn2 = autograd.BatchNorm2d(64) # do relu here self.block1 = Block(64, 128, 2, 2, padding=0, start_with_relu=False, grow_first=True) self.block2 = Block(128, 256, 2, 2, padding=0, start_with_relu=True, grow_first=True) self.block3 = Block(256, 728, 2, 2, padding=0, start_with_relu=True, grow_first=True) self.block4 = Block(728, 728, 3, 1, start_with_relu=True, grow_first=True) self.block5 = Block(728, 728, 3, 1, start_with_relu=True, grow_first=True) self.block6 = Block(728, 728, 3, 1, start_with_relu=True, grow_first=True) self.block7 = Block(728, 728, 3, 1, start_with_relu=True, grow_first=True) self.block8 = Block(728, 728, 3, 1, start_with_relu=True, grow_first=True) self.block9 = Block(728, 728, 3, 1, start_with_relu=True, grow_first=True) self.block10 = Block(728, 728, 3, 1, start_with_relu=True, grow_first=True) self.block11 = Block(728, 728, 3, 1, start_with_relu=True, grow_first=True) self.block12 = Block(728, 1024, 2, 2, start_with_relu=True, grow_first=False) self.conv3 = autograd.SeparableConv2d(1024, 1536, 3, 1, 1) self.bn3 = autograd.BatchNorm2d(1536) # do relu here self.conv4 = autograd.SeparableConv2d(1536, 2048, 3, 1, 1) self.bn4 = autograd.BatchNorm2d(2048) self.globalpooling = autograd.MaxPool2d(10, 1) self.fc = autograd.Linear(2048, num_classes)