Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Paddle
提交
7cfe34da
P
Paddle
项目概览
PaddlePaddle
/
Paddle
1 年多 前同步成功
通知
2302
Star
20931
Fork
5422
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1423
列表
看板
标记
里程碑
合并请求
543
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1,423
Issue
1,423
列表
看板
标记
里程碑
合并请求
543
合并请求
543
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
7cfe34da
编写于
2月 21, 2017
作者:
Q
qiaolongfei
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
modify api_train_v2
上级
361dc27a
变更
5
显示空白变更内容
内联
并排
Showing
5 changed file
with
119 addition
and
46 deletion
+119
-46
demo/mnist/api_train_v2.py
demo/mnist/api_train_v2.py
+9
-11
python/paddle/v2/layer.py
python/paddle/v2/layer.py
+6
-2
python/paddle/v2/parameters.py
python/paddle/v2/parameters.py
+9
-12
python/paddle/v2/topology.py
python/paddle/v2/topology.py
+89
-7
python/paddle/v2/trainer.py
python/paddle/v2/trainer.py
+6
-14
未找到文件。
demo/mnist/api_train_v2.py
浏览文件 @
7cfe34da
...
...
@@ -26,7 +26,9 @@ def main():
act
=
paddle
.
activation
.
Softmax
())
cost
=
paddle
.
layer
.
classification_cost
(
input
=
inference
,
label
=
label
)
parameters
=
paddle
.
parameters
.
create
(
cost
)
topology
=
paddle
.
topology
.
Topology
(
cost
)
parameters
=
paddle
.
parameters
.
create
(
topology
)
for
param_name
in
parameters
.
keys
():
array
=
parameters
.
get
(
param_name
)
array
[:]
=
numpy
.
random
.
uniform
(
low
=-
1.0
,
high
=
1.0
,
size
=
array
.
shape
)
...
...
@@ -45,16 +47,12 @@ def main():
trainer
=
paddle
.
trainer
.
SGD
(
update_equation
=
adam_optimizer
)
trainer
.
train
(
train_data_reader
=
train_reader
,
topology
=
cost
,
trainer
.
train
(
train_data_reader
=
train_reader
,
topology
=
topology
,
parameters
=
parameters
,
event_handler
=
event_handler
,
batch_size
=
32
,
# batch size should be refactor in Data reader
data_types
=
{
# data_types will be removed, It should be in
# network topology
'pixel'
:
images
.
type
,
'label'
:
label
.
type
})
batch_size
=
32
)
# batch size should be refactor in Data reader
if
__name__
==
'__main__'
:
...
...
python/paddle/v2/layer.py
浏览文件 @
7cfe34da
...
...
@@ -66,12 +66,14 @@ Also, the creation of a protobuf message is hidden in the invocation of
paddle.v2.parameters.create, no longer exposed to users.
"""
import
collections
import
paddle.trainer_config_helpers
as
conf_helps
from
.
import
data_type
as
v2_data
from
paddle.trainer_config_helpers.config_parser_utils
import
\
parse_network_config
as
__parse__
from
paddle.trainer_config_helpers.default_decorators
import
wrap_name_default
import
collections
import
data_type
as
v2_data
__all__
=
[
'parse_network'
,
'data'
,
'fc'
,
'max_id'
,
'classification_cost'
,
...
...
@@ -184,6 +186,8 @@ class DataLayerV2(Layer):
return
getattr
(
conf_helps
,
self
.
__method_name__
)(
name
=
self
.
name
,
**
args
)
LayerV2
=
Layer
data
=
DataLayerV2
fc
=
__convert_to_v2__
(
'fc_layer'
,
name_prefix
=
'fc'
,
parent_names
=
[
'input'
])
max_id
=
__convert_to_v2__
(
...
...
python/paddle/v2/parameters.py
浏览文件 @
7cfe34da
import
numpy
as
np
from
.
import
layer
as
v2_layer
import
py_paddle.swig_paddle
as
api
from
paddle.proto.ParameterConfig_pb2
import
ParameterConfig
import
topology
as
v2_topology
__all__
=
[
'Parameters'
,
'create'
]
def
create
(
*
layers
):
def
create
(
topology
):
"""
Create parameter pool by layers. In paddle, layer can be represent a
model config.
:param layers:
Create parameter pool by topology.
:param topology:
:return:
"""
for
layer
in
layers
:
if
not
isinstance
(
layer
,
v2_layer
.
Layer
):
if
not
isinstance
(
topology
,
v2_topology
.
Topology
):
raise
ValueError
(
'create must pass a topologies which type is paddle.layer.Layer'
)
model_config
=
v2_layer
.
parse_network
(
*
layers
)
'create must pass a topology which type is topology.Topology'
)
pool
=
Parameters
()
for
param
in
model_config
.
parameters
:
for
param
in
topology
.
proto
()
.
parameters
:
pool
.
__append_config__
(
param
)
return
pool
...
...
python/paddle/v2/topology.py
浏览文件 @
7cfe34da
...
...
@@ -12,7 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from
.
import
layer
from
paddle.proto.ModelConfig_pb2
import
ModelConfig
import
paddle.trainer_config_helpers
as
conf_helps
import
layer
as
v2_layer
import
data_type
__all__
=
[
'Topology'
]
...
...
@@ -23,22 +26,101 @@ class Topology(object):
and network configs.
"""
def
__init__
(
self
,
cost
):
self
.
cost
=
cost
self
.
__model_config__
=
layer
.
parse_network
(
cost
)
def
__init__
(
self
,
*
layers
):
for
layer
in
layers
:
if
not
isinstance
(
layer
,
v2_layer
.
LayerV2
):
raise
ValueError
(
'create must pass a topologies '
'which type is paddle.layer.Layer'
)
self
.
layers
=
layers
self
.
__model_config__
=
v2_layer
.
parse_network
(
*
layers
)
assert
isinstance
(
self
.
__model_config__
,
ModelConfig
)
def
__call__
(
self
):
def
proto
(
self
):
return
self
.
__model_config__
def
get_layer
(
self
,
name
):
"""
get v2.Layer Class instance by layer name
:param name:
:return:
"""
result_layer
=
[]
def
find_layer_by_name
(
layer
,
layer_name
):
if
layer
.
name
==
layer_name
and
len
(
result_layer
)
==
0
:
result_layer
.
append
(
layer
)
for
parent_layer
in
layer
.
__parent_layers__
.
values
():
find_layer_by_name
(
parent_layer
,
layer_name
)
for
layer
in
self
.
layers
:
find_layer_by_name
(
layer
,
name
)
return
result_layer
[
0
]
def
get_data_layer
(
self
):
"""
get all data layer
:return:
"""
data_layers
=
[]
def
find_data_layer
(
layer
):
assert
isinstance
(
layer
,
layer
.
LayerV2
)
if
isinstance
(
layer
,
v2_layer
.
DataLayerV2
):
if
len
(
filter
(
lambda
data_layer
:
data_layer
.
name
==
layer
.
name
,
data_layers
))
==
0
:
data_layers
.
append
(
layer
)
for
parent_layer
in
layer
.
__parent_layers__
.
values
():
find_data_layer
(
parent_layer
)
for
layer
in
self
.
layers
:
find_data_layer
(
layer
)
return
data_layers
def
get_layer_proto
(
self
,
name
):
"""
get layer by layer name
:param name:
:return:
"""
pass
layers
=
filter
(
lambda
layer
:
layer
.
name
==
name
,
self
.
__model_config__
.
layers
)
if
len
(
layers
)
is
1
:
return
layers
[
0
]
else
:
return
None
def
data_type
(
self
):
"""
get data_type from proto, such as:
[('image', dense_vector(768)), ('label', integer_value(10))]
the order is the same with __model_config__.input_layer_names
"""
pass
data_types_lists
=
[]
for
layer_name
in
self
.
__model_config__
.
input_layer_names
:
data_types_lists
.
append
(
(
layer_name
,
self
.
get_layer
(
layer_name
).
type
))
return
data_types_lists
if
__name__
==
'__main__'
:
pixel
=
v2_layer
.
data
(
name
=
'pixel'
,
type
=
data_type
.
dense_vector
(
784
))
label
=
v2_layer
.
data
(
name
=
'label'
,
type
=
data_type
.
integer_value
(
10
))
hidden
=
v2_layer
.
fc
(
input
=
pixel
,
size
=
100
,
act
=
conf_helps
.
SigmoidActivation
())
inference
=
v2_layer
.
fc
(
input
=
hidden
,
size
=
10
,
act
=
conf_helps
.
SoftmaxActivation
())
maxid
=
v2_layer
.
max_id
(
input
=
inference
)
cost1
=
v2_layer
.
classification_cost
(
input
=
inference
,
label
=
label
)
cost2
=
v2_layer
.
cross_entropy_cost
(
input
=
inference
,
label
=
label
)
print
Topology
(
cost1
).
proto
()
print
Topology
(
cost2
).
proto
()
print
Topology
(
cost1
,
cost2
).
proto
()
print
Topology
(
cost2
).
proto
()
print
Topology
(
inference
,
maxid
).
proto
()
python/paddle/v2/trainer.py
浏览文件 @
7cfe34da
import
collections
import
py_paddle.swig_paddle
as
api
from
paddle.proto.ModelConfig_pb2
import
ModelConfig
from
py_paddle
import
DataProviderConverter
from
.
import
event
as
v2_event
from
.
import
layer
as
v2_layer
from
.
import
optimizer
as
v2_optimizer
from
.
import
parameters
as
v2_parameters
from
.
import
topology
as
v2_topology
__all__
=
[
'ITrainer'
,
'SGD'
]
...
...
@@ -88,12 +87,11 @@ class SGD(ITrainer):
if
event_handler
is
None
:
event_handler
=
default_event_handler
topology
=
v2_layer
.
parse_network
(
topology
)
__check_train_args__
(
**
locals
())
gm
=
api
.
GradientMachine
.
createFromConfigProto
(
topology
,
api
.
CREATE_MODE_NORMAL
,
self
.
__optimizer__
.
enable_types
())
topology
.
proto
(),
api
.
CREATE_MODE_NORMAL
,
self
.
__optimizer__
.
enable_types
())
assert
isinstance
(
gm
,
api
.
GradientMachine
)
parameters
.
append_gradient_machine
(
gm
)
...
...
@@ -102,13 +100,7 @@ class SGD(ITrainer):
gm
.
start
()
out_args
=
api
.
Arguments
.
createArguments
(
0
)
data_types_lists
=
[]
for
each
in
topology
.
input_layer_names
:
if
each
not
in
data_types
:
raise
ValueError
()
data_types_lists
.
append
(
data_types
[
each
])
data_types_lists
=
[
data_type
[
1
]
for
data_type
in
topology
.
data_type
()]
converter
=
DataProviderConverter
(
input_types
=
data_types_lists
)
for
pass_id
in
xrange
(
num_passes
):
...
...
@@ -141,7 +133,7 @@ def __data_reader_to_batch__(reader, batch_size, topology):
def
input_reorder
(
func
):
for
item
in
func
():
retv
=
[]
for
__layer_name__
in
topology
.
input_layer_names
:
for
__layer_name__
in
topology
.
proto
().
input_layer_names
:
retv
.
append
(
item
[
__layer_name__
])
yield
retv
...
...
@@ -178,7 +170,7 @@ def __check_train_args__(train_data_reader, topology, parameters,
raise
ValueError
(
'test_data_reader should be a function, which can '
'return a iterator'
)
if
not
isinstance
(
topology
,
ModelConfig
):
if
not
isinstance
(
topology
,
v2_topology
.
Topology
):
raise
ValueError
(
'topology should be a model config'
)
if
not
isinstance
(
parameters
,
v2_parameters
.
Parameters
):
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录