57 lines
1.9 KiB
Python
57 lines
1.9 KiB
Python
from paddle.nn import Conv2D, Identity
|
|
|
|
from ..legendary_models.pp_lcnet_v2 import MODEL_URLS, PPLCNetV2_base, RepDepthwiseSeparable, _load_pretrained
|
|
|
|
__all__ = ["PPLCNetV2_base_ShiTu"]
|
|
|
|
|
|
def PPLCNetV2_base_ShiTu(pretrained=False, use_ssld=False, **kwargs):
|
|
"""
|
|
An variant network of PPLCNetV2_base
|
|
1. remove ReLU layer after last_conv
|
|
2. add bias to last_conv
|
|
3. change stride to 1 in last two RepDepthwiseSeparable Block
|
|
"""
|
|
model = PPLCNetV2_base(pretrained=False, use_ssld=use_ssld, **kwargs)
|
|
|
|
def remove_ReLU_function(conv, pattern):
|
|
new_conv = Identity()
|
|
return new_conv
|
|
|
|
def add_bias_last_conv(conv, pattern):
|
|
new_conv = Conv2D(
|
|
in_channels=conv._in_channels,
|
|
out_channels=conv._out_channels,
|
|
kernel_size=conv._kernel_size,
|
|
stride=conv._stride,
|
|
padding=conv._padding,
|
|
groups=conv._groups,
|
|
bias_attr=True)
|
|
return new_conv
|
|
|
|
def last_stride_function(rep_block, pattern):
|
|
new_conv = RepDepthwiseSeparable(
|
|
in_channels=rep_block.in_channels,
|
|
out_channels=rep_block.out_channels,
|
|
stride=1,
|
|
dw_size=rep_block.dw_size,
|
|
split_pw=rep_block.split_pw,
|
|
use_rep=rep_block.use_rep,
|
|
use_se=rep_block.use_se,
|
|
use_shortcut=rep_block.use_shortcut)
|
|
return new_conv
|
|
|
|
pattern_act = ["act"]
|
|
pattern_lastconv = ["last_conv"]
|
|
pattern_last_stride = [
|
|
"stages[3][0]",
|
|
"stages[3][1]",
|
|
]
|
|
model.upgrade_sublayer(pattern_act, remove_ReLU_function)
|
|
model.upgrade_sublayer(pattern_lastconv, add_bias_last_conv)
|
|
model.upgrade_sublayer(pattern_last_stride, last_stride_function)
|
|
|
|
# load params again after upgrade some layers
|
|
_load_pretrained(pretrained, model, MODEL_URLS["PPLCNetV2_base"], use_ssld)
|
|
return model
|