66 lines
2.2 KiB
Python
66 lines
2.2 KiB
Python
import paddle
|
|
import paddle.fluid as fluid
|
|
|
|
|
|
def conv_bn_layer(input,
|
|
ch_out,
|
|
filter_size,
|
|
stride,
|
|
padding,
|
|
act='relu',
|
|
bias_attr=False):
|
|
tmp = fluid.layers.conv2d(
|
|
input=input,
|
|
filter_size=filter_size,
|
|
num_filters=ch_out,
|
|
stride=stride,
|
|
padding=padding,
|
|
act=None,
|
|
bias_attr=bias_attr)
|
|
return fluid.layers.batch_norm(input=tmp, act=act)
|
|
|
|
|
|
def shortcut(input, ch_in, ch_out, stride):
|
|
if stride == 2:
|
|
temp = fluid.layers.pool2d(input, pool_size=2, pool_type='avg', pool_stride=2)
|
|
temp = fluid.layers.conv2d(temp , filter_size=1, num_filters=ch_out, stride=1, padding=0, act=None, bias_attr=None)
|
|
return temp
|
|
elif ch_in != ch_out:
|
|
return conv_bn_layer(input, ch_out, 1, stride, 0, None, None)
|
|
else:
|
|
return input
|
|
|
|
|
|
def basicblock(input, ch_in, ch_out, stride):
|
|
tmp = conv_bn_layer(input, ch_out, 3, stride, 1)
|
|
tmp = conv_bn_layer(tmp, ch_out, 3, 1, 1, act=None, bias_attr=True)
|
|
short = shortcut(input, ch_in, ch_out, stride)
|
|
return fluid.layers.elementwise_add(x=tmp, y=short, act='relu')
|
|
|
|
|
|
def layer_warp(block_func, input, ch_in, ch_out, count, stride):
|
|
tmp = block_func(input, ch_in, ch_out, stride)
|
|
for i in range(1, count):
|
|
tmp = block_func(tmp, ch_out, ch_out, 1)
|
|
return tmp
|
|
|
|
|
|
def resnet_cifar(ipt, depth, class_num):
|
|
# depth should be one of 20, 32, 44, 56, 110, 1202
|
|
assert (depth - 2) % 6 == 0
|
|
n = (depth - 2) // 6
|
|
print('[resnet] depth : {:}, class_num : {:}'.format(depth, class_num))
|
|
conv1 = conv_bn_layer(ipt, ch_out=16, filter_size=3, stride=1, padding=1)
|
|
print('conv-1 : shape = {:}'.format(conv1.shape))
|
|
res1 = layer_warp(basicblock, conv1, 16, 16, n, 1)
|
|
print('res--1 : shape = {:}'.format(res1.shape))
|
|
res2 = layer_warp(basicblock, res1 , 16, 32, n, 2)
|
|
print('res--2 : shape = {:}'.format(res2.shape))
|
|
res3 = layer_warp(basicblock, res2 , 32, 64, n, 2)
|
|
print('res--3 : shape = {:}'.format(res3.shape))
|
|
pool = fluid.layers.pool2d(input=res3, pool_size=8, pool_type='avg', pool_stride=1)
|
|
print('pool : shape = {:}'.format(pool.shape))
|
|
predict = fluid.layers.fc(input=pool, size=class_num, act='softmax')
|
|
print('predict: shape = {:}'.format(predict.shape))
|
|
return predict
|