提交 4465d27a 编写于 作者: C cuicheng01

update resnet&pp-lcnet

上级 5d9d2395
...@@ -94,13 +94,16 @@ class ConvBNLayer(TheseusLayer): ...@@ -94,13 +94,16 @@ class ConvBNLayer(TheseusLayer):
stride=stride, stride=stride,
padding=(filter_size - 1) // 2, padding=(filter_size - 1) // 2,
groups=num_groups, groups=num_groups,
weight_attr=ParamAttr(initializer=KaimingNormal(), learning_rate=lr_mult), weight_attr=ParamAttr(
initializer=KaimingNormal(), learning_rate=lr_mult),
bias_attr=False) bias_attr=False)
self.bn = BatchNorm2D( self.bn = BatchNorm2D(
num_filters, num_filters,
weight_attr=ParamAttr(regularizer=L2Decay(0.0), learning_rate=lr_mult), weight_attr=ParamAttr(
bias_attr=ParamAttr(regularizer=L2Decay(0.0), learning_rate=lr_mult)) regularizer=L2Decay(0.0), learning_rate=lr_mult),
bias_attr=ParamAttr(
regularizer=L2Decay(0.0), learning_rate=lr_mult))
self.hardswish = nn.Hardswish() self.hardswish = nn.Hardswish()
def forward(self, x): def forward(self, x):
...@@ -128,8 +131,7 @@ class DepthwiseSeparable(TheseusLayer): ...@@ -128,8 +131,7 @@ class DepthwiseSeparable(TheseusLayer):
num_groups=num_channels, num_groups=num_channels,
lr_mult=lr_mult) lr_mult=lr_mult)
if use_se: if use_se:
self.se = SEModule(num_channels, self.se = SEModule(num_channels, lr_mult=lr_mult)
lr_mult=lr_mult)
self.pw_conv = ConvBNLayer( self.pw_conv = ConvBNLayer(
num_channels=num_channels, num_channels=num_channels,
filter_size=1, filter_size=1,
...@@ -216,8 +218,9 @@ class PPLCNet(TheseusLayer): ...@@ -216,8 +218,9 @@ class PPLCNet(TheseusLayer):
assert len(self.stride_list assert len(self.stride_list
) == 5, "stride_list length should be 5 but got {}".format( ) == 5, "stride_list length should be 5 but got {}".format(
len(self.stride_list)) len(self.stride_list))
for i, stride in enumerate(stride_list[1:]): for i, stride in enumerate(stride_list[1:]):
self.net_config["blocks{}".format(i+3)][0][3] = stride self.net_config["blocks{}".format(i + 3)][0][3] = stride
self.conv1 = ConvBNLayer( self.conv1 = ConvBNLayer(
num_channels=3, num_channels=3,
filter_size=3, filter_size=3,
...@@ -225,7 +228,7 @@ class PPLCNet(TheseusLayer): ...@@ -225,7 +228,7 @@ class PPLCNet(TheseusLayer):
stride=stride_list[0], stride=stride_list[0],
lr_mult=self.lr_mult_list[0]) lr_mult=self.lr_mult_list[0])
self.blocks2 = nn.Sequential(* [ self.blocks2 = nn.Sequential(*[
DepthwiseSeparable( DepthwiseSeparable(
num_channels=make_divisible(in_c * scale), num_channels=make_divisible(in_c * scale),
num_filters=make_divisible(out_c * scale), num_filters=make_divisible(out_c * scale),
...@@ -233,10 +236,11 @@ class PPLCNet(TheseusLayer): ...@@ -233,10 +236,11 @@ class PPLCNet(TheseusLayer):
stride=s, stride=s,
use_se=se, use_se=se,
lr_mult=self.lr_mult_list[1]) lr_mult=self.lr_mult_list[1])
for i, (k, in_c, out_c, s, se) in enumerate(self.net_config["blocks2"]) for i, (k, in_c, out_c, s, se
) in enumerate(self.net_config["blocks2"])
]) ])
self.blocks3 = nn.Sequential(* [ self.blocks3 = nn.Sequential(*[
DepthwiseSeparable( DepthwiseSeparable(
num_channels=make_divisible(in_c * scale), num_channels=make_divisible(in_c * scale),
num_filters=make_divisible(out_c * scale), num_filters=make_divisible(out_c * scale),
...@@ -244,10 +248,11 @@ class PPLCNet(TheseusLayer): ...@@ -244,10 +248,11 @@ class PPLCNet(TheseusLayer):
stride=s, stride=s,
use_se=se, use_se=se,
lr_mult=self.lr_mult_list[2]) lr_mult=self.lr_mult_list[2])
for i, (k, in_c, out_c, s, se) in enumerate(self.net_config["blocks3"]) for i, (k, in_c, out_c, s, se
) in enumerate(self.net_config["blocks3"])
]) ])
self.blocks4 = nn.Sequential(* [ self.blocks4 = nn.Sequential(*[
DepthwiseSeparable( DepthwiseSeparable(
num_channels=make_divisible(in_c * scale), num_channels=make_divisible(in_c * scale),
num_filters=make_divisible(out_c * scale), num_filters=make_divisible(out_c * scale),
...@@ -255,10 +260,11 @@ class PPLCNet(TheseusLayer): ...@@ -255,10 +260,11 @@ class PPLCNet(TheseusLayer):
stride=s, stride=s,
use_se=se, use_se=se,
lr_mult=self.lr_mult_list[3]) lr_mult=self.lr_mult_list[3])
for i, (k, in_c, out_c, s, se) in enumerate(self.net_config["blocks4"]) for i, (k, in_c, out_c, s, se
) in enumerate(self.net_config["blocks4"])
]) ])
self.blocks5 = nn.Sequential(* [ self.blocks5 = nn.Sequential(*[
DepthwiseSeparable( DepthwiseSeparable(
num_channels=make_divisible(in_c * scale), num_channels=make_divisible(in_c * scale),
num_filters=make_divisible(out_c * scale), num_filters=make_divisible(out_c * scale),
...@@ -266,10 +272,11 @@ class PPLCNet(TheseusLayer): ...@@ -266,10 +272,11 @@ class PPLCNet(TheseusLayer):
stride=s, stride=s,
use_se=se, use_se=se,
lr_mult=self.lr_mult_list[4]) lr_mult=self.lr_mult_list[4])
for i, (k, in_c, out_c, s, se) in enumerate(self.net_config["blocks5"]) for i, (k, in_c, out_c, s, se
) in enumerate(self.net_config["blocks5"])
]) ])
self.blocks6 = nn.Sequential(* [ self.blocks6 = nn.Sequential(*[
DepthwiseSeparable( DepthwiseSeparable(
num_channels=make_divisible(in_c * scale), num_channels=make_divisible(in_c * scale),
num_filters=make_divisible(out_c * scale), num_filters=make_divisible(out_c * scale),
...@@ -277,13 +284,15 @@ class PPLCNet(TheseusLayer): ...@@ -277,13 +284,15 @@ class PPLCNet(TheseusLayer):
stride=s, stride=s,
use_se=se, use_se=se,
lr_mult=self.lr_mult_list[5]) lr_mult=self.lr_mult_list[5])
for i, (k, in_c, out_c, s, se) in enumerate(self.net_config["blocks6"]) for i, (k, in_c, out_c, s, se
) in enumerate(self.net_config["blocks6"])
]) ])
self.avg_pool = AdaptiveAvgPool2D(1) self.avg_pool = AdaptiveAvgPool2D(1)
if self.use_last_conv: if self.use_last_conv:
self.last_conv = Conv2D( self.last_conv = Conv2D(
in_channels=make_divisible(self.net_config["blocks6"][-1][2] * scale), in_channels=make_divisible(self.net_config["blocks6"][-1][2] *
scale),
out_channels=self.class_expand, out_channels=self.class_expand,
kernel_size=1, kernel_size=1,
stride=1, stride=1,
...@@ -294,7 +303,9 @@ class PPLCNet(TheseusLayer): ...@@ -294,7 +303,9 @@ class PPLCNet(TheseusLayer):
else: else:
self.last_conv = None self.last_conv = None
self.flatten = nn.Flatten(start_axis=1, stop_axis=-1) self.flatten = nn.Flatten(start_axis=1, stop_axis=-1)
self.fc = Linear(self.class_expand if self.use_last_conv else make_divisible(self.net_config["blocks6"][-1][2]), class_num) self.fc = Linear(
self.class_expand if self.use_last_conv else
make_divisible(self.net_config["blocks6"][-1][2]), class_num)
super().init_res( super().init_res(
stages_pattern, stages_pattern,
......
...@@ -20,7 +20,7 @@ import numpy as np ...@@ -20,7 +20,7 @@ import numpy as np
import paddle import paddle
from paddle import ParamAttr from paddle import ParamAttr
import paddle.nn as nn import paddle.nn as nn
from paddle.nn import Conv2D, BatchNorm, Linear, BatchNorm2D from paddle.nn import Conv2D, BatchNorm, Linear
from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D from paddle.nn import AdaptiveAvgPool2D, MaxPool2D, AvgPool2D
from paddle.nn.initializer import Uniform from paddle.nn.initializer import Uniform
from paddle.regularizer import L2Decay from paddle.regularizer import L2Decay
...@@ -134,9 +134,6 @@ class ConvBNLayer(TheseusLayer): ...@@ -134,9 +134,6 @@ class ConvBNLayer(TheseusLayer):
bias_attr=False, bias_attr=False,
data_format=data_format) data_format=data_format)
weight_attr = ParamAttr(learning_rate=lr_mult, trainable=True)
bias_attr = ParamAttr(learning_rate=lr_mult, trainable=True)
self.bn = BatchNorm( self.bn = BatchNorm(
num_filters, num_filters,
param_attr=ParamAttr(learning_rate=lr_mult), param_attr=ParamAttr(learning_rate=lr_mult),
...@@ -324,11 +321,11 @@ class ResNet(TheseusLayer): ...@@ -324,11 +321,11 @@ class ResNet(TheseusLayer):
self.stem_cfg = { self.stem_cfg = {
#num_channels, num_filters, filter_size, stride #num_channels, num_filters, filter_size, stride
"vb": [[input_image_channel, 64, 7, self.stride_list[0]]], "vb": [[input_image_channel, 64, 7, self.stride_list[0]]],
"vd": "vd": [[input_image_channel, 32, 3, self.stride_list[0]],
[[input_image_channel, 32, 3, self.stride_list[0]], [32, 32, 3, 1], [32, 64, 3, 1]] [32, 32, 3, 1], [32, 64, 3, 1]]
} }
self.stem = nn.Sequential(* [ self.stem = nn.Sequential(*[
ConvBNLayer( ConvBNLayer(
num_channels=in_c, num_channels=in_c,
num_filters=out_c, num_filters=out_c,
...@@ -341,7 +338,10 @@ class ResNet(TheseusLayer): ...@@ -341,7 +338,10 @@ class ResNet(TheseusLayer):
]) ])
self.max_pool = MaxPool2D( self.max_pool = MaxPool2D(
kernel_size=3, stride=stride_list[1], padding=1, data_format=data_format) kernel_size=3,
stride=stride_list[1],
padding=1,
data_format=data_format)
block_list = [] block_list = []
for block_idx in range(len(self.block_depth)): for block_idx in range(len(self.block_depth)):
shortcut = False shortcut = False
...@@ -350,7 +350,8 @@ class ResNet(TheseusLayer): ...@@ -350,7 +350,8 @@ class ResNet(TheseusLayer):
num_channels=self.num_channels[block_idx] if i == 0 else num_channels=self.num_channels[block_idx] if i == 0 else
self.num_filters[block_idx] * self.channels_mult, self.num_filters[block_idx] * self.channels_mult,
num_filters=self.num_filters[block_idx], num_filters=self.num_filters[block_idx],
stride=self.stride_list[block_idx+1] if i == 0 and block_idx != 0 else 1, stride=self.stride_list[block_idx + 1]
if i == 0 and block_idx != 0 else 1,
shortcut=shortcut, shortcut=shortcut,
if_first=block_idx == i == 0 if version == "vd" else True, if_first=block_idx == i == 0 if version == "vd" else True,
lr_mult=self.lr_mult_list[block_idx + 1], lr_mult=self.lr_mult_list[block_idx + 1],
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册