提交 8904a6e2 编写于 作者: D danleifeng

add dataformat for fp16

上级 92608de7
...@@ -110,6 +110,7 @@ class Entry(object): ...@@ -110,6 +110,7 @@ class Entry(object):
self.use_fp16 = False self.use_fp16 = False
self.fp16_user_dict = None self.fp16_user_dict = None
self.data_format = 'NCHW'
self.val_targets = self.config.val_targets self.val_targets = self.config.val_targets
self.dataset_dir = self.config.dataset_dir self.dataset_dir = self.config.dataset_dir
...@@ -170,6 +171,8 @@ class Entry(object): ...@@ -170,6 +171,8 @@ class Entry(object):
Whether to use mixed precision training. Whether to use mixed precision training.
""" """
self.use_fp16 = use_fp16 self.use_fp16 = use_fp16
if(self.use_fp16):
self.data_format = 'NHWC'
self.fp16_user_dict = dict() self.fp16_user_dict = dict()
self.fp16_user_dict['init_loss_scaling'] = init_loss_scaling self.fp16_user_dict['init_loss_scaling'] = init_loss_scaling
self.fp16_user_dict['incr_every_n_steps'] = incr_every_n_steps self.fp16_user_dict['incr_every_n_steps'] = incr_every_n_steps
...@@ -408,7 +411,8 @@ class Entry(object): ...@@ -408,7 +411,8 @@ class Entry(object):
param_attr=self.param_attr, param_attr=self.param_attr,
bias_attr=self.bias_attr, bias_attr=self.bias_attr,
margin=self.margin, margin=self.margin,
scale=self.scale) scale=self.scale,
data_format=self.data_format)
acc1 = None acc1 = None
acc5 = None acc5 = None
...@@ -618,7 +622,8 @@ class Entry(object): ...@@ -618,7 +622,8 @@ class Entry(object):
emb = model.build_network(input=image, emb = model.build_network(input=image,
label=label, label=label,
is_train=False) is_train=False,
data_format=self.data_format)
gpu_id = int(os.getenv("FLAGS_selected_gpus", 0)) gpu_id = int(os.getenv("FLAGS_selected_gpus", 0))
place = fluid.CUDAPlace(gpu_id) place = fluid.CUDAPlace(gpu_id)
...@@ -883,7 +888,6 @@ class Entry(object): ...@@ -883,7 +888,6 @@ class Entry(object):
strategy = DistributedStrategy() strategy = DistributedStrategy()
strategy.mode = "collective" strategy.mode = "collective"
strategy.collective_mode = "grad_allreduce" strategy.collective_mode = "grad_allreduce"
emb, loss, acc1, acc5, optimizer = self.build_program( emb, loss, acc1, acc5, optimizer = self.build_program(
True, True,
False, False,
......
...@@ -52,7 +52,8 @@ class BaseModel(object): ...@@ -52,7 +52,8 @@ class BaseModel(object):
bias_attr=None, bias_attr=None,
loss_type="dist_softmax", loss_type="dist_softmax",
margin=0.5, margin=0.5,
scale=64.0): scale=64.0,
data_format='NCHW'):
""" """
Add the distributed fc layer for the custom model. Add the distributed fc layer for the custom model.
...@@ -76,7 +77,7 @@ class BaseModel(object): ...@@ -76,7 +77,7 @@ class BaseModel(object):
"Supported loss types: {}, but given: {}".format( "Supported loss types: {}, but given: {}".format(
supported_loss_types, loss_type) supported_loss_types, loss_type)
emb = self.build_network(input, label, is_train) emb = self.build_network(input, label, is_train, data_format=data_format)
prob = None prob = None
loss = None loss = None
if loss_type == "softmax": if loss_type == "softmax":
......
...@@ -28,7 +28,8 @@ class ResNet(BaseModel): ...@@ -28,7 +28,8 @@ class ResNet(BaseModel):
def build_network(self, def build_network(self,
input, input,
label, label,
is_train=True): is_train=True,
data_format='NCHW'):
layers = self.layers layers = self.layers
supported_layers = [50, 101, 152] supported_layers = [50, 101, 152]
assert layers in supported_layers, \ assert layers in supported_layers, \
...@@ -45,7 +46,7 @@ class ResNet(BaseModel): ...@@ -45,7 +46,7 @@ class ResNet(BaseModel):
conv = self.conv_bn_layer( conv = self.conv_bn_layer(
input=input, num_filters=64, filter_size=3, stride=1, input=input, num_filters=64, filter_size=3, stride=1,
pad=1, act='prelu', is_train=is_train) pad=1, act='prelu', is_train=is_train, data_format=data_format)
for block in range(len(depth)): for block in range(len(depth)):
for i in range(depth[block]): for i in range(depth[block]):
...@@ -53,12 +54,14 @@ class ResNet(BaseModel): ...@@ -53,12 +54,14 @@ class ResNet(BaseModel):
input=conv, input=conv,
num_filters=num_filters[block], num_filters=num_filters[block],
stride=2 if i == 0 else 1, stride=2 if i == 0 else 1,
is_train=is_train) is_train=is_train,
data_format=data_format)
bn = fluid.layers.batch_norm(input=conv, bn = fluid.layers.batch_norm(input=conv,
act=None, act=None,
epsilon=2e-05, epsilon=2e-05,
is_test=False if is_train else True) is_test=False if is_train else True,
data_layout=data_format)
drop = fluid.layers.dropout(x=bn, drop = fluid.layers.dropout(x=bn,
dropout_prob=0.4, dropout_prob=0.4,
dropout_implementation='upscale_in_train', dropout_implementation='upscale_in_train',
...@@ -74,7 +77,8 @@ class ResNet(BaseModel): ...@@ -74,7 +77,8 @@ class ResNet(BaseModel):
emb = fluid.layers.batch_norm(input=fc, emb = fluid.layers.batch_norm(input=fc,
act=None, act=None,
epsilon=2e-05, epsilon=2e-05,
is_test=False if is_train else True) is_test=False if is_train else True,
data_layout=data_format)
return emb return emb
def conv_bn_layer(self, def conv_bn_layer(self,
...@@ -85,7 +89,8 @@ class ResNet(BaseModel): ...@@ -85,7 +89,8 @@ class ResNet(BaseModel):
pad=0, pad=0,
groups=1, groups=1,
is_train=True, is_train=True,
act=None): act=None,
data_format='NCHW'):
conv = fluid.layers.conv2d( conv = fluid.layers.conv2d(
input=input, input=input,
num_filters=num_filters, num_filters=num_filters,
...@@ -96,13 +101,15 @@ class ResNet(BaseModel): ...@@ -96,13 +101,15 @@ class ResNet(BaseModel):
param_attr=fluid.param_attr.ParamAttr( param_attr=fluid.param_attr.ParamAttr(
initializer=fluid.initializer.Xavier( initializer=fluid.initializer.Xavier(
uniform=False, fan_in=0.0)), uniform=False, fan_in=0.0)),
bias_attr=False) bias_attr=False,
data_format=data_format)
if act == 'prelu': if act == 'prelu':
bn = fluid.layers.batch_norm(input=conv, bn = fluid.layers.batch_norm(input=conv,
act=None, act=None,
epsilon=2e-05, epsilon=2e-05,
momentum=0.9, momentum=0.9,
is_test=False if is_train else True) is_test=False if is_train else True,
data_layout=data_format)
return fluid.layers.prelu( return fluid.layers.prelu(
bn, bn,
mode="all", mode="all",
...@@ -112,62 +119,74 @@ class ResNet(BaseModel): ...@@ -112,62 +119,74 @@ class ResNet(BaseModel):
return fluid.layers.batch_norm(input=conv, return fluid.layers.batch_norm(input=conv,
act=act, act=act,
epsilon=2e-05, epsilon=2e-05,
is_test=False if is_train else True) is_test=False if is_train else True,
data_layout=data_format)
def shortcut(self, input, ch_out, stride, is_train): def shortcut(self, input, ch_out, stride, is_train, data_format):
ch_in = input.shape[1] if data_format == 'NCHW':
ch_in = input.shape[1]
else:
ch_in = input.shape[-1]
if ch_in != ch_out or stride != 1: if ch_in != ch_out or stride != 1:
return self.conv_bn_layer(input, return self.conv_bn_layer(input,
ch_out, ch_out,
1, 1,
stride, stride,
is_train=is_train) is_train=is_train,
data_format=data_format)
else: else:
return input return input
def bottleneck_block(self, input, num_filters, stride, is_train): def bottleneck_block(self, input, num_filters, stride, is_train, data_format):
if self.layers < 101: if self.layers < 101:
bn1 = fluid.layers.batch_norm(input=input, bn1 = fluid.layers.batch_norm(input=input,
act=None, act=None,
epsilon=2e-05, epsilon=2e-05,
is_test=False if is_train else True) is_test=False if is_train else True,
data_layout=data_format)
conv1 = self.conv_bn_layer(input=bn1, conv1 = self.conv_bn_layer(input=bn1,
num_filters=num_filters, num_filters=num_filters,
filter_size=3, filter_size=3,
pad=1, pad=1,
act='prelu', act='prelu',
is_train=is_train) is_train=is_train,
data_format=data_format)
conv2 = self.conv_bn_layer(input=conv1, conv2 = self.conv_bn_layer(input=conv1,
num_filters=num_filters, num_filters=num_filters,
filter_size=3, filter_size=3,
stride=stride, stride=stride,
pad=1, pad=1,
is_train=is_train) is_train=is_train,
data_format=data_format)
else: else:
bn0 = fluid.layers.batch_norm(input=input, bn0 = fluid.layers.batch_norm(input=input,
act=None, act=None,
epsilon=2e-05, epsilon=2e-05,
is_test=False if is_train else True) is_test=False if is_train else True,
data_layout=data_format)
conv0 = self.conv_bn_layer(input=bn0, conv0 = self.conv_bn_layer(input=bn0,
num_filters=num_filters / 4, num_filters=num_filters / 4,
filter_size=1, filter_size=1,
pad=0, pad=0,
act='prelu', act='prelu',
is_train=is_train) is_train=is_train,
data_format=data_format)
conv1 = self.conv_bn_layer(input=conv0, conv1 = self.conv_bn_layer(input=conv0,
num_filters=num_filters / 4, num_filters=num_filters / 4,
filter_size=3, filter_size=3,
pad=1, pad=1,
act='prelu', act='prelu',
is_train=is_train) is_train=is_train,
data_format=data_format)
conv2 = self.conv_bn_layer(input=conv1, conv2 = self.conv_bn_layer(input=conv1,
num_filters=num_filters, num_filters=num_filters,
filter_size=1, filter_size=1,
stride=stride, stride=stride,
pad=0, pad=0,
is_train=is_train) is_train=is_train,
data_format=data_format)
short = self.shortcut(input, num_filters, stride, is_train=is_train) short = self.shortcut(input, num_filters, stride, is_train=is_train, data_format=data_format)
return fluid.layers.elementwise_add(x=short, y=conv2, act=None) return fluid.layers.elementwise_add(x=short, y=conv2, act=None)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册