|
- import paddle.fluid as fluid
- import math
-
- class DistResNet():
- def __init__(self, is_train=True):
-
- self.is_train = is_train
- self.weight_decay = 1e-4
-
- def infer(self, input, class_dim=10):
-
- depth = [3, 3, 3, 3]
- num_filters = [16, 16, 32, 64]
-
- conv = self.conv_bn_layer(
- input=input, num_filters=16, filter_size=3, act='elu')
- conv = fluid.layers.pool2d(
- input=conv,
- pool_size=3,
- pool_stride=2,
- pool_padding=1,
- pool_type='max')
-
- for block in range(len(depth)):
- for i in range(depth[block]):
- conv = self.bottleneck_block(
- input=conv,
- num_filters=num_filters[block],
- stride=2 if i == 0 and block != 0 else 1)
- conv = fluid.layers.batch_norm(input=conv, act='elu')
- print(conv.shape)
- pool = fluid.layers.pool2d(
- input=conv, pool_size=4, pool_type='avg', global_pooling=True)
- stdv = 1.0 / math.sqrt(pool.shape[1] * 1.0)
- out = fluid.layers.fc(input=pool,
- size=class_dim,
- act="softmax",
- param_attr=fluid.param_attr.ParamAttr(
- initializer=fluid.initializer.Uniform(-stdv,
- stdv),
- regularizer=fluid.regularizer.L2Decay(self.weight_decay)),
- bias_attr=fluid.ParamAttr(
- regularizer=fluid.regularizer.L2Decay(self.weight_decay))
- )
- return out
-
- def conv_bn_layer(self,
- input,
- num_filters,
- filter_size,
- stride=1,
- groups=1,
- act=None,
- bn_init_value=1.0):
- conv = fluid.layers.conv2d(
- input=input,
- num_filters=num_filters,
- filter_size=filter_size,
- stride=stride,
- padding=(filter_size - 1) // 2,
- groups=groups,
- act=None,
- bias_attr=False,
- param_attr=fluid.ParamAttr(regularizer=fluid.regularizer.L2Decay(self.weight_decay)))
- return fluid.layers.batch_norm(
- input=conv, act=act, is_test=not self.is_train,
- param_attr=fluid.ParamAttr(
- initializer=fluid.initializer.Constant(bn_init_value),
- regularizer=None))
-
- def shortcut(self, input, ch_out, stride):
- ch_in = input.shape[1]
- if ch_in != ch_out or stride != 1:
- return self.conv_bn_layer(input, ch_out, 1, stride)
- else:
- return input
-
- def bottleneck_block(self, input, num_filters, stride):
- conv0 = self.conv_bn_layer(
- input=input, num_filters=num_filters, filter_size=1, act='elu')
- conv1 = self.conv_bn_layer(
- input=conv0,
- num_filters=num_filters,
- filter_size=3,
- stride=stride,
- act='elu')
- conv2 = self.conv_bn_layer(
- input=conv1, num_filters=num_filters * 4, filter_size=1, act=None, bn_init_value=0.0)
-
- short = self.shortcut(input, num_filters * 4, stride)
-
- return fluid.layers.elementwise_add(x=short, y=conv2, act='elu')
|