Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
机器未来
Paddle
提交
b1c0bad9
P
Paddle
项目概览
机器未来
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
b1c0bad9
编写于
8月 26, 2017
作者:
C
chengduoZH
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add config parser for pooling3D
上级
860bf192
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
304 addition
and
5 deletion
+304
-5
paddle/math/Matrix.cpp
paddle/math/Matrix.cpp
+0
-2
proto/ModelConfig.proto
proto/ModelConfig.proto
+1
-0
python/paddle/trainer/config_parser.py
python/paddle/trainer/config_parser.py
+119
-1
python/paddle/trainer_config_helpers/layers.py
python/paddle/trainer_config_helpers/layers.py
+145
-1
python/paddle/trainer_config_helpers/tests/configs/test_pooling3D_layer.py
...iner_config_helpers/tests/configs/test_pooling3D_layer.py
+38
-0
python/paddle/trainer_config_helpers/tests/layers_test.py
python/paddle/trainer_config_helpers/tests/layers_test.py
+1
-1
未找到文件。
paddle/math/Matrix.cpp
浏览文件 @
b1c0bad9
...
...
@@ -2255,9 +2255,7 @@ void CpuMatrix::maxPool3DBackward(Matrix& outGrad,
real
*
tgtGrad
=
getData
();
real
*
otGrad
=
outGrad
.
getData
();
real
*
maxPoolIdxData
=
maxPoolIdx
.
getData
();
size_t
outStride
=
outGrad
.
getStride
();
;
for
(
size_t
n
=
0
;
n
<
num
;
++
n
)
{
if
(
!
outGrad
.
isContiguous
())
{
...
...
proto/ModelConfig.proto
浏览文件 @
b1c0bad9
...
...
@@ -495,6 +495,7 @@ message LayerConfig {
// to indicate rectangle image data
optional
uint64
height
=
50
;
optional
uint64
width
=
51
;
optional
uint64
depth
=
57
[
default
=
1
];
// blank label used in ctc loss
optional
uint32
blank
=
52
[
default
=
0
];
...
...
python/paddle/trainer/config_parser.py
浏览文件 @
b1c0bad9
...
...
@@ -903,6 +903,31 @@ class Pool(Cfg):
self
.
add_keys
(
locals
())
@
config_class
class
Pool3d
(
Cfg
):
def
__init__
(
self
,
pool_type
,
channels
,
size_x
,
size_y
=
None
,
size_z
=
None
,
start
=
None
,
stride
=
None
,
# 1 by defalut in protobuf
stride_y
=
None
,
stride_z
=
None
,
padding
=
None
,
# 0 by defalut in protobuf
padding_y
=
None
,
padding_z
=
None
):
self
.
add_keys
(
locals
())
self
.
filter_size_y
=
size_y
if
size_y
else
size_x
self
.
filter_size_z
=
size_z
if
size_z
else
size_x
self
.
padding_y
=
padding_y
if
padding_y
else
padding
self
.
padding_z
=
padding_z
if
padding_z
else
padding
self
.
stride_y
=
stride_y
if
stride_y
else
stride
self
.
stride_z
=
stride_z
if
stride_z
else
stride
@
config_class
class
SpatialPyramidPool
(
Cfg
):
def
__init__
(
self
,
pool_type
,
pyramid_height
,
channels
):
...
...
@@ -1167,6 +1192,20 @@ def get_img_size(input_layer_name, channels):
return
img_size
,
img_size_y
def
get_img3d_size
(
input_layer_name
,
channels
):
input
=
g_layer_map
[
input_layer_name
]
img_pixels
=
input
.
size
/
channels
img_size
=
input
.
width
img_size_y
=
input
.
height
img_size_z
=
input
.
depth
config_assert
(
img_size
*
img_size_y
*
img_size_z
==
img_pixels
,
"Input layer %s: Incorrect input image size %d * %d * %d for input image pixels %d"
%
(
input_layer_name
,
img_size
,
img_size_y
,
img_size_z
,
img_pixels
))
return
img_size
,
img_size_y
,
img_size_z
def
parse_bilinear
(
bilinear
,
input_layer_name
,
bilinear_conf
):
parse_image
(
bilinear
,
input_layer_name
,
bilinear_conf
.
image_conf
)
bilinear_conf
.
out_size_x
=
bilinear
.
out_size_x
...
...
@@ -1204,6 +1243,45 @@ def parse_pool(pool, input_layer_name, pool_conf, ceil_mode):
pool_conf
.
stride_y
,
not
ceil_mode
)
def
parse_pool3d
(
pool
,
input_layer_name
,
pool_conf
,
ceil_mode
):
pool_conf
.
pool_type
=
pool
.
pool_type
config_assert
(
pool
.
pool_type
in
[
'max-projection'
,
'avg-projection'
],
"pool-type %s is not in "
"['max-projection', 'avg-projection']"
%
pool
.
pool_type
)
pool_conf
.
channels
=
pool
.
channels
pool_conf
.
size_x
=
pool
.
size_x
pool_conf
.
stride
=
pool
.
stride
pool_conf
.
padding
=
pool
.
padding
pool_conf
.
size_y
=
default
(
pool
.
size_y
,
pool_conf
.
size_x
)
pool_conf
.
size_z
=
default
(
pool
.
size_z
,
pool_conf
.
size_x
)
pool_conf
.
stride_y
=
default
(
pool
.
stride_y
,
pool_conf
.
stride
)
pool_conf
.
stride_z
=
default
(
pool
.
stride_z
,
pool_conf
.
stride
)
pool_conf
.
padding_y
=
default
(
pool
.
padding_y
,
pool_conf
.
padding
)
pool_conf
.
padding_z
=
default
(
pool
.
padding_z
,
pool_conf
.
padding
)
pool_conf
.
img_size
,
pool_conf
.
img_size_y
,
pool_conf
.
img_size_z
=
\
get_img3d_size
(
input_layer_name
,
pool
.
channels
)
config_assert
(
not
pool
.
start
,
"start is deprecated in pooling."
)
if
pool
.
padding
is
not
None
:
pool_conf
.
padding
=
pool
.
padding
pool_conf
.
padding_y
=
default
(
pool
.
padding_y
,
pool_conf
.
padding
)
pool_conf
.
padding_z
=
default
(
pool
.
padding_z
,
pool_conf
.
padding
)
pool_conf
.
output_x
=
cnn_output_size
(
pool_conf
.
img_size
,
pool_conf
.
size_x
,
pool_conf
.
padding
,
pool_conf
.
stride
,
not
ceil_mode
)
pool_conf
.
output_y
=
cnn_output_size
(
pool_conf
.
img_size_y
,
pool_conf
.
size_y
,
pool_conf
.
padding_y
,
pool_conf
.
stride_y
,
not
ceil_mode
)
pool_conf
.
output_z
=
cnn_output_size
(
pool_conf
.
img_size_z
,
pool_conf
.
size_z
,
pool_conf
.
padding_z
,
pool_conf
.
stride_z
,
not
ceil_mode
)
def
parse_spp
(
spp
,
input_layer_name
,
spp_conf
):
parse_image
(
spp
,
input_layer_name
,
spp_conf
.
image_conf
)
spp_conf
.
pool_type
=
spp
.
pool_type
...
...
@@ -1580,6 +1658,9 @@ class LayerBase(object):
self
.
config
.
height
=
height
self
.
config
.
width
=
width
def
set_layer_depth
(
self
,
depth
):
self
.
config
.
depth
=
depth
def
set_cnn_layer
(
self
,
input_layer_name
,
height
,
...
...
@@ -1763,11 +1844,19 @@ class DetectionOutputLayer(LayerBase):
@
config_layer
(
'data'
)
class
DataLayer
(
LayerBase
):
def
__init__
(
self
,
name
,
size
,
height
=
None
,
width
=
None
,
device
=
None
):
def
__init__
(
self
,
name
,
size
,
depth
=
None
,
height
=
None
,
width
=
None
,
device
=
None
):
super
(
DataLayer
,
self
).
__init__
(
name
,
'data'
,
size
,
inputs
=
[],
device
=
device
)
if
height
and
width
:
self
.
set_layer_height_width
(
height
,
width
)
if
depth
:
self
.
set_layer_depth
(
depth
)
'''
...
...
@@ -1995,6 +2084,35 @@ class PoolLayer(LayerBase):
pool_conf
.
channels
)
@
config_layer
(
'pool3d'
)
class
Pool3DLayer
(
LayerBase
):
def
__init__
(
self
,
name
,
inputs
,
ceil_mode
=
True
,
**
xargs
):
super
(
Pool3DLayer
,
self
).
__init__
(
name
,
'pool3d'
,
0
,
inputs
=
inputs
,
**
xargs
)
for
input_index
in
xrange
(
len
(
self
.
inputs
)):
input_layer
=
self
.
get_input_layer
(
input_index
)
pool_conf
=
self
.
config
.
inputs
[
input_index
].
pool_conf
parse_pool3d
(
self
.
inputs
[
input_index
].
pool
,
input_layer
.
name
,
pool_conf
,
ceil_mode
)
self
.
set_cnn_layer
(
name
,
pool_conf
.
output_z
,
pool_conf
.
output_y
,
pool_conf
.
output_x
,
pool_conf
.
channels
)
def
set_cnn_layer
(
self
,
input_layer_name
,
depth
,
height
,
width
,
channels
,
is_print
=
True
):
size
=
depth
*
height
*
width
*
channels
self
.
set_layer_size
(
size
)
self
.
set_layer_height_width
(
height
,
width
)
self
.
set_layer_depth
(
depth
)
if
is_print
:
print
(
"output for %s: c = %d, d = %d, h = %d, w = %d, size = %d"
%
(
input_layer_name
,
channels
,
depth
,
height
,
width
,
size
))
@
config_layer
(
'spp'
)
class
SpatialPyramidPoolLayer
(
LayerBase
):
def
__init__
(
self
,
name
,
inputs
,
**
xargs
):
...
...
python/paddle/trainer_config_helpers/layers.py
浏览文件 @
b1c0bad9
...
...
@@ -133,6 +133,7 @@ __all__ = [
'clip_layer'
,
'slice_projection'
,
'kmax_sequence_score_layer'
,
'img_pool3d_layer'
,
]
...
...
@@ -161,6 +162,7 @@ class LayerType(object):
EXCONVTRANS_LAYER
=
'exconvt'
CUDNNCONV_LAYER
=
'cudnn_conv'
POOL_LAYER
=
'pool'
POOL3D_LAYER
=
'pool3d'
BATCH_NORM_LAYER
=
'batch_norm'
NORM_LAYER
=
'norm'
SUM_TO_ONE_NORM_LAYER
=
'sum_to_one_norm'
...
...
@@ -878,7 +880,8 @@ def mixed_layer(size=0,
@
layer_support
()
def
data_layer
(
name
,
size
,
height
=
None
,
width
=
None
,
layer_attr
=
None
):
def
data_layer
(
name
,
size
,
depth
=
None
,
height
=
None
,
width
=
None
,
layer_attr
=
None
):
"""
Define DataLayer For NeuralNetwork.
...
...
@@ -905,6 +908,7 @@ def data_layer(name, size, height=None, width=None, layer_attr=None):
type
=
LayerType
.
DATA
,
name
=
name
,
size
=
size
,
depth
=
depth
,
height
=
height
,
width
=
width
,
**
ExtraLayerAttribute
.
to_kwargs
(
layer_attr
))
...
...
@@ -2610,6 +2614,146 @@ def img_pool_layer(input,
size
=
l
.
config
.
size
)
@
wrap_name_default
(
"pool3d"
)
@
layer_support
()
def
img_pool3d_layer
(
input
,
pool_size
,
name
=
None
,
num_channels
=
None
,
pool_type
=
None
,
stride
=
1
,
padding
=
0
,
layer_attr
=
None
,
pool_size_y
=
None
,
stride_y
=
None
,
padding_y
=
None
,
pool_size_z
=
None
,
stride_z
=
None
,
padding_z
=
None
,
ceil_mode
=
True
):
"""
Image pooling Layer.
The details of pooling layer, please refer ufldl's pooling_ .
.. _pooling: http://ufldl.stanford.edu/tutorial/supervised/Pooling/
- ceil_mode=True:
.. math::
w = 1 + int(ceil(input\_width + 2 * padding - pool\_size) / float(stride))
h = 1 + int(ceil(input\_height + 2 * padding\_y - pool\_size\_y) / float(stride\_y))
d = 1 + int(ceil(input\_depth + 2 * padding\_z - pool\_size\_z) / float(stride\_z))
- ceil_mode=False:
.. math::
w = 1 + int(floor(input\_width + 2 * padding - pool\_size) / float(stride))
h = 1 + int(floor(input\_height + 2 * padding\_y - pool\_size\_y) / float(stride\_y))
d = 1 + int(floor(input\_depth + 2 * padding\_z - pool\_size\_z) / float(stride\_z))
The example usage is:
.. code-block:: python
maxpool = img_pool3d_layer(input=conv,
pool_size=3,
num_channels=8,
stride=1,
padding=1,
pool_type=MaxPooling())
:param padding: pooling padding width.
:type padding: int|tuple|list
:param name: name of pooling layer
:type name: basestring.
:param input: layer's input
:type input: LayerOutput
:param pool_size: pooling window width
:type pool_size: int|tuple|list
:param num_channels: number of input channel.
:type num_channels: int
:param pool_type: pooling type. MaxPooling or AvgPooling. Default is
MaxPooling.
:type pool_type: BasePoolingType
:param stride: stride width of pooling.
:type stride: int|tuple|list
:param layer_attr: Extra Layer attribute.
:type layer_attr: ExtraLayerAttribute
:param ceil_mode: Wether to use ceil mode to calculate output height and with.
Defalut is True. If set false, Otherwise use floor.
:type ceil_mode: bool
:return: LayerOutput object.
:rtype: LayerOutput
"""
if
num_channels
is
None
:
assert
input
.
num_filters
is
not
None
num_channels
=
input
.
num_filters
if
pool_type
is
None
:
pool_type
=
MaxPooling
()
elif
isinstance
(
pool_type
,
AvgPooling
):
pool_type
.
name
=
'avg'
type_name
=
pool_type
.
name
+
'-projection'
\
if
(
isinstance
(
pool_type
,
AvgPooling
)
or
isinstance
(
pool_type
,
MaxPooling
))
\
else
pool_type
.
name
if
isinstance
(
pool_size
,
collections
.
Sequence
):
assert
len
(
pool_size
)
==
3
pool_size
,
pool_size_y
,
pool_size_z
=
pool_size
else
:
pool_size_y
=
pool_size
pool_size_z
=
pool_size
if
isinstance
(
stride
,
collections
.
Sequence
):
assert
len
(
stride
)
==
3
stride
,
stride_y
,
stride_z
=
stride
else
:
stride_y
=
stride
stride_z
=
stride
if
isinstance
(
padding
,
collections
.
Sequence
):
assert
len
(
padding
)
==
3
padding
,
padding_y
,
padding_y
=
padding
else
:
padding_y
=
padding
padding_z
=
padding
l
=
Layer
(
name
=
name
,
type
=
LayerType
.
POOL3D_LAYER
,
inputs
=
[
Input
(
input
.
name
,
pool
=
Pool3d
(
pool_type
=
type_name
,
channels
=
num_channels
,
size_x
=
pool_size
,
start
=
None
,
stride
=
stride
,
padding
=
padding
,
size_y
=
pool_size_y
,
stride_y
=
stride_y
,
padding_y
=
padding_y
,
size_z
=
pool_size_z
,
stride_z
=
stride_z
,
padding_z
=
padding_z
))
],
ceil_mode
=
ceil_mode
,
**
ExtraLayerAttribute
.
to_kwargs
(
layer_attr
))
return
LayerOutput
(
name
,
LayerType
.
POOL_LAYER
,
parents
=
[
input
],
num_filters
=
num_channels
,
size
=
l
.
config
.
size
)
@
wrap_name_default
(
"spp"
)
@
layer_support
()
def
spp_layer
(
input
,
...
...
python/paddle/trainer_config_helpers/tests/configs/test_pooling3D_layer.py
0 → 100644
浏览文件 @
b1c0bad9
from
paddle.trainer_config_helpers
import
*
settings
(
batch_size
=
100
,
learning_rate
=
1e-5
)
data_2d
=
data_layer
(
name
=
'data_2d'
,
size
=
6000
,
height
=
20
,
width
=
10
)
pool_2d
=
img_pool_layer
(
name
=
"pool___2d"
,
input
=
data_2d
,
num_channels
=
30
,
pool_size
=
5
,
stride
=
3
,
padding
=
1
,
pool_type
=
AvgPooling
())
outputs
(
pool_2d
)
data_3d
=
data_layer
(
name
=
'data_3d_1'
,
size
=
60000
,
depth
=
10
,
height
=
20
,
width
=
10
)
pool_3d_1
=
img_pool3d_layer
(
name
=
"pool_3d_1"
,
input
=
data_3d
,
num_channels
=
30
,
pool_size
=
5
,
stride
=
3
,
padding
=
1
,
pool_type
=
AvgPooling
())
outputs
(
pool_3d_1
)
pool_3d_2
=
img_pool3d_layer
(
name
=
"pool_3d_2"
,
input
=
data_3d
,
num_channels
=
30
,
pool_size
=
[
5
,
5
,
5
],
stride
=
[
3
,
3
,
3
],
padding
=
[
1
,
1
,
1
],
pool_type
=
MaxPooling
())
outputs
(
pool_3d_2
)
python/paddle/trainer_config_helpers/tests/layers_test.py
浏览文件 @
b1c0bad9
...
...
@@ -16,4 +16,4 @@ from paddle.trainer.config_parser import parse_config_and_serialize
if
__name__
==
'__main__'
:
parse_config_and_serialize
(
'trainer_config_helpers/tests/
layers_test_config
.py'
,
''
)
'trainer_config_helpers/tests/
configs/test_pooling3D_layer
.py'
,
''
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录