|
|
|
@ -13,7 +13,6 @@
|
|
|
|
|
# limitations under the License.
|
|
|
|
|
|
|
|
|
|
from paddle.trainer_config_helpers import *
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
paper: https://arxiv.org/abs/1512.03385
|
|
|
|
|
"""
|
|
|
|
@ -28,11 +27,15 @@ if not is_predict and data_provider:
|
|
|
|
|
# mean.meta size : 3 x 224 x 224.
|
|
|
|
|
# If you use three mean value, set like:
|
|
|
|
|
# "mean_value:103.939,116.779,123.68;"
|
|
|
|
|
args={
|
|
|
|
|
args = {
|
|
|
|
|
'mean_meta': "model/mean_meta_224/mean.meta",
|
|
|
|
|
'image_size': 224, 'crop_size': 224,
|
|
|
|
|
'color': True,'swap_channel:': [2, 1, 0]}
|
|
|
|
|
define_py_data_sources2(train_list,
|
|
|
|
|
'image_size': 224,
|
|
|
|
|
'crop_size': 224,
|
|
|
|
|
'color': True,
|
|
|
|
|
'swap_channel:': [2, 1, 0]
|
|
|
|
|
}
|
|
|
|
|
define_py_data_sources2(
|
|
|
|
|
train_list,
|
|
|
|
|
'example/test.list',
|
|
|
|
|
module="example.image_list_provider",
|
|
|
|
|
obj="processData",
|
|
|
|
@ -54,12 +57,16 @@ Settings(
|
|
|
|
|
learning_method='momentum',
|
|
|
|
|
learning_rate_decay_a=0.5,
|
|
|
|
|
learning_rate_decay_b=1200000 * 10,
|
|
|
|
|
learning_rate_schedule="discexp",
|
|
|
|
|
)
|
|
|
|
|
learning_rate_schedule="discexp", )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def conv_bn_layer(name, input, filter_size, num_filters,
|
|
|
|
|
stride, padding, channels=None,
|
|
|
|
|
def conv_bn_layer(name,
|
|
|
|
|
input,
|
|
|
|
|
filter_size,
|
|
|
|
|
num_filters,
|
|
|
|
|
stride,
|
|
|
|
|
padding,
|
|
|
|
|
channels=None,
|
|
|
|
|
active_type=ReluActivation()):
|
|
|
|
|
"""
|
|
|
|
|
A wrapper for conv layer with batch normalization layers.
|
|
|
|
@ -67,7 +74,8 @@ def conv_bn_layer(name, input, filter_size, num_filters,
|
|
|
|
|
conv layer has no activation.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
tmp = img_conv_layer(name=name + "_conv",
|
|
|
|
|
tmp = img_conv_layer(
|
|
|
|
|
name=name + "_conv",
|
|
|
|
|
input=input,
|
|
|
|
|
filter_size=filter_size,
|
|
|
|
|
num_channels=channels,
|
|
|
|
@ -76,10 +84,8 @@ def conv_bn_layer(name, input, filter_size, num_filters,
|
|
|
|
|
padding=padding,
|
|
|
|
|
act=LinearActivation(),
|
|
|
|
|
bias_attr=False)
|
|
|
|
|
return batch_norm_layer(name=name + "_bn",
|
|
|
|
|
input=tmp,
|
|
|
|
|
act=active_type,
|
|
|
|
|
use_global_stats=is_test)
|
|
|
|
|
return batch_norm_layer(
|
|
|
|
|
name=name + "_bn", input=tmp, act=active_type, use_global_stats=is_test)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def bottleneck_block(name, input, num_filters1, num_filters2):
|
|
|
|
@ -88,19 +94,22 @@ def bottleneck_block(name, input, num_filters1, num_filters2):
|
|
|
|
|
Last conv_bn_layer has no activation.
|
|
|
|
|
Addto layer has activation of relu.
|
|
|
|
|
"""
|
|
|
|
|
last_name = conv_bn_layer(name=name + '_branch2a',
|
|
|
|
|
last_name = conv_bn_layer(
|
|
|
|
|
name=name + '_branch2a',
|
|
|
|
|
input=input,
|
|
|
|
|
filter_size=1,
|
|
|
|
|
num_filters=num_filters1,
|
|
|
|
|
stride=1,
|
|
|
|
|
padding=0)
|
|
|
|
|
last_name = conv_bn_layer(name=name + '_branch2b',
|
|
|
|
|
last_name = conv_bn_layer(
|
|
|
|
|
name=name + '_branch2b',
|
|
|
|
|
input=last_name,
|
|
|
|
|
filter_size=3,
|
|
|
|
|
num_filters=num_filters1,
|
|
|
|
|
stride=1,
|
|
|
|
|
padding=1)
|
|
|
|
|
last_name = conv_bn_layer(name=name + '_branch2c',
|
|
|
|
|
last_name = conv_bn_layer(
|
|
|
|
|
name=name + '_branch2c',
|
|
|
|
|
input=last_name,
|
|
|
|
|
filter_size=1,
|
|
|
|
|
num_filters=num_filters2,
|
|
|
|
@ -108,9 +117,8 @@ def bottleneck_block(name, input, num_filters1, num_filters2):
|
|
|
|
|
padding=0,
|
|
|
|
|
active_type=LinearActivation())
|
|
|
|
|
|
|
|
|
|
return addto_layer(name=name + "_addto",
|
|
|
|
|
input=[input, last_name],
|
|
|
|
|
act=ReluActivation())
|
|
|
|
|
return addto_layer(
|
|
|
|
|
name=name + "_addto", input=[input, last_name], act=ReluActivation())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def mid_projection(name, input, num_filters1, num_filters2, stride=2):
|
|
|
|
@ -123,7 +131,8 @@ def mid_projection(name, input, num_filters1, num_filters2, stride=2):
|
|
|
|
|
branch2x: bottleneck building block, shortcuts are identity.
|
|
|
|
|
"""
|
|
|
|
|
# stride = 2
|
|
|
|
|
branch1 = conv_bn_layer(name=name + '_branch1',
|
|
|
|
|
branch1 = conv_bn_layer(
|
|
|
|
|
name=name + '_branch1',
|
|
|
|
|
input=input,
|
|
|
|
|
filter_size=1,
|
|
|
|
|
num_filters=num_filters2,
|
|
|
|
@ -131,20 +140,23 @@ def mid_projection(name, input, num_filters1, num_filters2, stride=2):
|
|
|
|
|
padding=0,
|
|
|
|
|
active_type=LinearActivation())
|
|
|
|
|
|
|
|
|
|
last_name = conv_bn_layer(name=name + '_branch2a',
|
|
|
|
|
last_name = conv_bn_layer(
|
|
|
|
|
name=name + '_branch2a',
|
|
|
|
|
input=input,
|
|
|
|
|
filter_size=1,
|
|
|
|
|
num_filters=num_filters1,
|
|
|
|
|
stride=stride,
|
|
|
|
|
padding=0)
|
|
|
|
|
last_name = conv_bn_layer(name=name + '_branch2b',
|
|
|
|
|
last_name = conv_bn_layer(
|
|
|
|
|
name=name + '_branch2b',
|
|
|
|
|
input=last_name,
|
|
|
|
|
filter_size=3,
|
|
|
|
|
num_filters=num_filters1,
|
|
|
|
|
stride=1,
|
|
|
|
|
padding=1)
|
|
|
|
|
|
|
|
|
|
last_name = conv_bn_layer(name=name + '_branch2c',
|
|
|
|
|
last_name = conv_bn_layer(
|
|
|
|
|
name=name + '_branch2c',
|
|
|
|
|
input=last_name,
|
|
|
|
|
filter_size=1,
|
|
|
|
|
num_filters=num_filters2,
|
|
|
|
@ -152,9 +164,8 @@ def mid_projection(name, input, num_filters1, num_filters2, stride=2):
|
|
|
|
|
padding=0,
|
|
|
|
|
active_type=LinearActivation())
|
|
|
|
|
|
|
|
|
|
return addto_layer(name=name + "_addto",
|
|
|
|
|
input=[branch1, last_name],
|
|
|
|
|
act=ReluActivation())
|
|
|
|
|
return addto_layer(
|
|
|
|
|
name=name + "_addto", input=[branch1, last_name], act=ReluActivation())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def deep_res_net(res2_num=3, res3_num=4, res4_num=6, res5_num=3):
|
|
|
|
@ -168,7 +179,9 @@ def deep_res_net(res2_num=3, res3_num=4, res4_num=6, res5_num=3):
|
|
|
|
|
# For ImageNet
|
|
|
|
|
# conv1: 112x112
|
|
|
|
|
img = data_layer(name='input', size=224 * 224 * 3)
|
|
|
|
|
tmp = conv_bn_layer("conv1", img,
|
|
|
|
|
tmp = conv_bn_layer(
|
|
|
|
|
"conv1",
|
|
|
|
|
img,
|
|
|
|
|
filter_size=7,
|
|
|
|
|
channels=3,
|
|
|
|
|
num_filters=64,
|
|
|
|
@ -177,58 +190,56 @@ def deep_res_net(res2_num=3, res3_num=4, res4_num=6, res5_num=3):
|
|
|
|
|
tmp = img_pool_layer(name="pool1", input=tmp, pool_size=3, stride=2)
|
|
|
|
|
|
|
|
|
|
# conv2_x: 56x56
|
|
|
|
|
tmp = mid_projection(name="res2_1",
|
|
|
|
|
input=tmp,
|
|
|
|
|
num_filters1=64,
|
|
|
|
|
num_filters2=256,
|
|
|
|
|
stride=1)
|
|
|
|
|
tmp = mid_projection(
|
|
|
|
|
name="res2_1", input=tmp, num_filters1=64, num_filters2=256, stride=1)
|
|
|
|
|
for i in xrange(2, res2_num + 1, 1):
|
|
|
|
|
tmp = bottleneck_block(name="res2_" + str(i),
|
|
|
|
|
input=tmp,
|
|
|
|
|
num_filters1=64,
|
|
|
|
|
num_filters2=256)
|
|
|
|
|
tmp = bottleneck_block(
|
|
|
|
|
name="res2_" + str(i), input=tmp, num_filters1=64, num_filters2=256)
|
|
|
|
|
|
|
|
|
|
# conv3_x: 28x28
|
|
|
|
|
tmp = mid_projection(name="res3_1",
|
|
|
|
|
tmp = mid_projection(
|
|
|
|
|
name="res3_1", input=tmp, num_filters1=128, num_filters2=512)
|
|
|
|
|
for i in xrange(2, res3_num + 1, 1):
|
|
|
|
|
tmp = bottleneck_block(
|
|
|
|
|
name="res3_" + str(i),
|
|
|
|
|
input=tmp,
|
|
|
|
|
num_filters1=128,
|
|
|
|
|
num_filters2=512)
|
|
|
|
|
for i in xrange(2, res3_num + 1, 1):
|
|
|
|
|
tmp = bottleneck_block(name="res3_" + str(i),
|
|
|
|
|
input=tmp, num_filters1=128,
|
|
|
|
|
num_filters2=512)
|
|
|
|
|
|
|
|
|
|
# conv4_x: 14x14
|
|
|
|
|
tmp = mid_projection(name="res4_1", input=tmp,
|
|
|
|
|
num_filters1=256, num_filters2=1024)
|
|
|
|
|
tmp = mid_projection(
|
|
|
|
|
name="res4_1", input=tmp, num_filters1=256, num_filters2=1024)
|
|
|
|
|
for i in xrange(2, res4_num + 1, 1):
|
|
|
|
|
tmp = bottleneck_block(name="res4_" + str(i),
|
|
|
|
|
tmp = bottleneck_block(
|
|
|
|
|
name="res4_" + str(i),
|
|
|
|
|
input=tmp,
|
|
|
|
|
num_filters1=256,
|
|
|
|
|
num_filters2=1024)
|
|
|
|
|
|
|
|
|
|
# conv5_x: 7x7
|
|
|
|
|
tmp = mid_projection(name="res5_1", input=tmp,
|
|
|
|
|
num_filters1=512, num_filters2=2048)
|
|
|
|
|
tmp = mid_projection(
|
|
|
|
|
name="res5_1", input=tmp, num_filters1=512, num_filters2=2048)
|
|
|
|
|
for i in xrange(2, res5_num + 1, 1):
|
|
|
|
|
tmp = bottleneck_block(name="res5_" + str(i),
|
|
|
|
|
input=tmp, num_filters1=512,
|
|
|
|
|
tmp = bottleneck_block(
|
|
|
|
|
name="res5_" + str(i),
|
|
|
|
|
input=tmp,
|
|
|
|
|
num_filters1=512,
|
|
|
|
|
num_filters2=2048)
|
|
|
|
|
|
|
|
|
|
tmp = img_pool_layer(name='avgpool',
|
|
|
|
|
tmp = img_pool_layer(
|
|
|
|
|
name='avgpool',
|
|
|
|
|
input=tmp,
|
|
|
|
|
pool_size=7,
|
|
|
|
|
stride=1,
|
|
|
|
|
pool_type=AvgPooling())
|
|
|
|
|
|
|
|
|
|
output = fc_layer(name='output',
|
|
|
|
|
input=tmp,
|
|
|
|
|
size=1000,
|
|
|
|
|
act=SoftmaxActivation())
|
|
|
|
|
output = fc_layer(
|
|
|
|
|
name='output', input=tmp, size=1000, act=SoftmaxActivation())
|
|
|
|
|
|
|
|
|
|
if not is_predict:
|
|
|
|
|
classification_cost(input=output, label=data_layer(name='label',
|
|
|
|
|
size=1))
|
|
|
|
|
classification_cost(
|
|
|
|
|
input=output, label=data_layer(
|
|
|
|
|
name='label', size=1))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def res_net_50():
|
|
|
|
|