in utils/symbol/symbol_densenet.py [0:0]
def get_before_pool(depth, ratio=-1, use_fp16=False):
data = mx.symbol.Variable(name="data")
data = mx.sym.Cast(data=data, dtype=np.float16) if use_fp16 else data
# define densenet
width, inc, k_sec = densenet_spec[depth]
mid = int(4*inc)
# ---------
# stage 1
conv1_x = Conv_BN_ACT(data=data, num_filter=width, kernel=(7, 7), pad=(3, 3), stride=(2, 2), name='conv1')
conv2_x = mx.symbol.Pooling(data=conv1_x, pool_type="max", kernel=(3, 3), pad=(1,1), stride=(2, 2), name='pool1')
conv2_x = (conv2_x, None) if ratio >= 0 else conv2_x
# stage 2
for i in range(1, k_sec[2]+1):
conv2_x = DenseBlock(conv2_x, mid, inc, 'L2_B%02d'%i, ratio=ratio)
width += inc
# stage 3
width = int(width/2)
conv3_x = Connector(conv2_x, width, 'L3_Trans', ratio=ratio)
for i in range(1, k_sec[3]+1):
conv3_x = DenseBlock(conv3_x, mid, inc, 'L3_B%02d'%i, ratio=ratio)
width += inc
# stage 4
width = int(width/2)
conv4_x = Connector(conv3_x, width, 'L4_Trans', ratio=ratio)
for i in range(1, k_sec[4]+1):
conv4_x = DenseBlock(conv4_x, mid, inc, 'L4_B%02d'%i, ratio=ratio)
width += inc
# stage 5
width = int(width/2)
conv5_x = Connector(conv4_x, width, 'L5_Trans', ratio=min(ratio,0.)) # force to 0. because the shape is 7x7
for i in range(1, k_sec[5]+1):
# ratio is forced to be 0. for the last stage
# (because do 3x3 conv on 3.5x3.5 resolution map does not make sense)
conv5_x = DenseBlock(conv5_x, mid, inc, 'L5_B%02d'%i, ratio=min(ratio,0.))
width += inc
# ---------
# output
output = BN_ACT(data=conv5_x, name="tail")
output = mx.sym.Cast(data=output, dtype=np.float32) if use_fp16 else output
return output