| import mxnet as mx |
| |
| def get_symbol(num_classes=1000, **kwargs): |
| """ |
| VGG 16 layers network |
| This is a modified version, with fc6/fc7 layers replaced by conv layers |
| And the network is slightly smaller than original VGG 16 network |
| """ |
| data = mx.symbol.Variable(name="data") |
| label = mx.symbol.Variable(name="label") |
| |
| # group 1 |
| conv1_1 = mx.symbol.Convolution( |
| data=data, kernel=(3, 3), pad=(1, 1), num_filter=64, name="conv1_1") |
| relu1_1 = mx.symbol.Activation(data=conv1_1, act_type="relu", name="relu1_1") |
| conv1_2 = mx.symbol.Convolution( |
| data=relu1_1, kernel=(3, 3), pad=(1, 1), num_filter=64, name="conv1_2") |
| relu1_2 = mx.symbol.Activation(data=conv1_2, act_type="relu", name="relu1_2") |
| pool1 = mx.symbol.Pooling( |
| data=relu1_2, pool_type="max", kernel=(2, 2), stride=(2, 2), name="pool1") |
| # group 2 |
| conv2_1 = mx.symbol.Convolution( |
| data=pool1, kernel=(3, 3), pad=(1, 1), num_filter=128, name="conv2_1") |
| relu2_1 = mx.symbol.Activation(data=conv2_1, act_type="relu", name="relu2_1") |
| conv2_2 = mx.symbol.Convolution( |
| data=relu2_1, kernel=(3, 3), pad=(1, 1), num_filter=128, name="conv2_2") |
| relu2_2 = mx.symbol.Activation(data=conv2_2, act_type="relu", name="relu2_2") |
| pool2 = mx.symbol.Pooling( |
| data=relu2_2, pool_type="max", kernel=(2, 2), stride=(2, 2), name="pool2") |
| # group 3 |
| conv3_1 = mx.symbol.Convolution( |
| data=pool2, kernel=(3, 3), pad=(1, 1), num_filter=256, name="conv3_1") |
| relu3_1 = mx.symbol.Activation(data=conv3_1, act_type="relu", name="relu3_1") |
| conv3_2 = mx.symbol.Convolution( |
| data=relu3_1, kernel=(3, 3), pad=(1, 1), num_filter=256, name="conv3_2") |
| relu3_2 = mx.symbol.Activation(data=conv3_2, act_type="relu", name="relu3_2") |
| conv3_3 = mx.symbol.Convolution( |
| data=relu3_2, kernel=(3, 3), pad=(1, 1), num_filter=256, name="conv3_3") |
| relu3_3 = mx.symbol.Activation(data=conv3_3, act_type="relu", name="relu3_3") |
| pool3 = mx.symbol.Pooling( |
| data=relu3_3, pool_type="max", kernel=(2, 2), stride=(2, 2), \ |
| pooling_convention="full", name="pool3") |
| # group 4 |
| conv4_1 = mx.symbol.Convolution( |
| data=pool3, kernel=(3, 3), pad=(1, 1), num_filter=512, name="conv4_1") |
| relu4_1 = mx.symbol.Activation(data=conv4_1, act_type="relu", name="relu4_1") |
| conv4_2 = mx.symbol.Convolution( |
| data=relu4_1, kernel=(3, 3), pad=(1, 1), num_filter=512, name="conv4_2") |
| relu4_2 = mx.symbol.Activation(data=conv4_2, act_type="relu", name="relu4_2") |
| conv4_3 = mx.symbol.Convolution( |
| data=relu4_2, kernel=(3, 3), pad=(1, 1), num_filter=512, name="conv4_3") |
| relu4_3 = mx.symbol.Activation(data=conv4_3, act_type="relu", name="relu4_3") |
| pool4 = mx.symbol.Pooling( |
| data=relu4_3, pool_type="max", kernel=(2, 2), stride=(2, 2), name="pool4") |
| # group 5 |
| conv5_1 = mx.symbol.Convolution( |
| data=pool4, kernel=(3, 3), pad=(1, 1), num_filter=512, name="conv5_1") |
| relu5_1 = mx.symbol.Activation(data=conv5_1, act_type="relu", name="relu5_1") |
| conv5_2 = mx.symbol.Convolution( |
| data=relu5_1, kernel=(3, 3), pad=(1, 1), num_filter=512, name="conv5_2") |
| relu5_2 = mx.symbol.Activation(data=conv5_2, act_type="relu", name="relu5_2") |
| conv5_3 = mx.symbol.Convolution( |
| data=relu5_2, kernel=(3, 3), pad=(1, 1), num_filter=512, name="conv5_3") |
| relu5_3 = mx.symbol.Activation(data=conv5_3, act_type="relu", name="relu5_3") |
| pool5 = mx.symbol.Pooling( |
| data=relu5_3, pool_type="max", kernel=(3, 3), stride=(1, 1), |
| pad=(1,1), name="pool5") |
| # group 6 |
| conv6 = mx.symbol.Convolution( |
| data=pool5, kernel=(3, 3), pad=(6, 6), dilate=(6, 6), |
| num_filter=1024, name="fc6") |
| relu6 = mx.symbol.Activation(data=conv6, act_type="relu", name="relu6") |
| # drop6 = mx.symbol.Dropout(data=relu6, p=0.5, name="drop6") |
| # group 7 |
| conv7 = mx.symbol.Convolution( |
| data=relu6, kernel=(1, 1), pad=(0, 0), num_filter=1024, name="fc7") |
| relu7 = mx.symbol.Activation(data=conv7, act_type="relu", name="relu7") |
| # drop7 = mx.symbol.Dropout(data=relu7, p=0.5, name="drop7") |
| |
| gpool = mx.symbol.Pooling(data=relu7, pool_type='avg', kernel=(7, 7), |
| global_pool=True, name='global_pool') |
| conv8 = mx.symbol.Convolution(data=gpool, num_filter=num_classes, kernel=(1, 1), |
| name='fc8') |
| flat = mx.symbol.Flatten(data=conv8) |
| softmax = mx.symbol.SoftmaxOutput(data=flat, name='softmax') |
| return softmax |