stride_first: original resnet put stride on first conv. fb.resnet.torch put stride on second conv.
(l, ch_out, stride, stride_first=False)
| 75 | |
| 76 | |
| 77 | def resnet_bottleneck(l, ch_out, stride, stride_first=False): |
| 78 | """ |
| 79 | stride_first: original resnet put stride on first conv. fb.resnet.torch put stride on second conv. |
| 80 | """ |
| 81 | shortcut = l |
| 82 | l = Conv2D('conv1', l, ch_out, 1, strides=stride if stride_first else 1, activation=BNReLU) |
| 83 | l = Conv2D('conv2', l, ch_out, 3, strides=1 if stride_first else stride, activation=BNReLU) |
| 84 | l = Conv2D('conv3', l, ch_out * 4, 1, activation=get_bn(zero_init=True)) |
| 85 | out = l + resnet_shortcut(shortcut, ch_out * 4, stride, activation=get_bn(zero_init=False)) |
| 86 | return tf.nn.relu(out) |
| 87 | |
| 88 | |
| 89 | def se_bottleneck(l, ch_out, stride): |
nothing calls this directly
no test coverage detected