(image, num_blocks, group_func, block_func)
| 122 | |
| 123 | |
| 124 | def resnet_backbone(image, num_blocks, group_func, block_func): |
| 125 | with argscope(Conv2D, use_bias=False, |
| 126 | kernel_initializer=tf.variance_scaling_initializer(scale=2.0, mode='fan_out')): |
| 127 | # Note that TF pads the image by [2, 3] instead of [3, 2]. |
| 128 | # Similar things happen in later stride=2 layers as well. |
| 129 | l = Conv2D('conv0', image, 64, 7, strides=2, activation=BNReLU) |
| 130 | l = MaxPooling('pool0', l, pool_size=3, strides=2, padding='SAME') |
| 131 | l = group_func('group0', l, block_func, 64, num_blocks[0], 1) |
| 132 | l = group_func('group1', l, block_func, 128, num_blocks[1], 2) |
| 133 | l = group_func('group2', l, block_func, 256, num_blocks[2], 2) |
| 134 | l = group_func('group3', l, block_func, 512, num_blocks[3], 2) |
| 135 | l = GlobalAvgPooling('gap', l) |
| 136 | logits = FullyConnected('linear', l, 1000, |
| 137 | kernel_initializer=tf.random_normal_initializer(stddev=0.01)) |
| 138 | return logits |
no test coverage detected