| 23 | |
| 24 | |
| 25 | class Block(layer.Layer): |
| 26 | |
| 27 | def __init__(self, |
| 28 | in_filters, |
| 29 | out_filters, |
| 30 | reps, |
| 31 | strides=1, |
| 32 | padding=0, |
| 33 | start_with_relu=True, |
| 34 | grow_first=True): |
| 35 | super(Block, self).__init__() |
| 36 | |
| 37 | if out_filters != in_filters or strides != 1: |
| 38 | self.skip = layer.Conv2d(in_filters, |
| 39 | out_filters, |
| 40 | 1, |
| 41 | stride=strides, |
| 42 | padding=padding, |
| 43 | bias=False) |
| 44 | self.skipbn = layer.BatchNorm2d(out_filters) |
| 45 | else: |
| 46 | self.skip = None |
| 47 | |
| 48 | self.layers = [] |
| 49 | |
| 50 | filters = in_filters |
| 51 | if grow_first: |
| 52 | self.layers.append(layer.ReLU()) |
| 53 | self.layers.append( |
| 54 | layer.SeparableConv2d(in_filters, |
| 55 | out_filters, |
| 56 | 3, |
| 57 | stride=1, |
| 58 | padding=1, |
| 59 | bias=False)) |
| 60 | self.layers.append(layer.BatchNorm2d(out_filters)) |
| 61 | filters = out_filters |
| 62 | |
| 63 | for i in range(reps - 1): |
| 64 | self.layers.append(layer.ReLU()) |
| 65 | self.layers.append( |
| 66 | layer.SeparableConv2d(filters, |
| 67 | filters, |
| 68 | 3, |
| 69 | stride=1, |
| 70 | padding=1, |
| 71 | bias=False)) |
| 72 | self.layers.append(layer.BatchNorm2d(filters)) |
| 73 | |
| 74 | if not grow_first: |
| 75 | self.layers.append(layer.ReLU()) |
| 76 | self.layers.append( |
| 77 | layer.SeparableConv2d(in_filters, |
| 78 | out_filters, |
| 79 | 3, |
| 80 | stride=1, |
| 81 | padding=1, |
| 82 | bias=False)) |