Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
s920243400
PaddleDetection
提交
319742c6
P
PaddleDetection
项目概览
s920243400
/
PaddleDetection
与 Fork 源项目一致
Fork自
PaddlePaddle / PaddleDetection
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleDetection
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
319742c6
编写于
11月 12, 2016
作者:
Q
qijun
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
format python code in demo, doc, doc_cn and paddle directories
上级
ef5e483c
变更
85
显示空白变更内容
内联
并排
Showing
85 changed file
with
1580 addition
and
1267 deletion
+1580
-1267
demo/image_classification/data/process_cifar.py
demo/image_classification/data/process_cifar.py
+21
-9
demo/image_classification/image_provider.py
demo/image_classification/image_provider.py
+6
-6
demo/image_classification/image_util.py
demo/image_classification/image_util.py
+45
-31
demo/image_classification/prediction.py
demo/image_classification/prediction.py
+32
-27
demo/image_classification/preprocess.py
demo/image_classification/preprocess.py
+30
-18
demo/image_classification/vgg_16_cifar.py
demo/image_classification/vgg_16_cifar.py
+26
-24
demo/introduction/dataprovider.py
demo/introduction/dataprovider.py
+3
-3
demo/introduction/evaluate_model.py
demo/introduction/evaluate_model.py
+5
-2
demo/introduction/trainer_config.py
demo/introduction/trainer_config.py
+14
-5
demo/mnist/data/generate_list.py
demo/mnist/data/generate_list.py
+3
-3
demo/mnist/mnist_provider.py
demo/mnist/mnist_provider.py
+3
-4
demo/mnist/vgg_16_mnist.py
demo/mnist/vgg_16_mnist.py
+13
-16
demo/model_zoo/embedding/extract_para.py
demo/model_zoo/embedding/extract_para.py
+31
-14
demo/model_zoo/embedding/paraconvert.py
demo/model_zoo/embedding/paraconvert.py
+20
-12
demo/model_zoo/resnet/classify.py
demo/model_zoo/resnet/classify.py
+84
-49
demo/model_zoo/resnet/example/__init__.py
demo/model_zoo/resnet/example/__init__.py
+0
-1
demo/model_zoo/resnet/example/image_list_provider.py
demo/model_zoo/resnet/example/image_list_provider.py
+6
-9
demo/model_zoo/resnet/load_feature.py
demo/model_zoo/resnet/load_feature.py
+8
-4
demo/model_zoo/resnet/resnet.py
demo/model_zoo/resnet/resnet.py
+138
-127
demo/quick_start/api_train.py
demo/quick_start/api_train.py
+25
-17
demo/quick_start/dataprovider_bow.py
demo/quick_start/dataprovider_bow.py
+6
-4
demo/quick_start/dataprovider_emb.py
demo/quick_start/dataprovider_emb.py
+4
-2
demo/quick_start/preprocess.py
demo/quick_start/preprocess.py
+2
-2
demo/quick_start/trainer_config.bidi-lstm.py
demo/quick_start/trainer_config.bidi-lstm.py
+10
-11
demo/quick_start/trainer_config.cnn.py
demo/quick_start/trainer_config.cnn.py
+7
-7
demo/quick_start/trainer_config.db-lstm.py
demo/quick_start/trainer_config.db-lstm.py
+15
-14
demo/quick_start/trainer_config.emb.py
demo/quick_start/trainer_config.emb.py
+7
-9
demo/quick_start/trainer_config.lr.py
demo/quick_start/trainer_config.lr.py
+7
-7
demo/quick_start/trainer_config.lstm.py
demo/quick_start/trainer_config.lstm.py
+10
-12
demo/recommendation/common_utils.py
demo/recommendation/common_utils.py
+4
-3
demo/recommendation/data/config_generator.py
demo/recommendation/data/config_generator.py
+5
-12
demo/recommendation/data/meta_generator.py
demo/recommendation/data/meta_generator.py
+12
-18
demo/recommendation/data/split.py
demo/recommendation/data/split.py
+0
-1
demo/recommendation/dataprovider.py
demo/recommendation/dataprovider.py
+2
-0
demo/recommendation/prediction.py
demo/recommendation/prediction.py
+6
-4
demo/recommendation/trainer_config.py
demo/recommendation/trainer_config.py
+22
-20
demo/semantic_role_labeling/dataprovider.py
demo/semantic_role_labeling/dataprovider.py
+3
-3
demo/semantic_role_labeling/db_lstm.py
demo/semantic_role_labeling/db_lstm.py
+1
-2
demo/semantic_role_labeling/predict.py
demo/semantic_role_labeling/predict.py
+7
-13
demo/sentiment/dataprovider.py
demo/sentiment/dataprovider.py
+5
-4
demo/sentiment/predict.py
demo/sentiment/predict.py
+45
-18
demo/sentiment/preprocess.py
demo/sentiment/preprocess.py
+57
-36
demo/sentiment/sentiment_net.py
demo/sentiment/sentiment_net.py
+29
-19
demo/sentiment/trainer_config.py
demo/sentiment/trainer_config.py
+8
-9
demo/seqToseq/dataprovider.py
demo/seqToseq/dataprovider.py
+4
-5
demo/seqToseq/preprocess.py
demo/seqToseq/preprocess.py
+42
-27
demo/seqToseq/seqToseq_net.py
demo/seqToseq/seqToseq_net.py
+59
-47
demo/sequence_tagging/dataprovider.py
demo/sequence_tagging/dataprovider.py
+54
-52
demo/sequence_tagging/linear_crf.py
demo/sequence_tagging/linear_crf.py
+20
-22
demo/sequence_tagging/rnn_crf.py
demo/sequence_tagging/rnn_crf.py
+35
-45
doc/ui/predict/predict_sample.py
doc/ui/predict/predict_sample.py
+102
-71
doc_cn/concepts/trainer_config.py
doc_cn/concepts/trainer_config.py
+17
-11
doc_cn/faq/word2vec_config.py
doc_cn/faq/word2vec_config.py
+9
-5
doc_cn/faq/word2vec_dataprovider.py
doc_cn/faq/word2vec_dataprovider.py
+8
-6
doc_cn/ui/data_provider/mnist_config.py
doc_cn/ui/data_provider/mnist_config.py
+5
-4
doc_cn/ui/data_provider/mnist_provider.dict.py
doc_cn/ui/data_provider/mnist_provider.dict.py
+3
-4
doc_cn/ui/data_provider/mnist_provider.py
doc_cn/ui/data_provider/mnist_provider.py
+1
-4
doc_cn/ui/data_provider/sentimental_config.py
doc_cn/ui/data_provider/sentimental_config.py
+9
-6
doc_cn/ui/data_provider/sentimental_provider.py
doc_cn/ui/data_provider/sentimental_provider.py
+2
-1
paddle/api/__init__.py
paddle/api/__init__.py
+0
-1
paddle/api/paddle_ld_flags.py
paddle/api/paddle_ld_flags.py
+21
-13
paddle/api/test/testArguments.py
paddle/api/test/testArguments.py
+1
-1
paddle/api/test/testGradientMachine.py
paddle/api/test/testGradientMachine.py
+3
-3
paddle/api/test/testMatrix.py
paddle/api/test/testMatrix.py
+2
-1
paddle/api/test/testTrain.py
paddle/api/test/testTrain.py
+2
-1
paddle/api/test/testTrainConfig.py
paddle/api/test/testTrainConfig.py
+1
-4
paddle/api/test/testTrainer.py
paddle/api/test/testTrainer.py
+3
-3
paddle/api/test/testVector.py
paddle/api/test/testVector.py
+2
-1
paddle/gserver/tests/__init__.py
paddle/gserver/tests/__init__.py
+0
-1
paddle/gserver/tests/pyDataProvider.py
paddle/gserver/tests/pyDataProvider.py
+53
-44
paddle/gserver/tests/rnn_data_provider.py
paddle/gserver/tests/rnn_data_provider.py
+33
-26
paddle/gserver/tests/sequenceGen.py
paddle/gserver/tests/sequenceGen.py
+14
-8
paddle/gserver/tests/sequence_layer_group.conf
paddle/gserver/tests/sequence_layer_group.conf
+21
-17
paddle/gserver/tests/sequence_nest_layer_group.conf
paddle/gserver/tests/sequence_nest_layer_group.conf
+37
-27
paddle/gserver/tests/test_PyDataProvider2.py
paddle/gserver/tests/test_PyDataProvider2.py
+20
-18
paddle/py_paddle/__init__.py
paddle/py_paddle/__init__.py
+6
-5
paddle/py_paddle/dataprovider_converter.py
paddle/py_paddle/dataprovider_converter.py
+16
-13
paddle/py_paddle/util.py
paddle/py_paddle/util.py
+43
-39
paddle/scripts/cluster_train/conf.py
paddle/scripts/cluster_train/conf.py
+4
-7
paddle/scripts/cluster_train/paddle.py
paddle/scripts/cluster_train/paddle.py
+35
-28
paddle/trainer/tests/__init__.py
paddle/trainer/tests/__init__.py
+0
-1
paddle/trainer/tests/config_parser_test.py
paddle/trainer/tests/config_parser_test.py
+1
-1
paddle/trainer/tests/gen_proto_data.py
paddle/trainer/tests/gen_proto_data.py
+59
-68
paddle/trainer/tests/testPyDataWrapper.py
paddle/trainer/tests/testPyDataWrapper.py
+39
-10
paddle/utils/enable_virtualenv.py
paddle/utils/enable_virtualenv.py
+7
-5
未找到文件。
demo/image_classification/data/process_cifar.py
浏览文件 @
319742c6
...
...
@@ -16,7 +16,6 @@ import numpy as np
import
sys
import
os
import
PIL.Image
as
Image
"""
Usage: python process_cifar input_dir output_dir
"""
...
...
@@ -30,6 +29,7 @@ def mkdir_not_exist(path):
if
not
os
.
path
.
exists
(
path
):
os
.
mkdir
(
path
)
def
create_dir_structure
(
output_dir
):
"""
Create the directory structure for the directory.
...
...
@@ -39,8 +39,8 @@ def create_dir_structure(output_dir):
mkdir_not_exist
(
os
.
path
.
join
(
output_dir
,
"train"
))
mkdir_not_exist
(
os
.
path
.
join
(
output_dir
,
"test"
))
def
convert_batch
(
batch_path
,
label_set
,
label_map
,
output_dir
,
data_split
):
def
convert_batch
(
batch_path
,
label_set
,
label_map
,
output_dir
,
data_split
):
"""
Convert CIFAR batch to the structure of Paddle format.
batch_path: the batch to be converted.
...
...
@@ -67,11 +67,23 @@ if __name__ == '__main__':
output_dir
=
sys
.
argv
[
2
]
num_batch
=
5
create_dir_structure
(
output_dir
)
label_map
=
{
0
:
"airplane"
,
1
:
"automobile"
,
2
:
"bird"
,
3
:
"cat"
,
4
:
"deer"
,
5
:
"dog"
,
6
:
"frog"
,
7
:
"horse"
,
8
:
"ship"
,
9
:
"truck"
}
label_map
=
{
0
:
"airplane"
,
1
:
"automobile"
,
2
:
"bird"
,
3
:
"cat"
,
4
:
"deer"
,
5
:
"dog"
,
6
:
"frog"
,
7
:
"horse"
,
8
:
"ship"
,
9
:
"truck"
}
labels
=
{}
for
i
in
range
(
1
,
num_batch
+
1
):
convert_batch
(
os
.
path
.
join
(
input_dir
,
"data_batch_%d"
%
i
),
labels
,
label_map
,
output_dir
,
"train"
)
convert_batch
(
os
.
path
.
join
(
input_dir
,
"test_batch"
),
{},
label_map
,
output_dir
,
"test"
)
\ No newline at end of file
convert_batch
(
os
.
path
.
join
(
input_dir
,
"data_batch_%d"
%
i
),
labels
,
label_map
,
output_dir
,
"train"
)
convert_batch
(
os
.
path
.
join
(
input_dir
,
"test_batch"
),
{},
label_map
,
output_dir
,
"test"
)
demo/image_classification/image_provider.py
浏览文件 @
319742c6
...
...
@@ -46,14 +46,14 @@ def hook(settings, img_size, mean_img_size, num_classes, color, meta, use_jpeg,
settings
.
img_mean
=
image_util
.
load_meta
(
settings
.
meta_path
,
settings
.
mean_img_size
,
settings
.
img_size
,
settings
.
color
)
settings
.
img_size
,
settings
.
color
)
settings
.
logger
.
info
(
'Image size: %s'
,
settings
.
img_size
)
settings
.
logger
.
info
(
'Meta path: %s'
,
settings
.
meta_path
)
settings
.
input_types
=
[
dense_vector
(
settings
.
img_raw_size
),
# image feature
integer_value
(
settings
.
num_classes
)]
# labels
integer_value
(
settings
.
num_classes
)
]
# labels
settings
.
logger
.
info
(
'DataProvider Initialization finished'
)
...
...
@@ -79,8 +79,8 @@ def processData(settings, file_list):
img
=
image_util
.
decode_jpeg
(
data
[
'images'
][
i
])
else
:
img
=
data
[
'images'
][
i
]
img_feat
=
image_util
.
preprocess_img
(
img
,
settings
.
img_mean
,
settings
.
img_size
,
settings
.
is_train
,
settings
.
color
)
img_feat
=
image_util
.
preprocess_img
(
img
,
settings
.
img_mean
,
settings
.
img_size
,
settings
.
is_train
,
settings
.
color
)
label
=
data
[
'labels'
][
i
]
yield
img_feat
.
astype
(
'float32'
),
int
(
label
)
demo/image_classification/image_util.py
浏览文件 @
319742c6
...
...
@@ -16,17 +16,20 @@ import numpy as np
from
PIL
import
Image
from
cStringIO
import
StringIO
def
resize_image
(
img
,
target_size
):
"""
Resize an image so that the shorter edge has length target_size.
img: the input image to be resized.
target_size: the target resized image size.
"""
percent
=
(
target_size
/
float
(
min
(
img
.
size
[
0
],
img
.
size
[
1
])))
resized_size
=
int
(
round
(
img
.
size
[
0
]
*
percent
)),
int
(
round
(
img
.
size
[
1
]
*
percent
))
percent
=
(
target_size
/
float
(
min
(
img
.
size
[
0
],
img
.
size
[
1
])))
resized_size
=
int
(
round
(
img
.
size
[
0
]
*
percent
)),
int
(
round
(
img
.
size
[
1
]
*
percent
))
img
=
img
.
resize
(
resized_size
,
Image
.
ANTIALIAS
)
return
img
def
flip
(
im
):
"""
Return the flipped image.
...
...
@@ -38,6 +41,7 @@ def flip(im):
else
:
return
im
[:,
::
-
1
]
def
crop_img
(
im
,
inner_size
,
color
=
True
,
test
=
True
):
"""
Return cropped image.
...
...
@@ -50,20 +54,22 @@ def crop_img(im, inner_size, color=True, test=True):
If True, crop the center of images.
"""
if
color
:
height
,
width
=
max
(
inner_size
,
im
.
shape
[
1
]),
max
(
inner_size
,
im
.
shape
[
2
])
height
,
width
=
max
(
inner_size
,
im
.
shape
[
1
]),
max
(
inner_size
,
im
.
shape
[
2
])
padded_im
=
np
.
zeros
((
3
,
height
,
width
))
startY
=
(
height
-
im
.
shape
[
1
])
/
2
startX
=
(
width
-
im
.
shape
[
2
])
/
2
endY
,
endX
=
startY
+
im
.
shape
[
1
],
startX
+
im
.
shape
[
2
]
padded_im
[:,
startY
:
endY
,
startX
:
endX
]
=
im
padded_im
[:,
startY
:
endY
,
startX
:
endX
]
=
im
else
:
im
=
im
.
astype
(
'float32'
)
height
,
width
=
max
(
inner_size
,
im
.
shape
[
0
]),
max
(
inner_size
,
im
.
shape
[
1
])
height
,
width
=
max
(
inner_size
,
im
.
shape
[
0
]),
max
(
inner_size
,
im
.
shape
[
1
])
padded_im
=
np
.
zeros
((
height
,
width
))
startY
=
(
height
-
im
.
shape
[
0
])
/
2
startX
=
(
width
-
im
.
shape
[
1
])
/
2
endY
,
endX
=
startY
+
im
.
shape
[
0
],
startX
+
im
.
shape
[
1
]
padded_im
[
startY
:
endY
,
startX
:
endX
]
=
im
padded_im
[
startY
:
endY
,
startX
:
endX
]
=
im
if
test
:
startY
=
(
height
-
inner_size
)
/
2
startX
=
(
width
-
inner_size
)
/
2
...
...
@@ -72,19 +78,21 @@ def crop_img(im, inner_size, color=True, test=True):
startX
=
np
.
random
.
randint
(
0
,
width
-
inner_size
+
1
)
endY
,
endX
=
startY
+
inner_size
,
startX
+
inner_size
if
color
:
pic
=
padded_im
[:,
startY
:
endY
,
startX
:
endX
]
pic
=
padded_im
[:,
startY
:
endY
,
startX
:
endX
]
else
:
pic
=
padded_im
[
startY
:
endY
,
startX
:
endX
]
pic
=
padded_im
[
startY
:
endY
,
startX
:
endX
]
if
(
not
test
)
and
(
np
.
random
.
randint
(
2
)
==
0
):
pic
=
flip
(
pic
)
return
pic
def
decode_jpeg
(
jpeg_string
):
np_array
=
np
.
array
(
Image
.
open
(
StringIO
(
jpeg_string
)))
if
len
(
np_array
.
shape
)
==
3
:
np_array
=
np
.
transpose
(
np_array
,
(
2
,
0
,
1
))
return
np_array
def
preprocess_img
(
im
,
img_mean
,
crop_size
,
is_train
,
color
=
True
):
"""
Does data augmentation for images.
...
...
@@ -99,6 +107,7 @@ def preprocess_img(im, img_mean, crop_size, is_train, color=True):
pic
-=
img_mean
return
pic
.
flatten
()
def
load_meta
(
meta_path
,
mean_img_size
,
crop_size
,
color
=
True
):
"""
Return the loaded meta file.
...
...
@@ -109,17 +118,18 @@ def load_meta(meta_path, mean_img_size, crop_size, color=True):
mean
=
np
.
load
(
meta_path
)[
'data_mean'
]
border
=
(
mean_img_size
-
crop_size
)
/
2
if
color
:
assert
(
mean_img_size
*
mean_img_size
*
3
==
mean
.
shape
[
0
])
assert
(
mean_img_size
*
mean_img_size
*
3
==
mean
.
shape
[
0
])
mean
=
mean
.
reshape
(
3
,
mean_img_size
,
mean_img_size
)
mean
=
mean
[:,
border
:
border
+
crop_size
,
border
:
border
+
crop_size
].
astype
(
'float32'
)
mean
=
mean
[:,
border
:
border
+
crop_size
,
border
:
border
+
crop_size
].
astype
(
'float32'
)
else
:
assert
(
mean_img_size
*
mean_img_size
==
mean
.
shape
[
0
])
assert
(
mean_img_size
*
mean_img_size
==
mean
.
shape
[
0
])
mean
=
mean
.
reshape
(
mean_img_size
,
mean_img_size
)
mean
=
mean
[
border
:
border
+
crop_size
,
border
:
border
+
crop_size
].
astype
(
'float32'
)
mean
=
mean
[
border
:
border
+
crop_size
,
border
:
border
+
crop_size
].
astype
(
'float32'
)
return
mean
def
load_image
(
img_path
,
is_color
=
True
):
"""
Load image and return.
...
...
@@ -130,6 +140,7 @@ def load_image(img_path, is_color=True):
img
.
load
()
return
img
def
oversample
(
img
,
crop_dims
):
"""
image : iterable of (H x W x K) ndarrays
...
...
@@ -152,26 +163,29 @@ def oversample(img, crop_dims):
for
j
in
w_indices
:
crops_ix
[
curr
]
=
(
i
,
j
,
i
+
crop_dims
[
0
],
j
+
crop_dims
[
1
])
curr
+=
1
crops_ix
[
4
]
=
np
.
tile
(
im_center
,
(
1
,
2
))
+
np
.
concatenate
([
-
crop_dims
/
2.0
,
crop_dims
/
2.0
])
crops_ix
[
4
]
=
np
.
tile
(
im_center
,
(
1
,
2
))
+
np
.
concatenate
(
[
-
crop_dims
/
2.0
,
crop_dims
/
2.0
])
crops_ix
=
np
.
tile
(
crops_ix
,
(
2
,
1
))
# Extract crops
crops
=
np
.
empty
((
10
*
len
(
img
),
crop_dims
[
0
],
crop_dims
[
1
],
im_shape
[
-
1
]),
dtype
=
np
.
float32
)
crops
=
np
.
empty
(
(
10
*
len
(
img
),
crop_dims
[
0
],
crop_dims
[
1
],
im_shape
[
-
1
]),
dtype
=
np
.
float32
)
ix
=
0
for
im
in
img
:
for
crop
in
crops_ix
:
crops
[
ix
]
=
im
[
crop
[
0
]:
crop
[
2
],
crop
[
1
]:
crop
[
3
],
:]
ix
+=
1
crops
[
ix
-
5
:
ix
]
=
crops
[
ix
-
5
:
ix
,
:,
::
-
1
,
:]
# flip for mirrors
crops
[
ix
-
5
:
ix
]
=
crops
[
ix
-
5
:
ix
,
:,
::
-
1
,
:]
# flip for mirrors
return
crops
class
ImageTransformer
:
def
__init__
(
self
,
transpose
=
None
,
channel_swap
=
None
,
mean
=
None
,
is_color
=
True
):
def
__init__
(
self
,
transpose
=
None
,
channel_swap
=
None
,
mean
=
None
,
is_color
=
True
):
self
.
transpose
=
transpose
self
.
channel_swap
=
None
self
.
mean
=
None
...
...
demo/image_classification/prediction.py
浏览文件 @
319742c6
...
...
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import
os
,
sys
import
os
,
sys
import
numpy
as
np
import
logging
from
PIL
import
Image
...
...
@@ -24,9 +24,11 @@ from py_paddle import swig_paddle, DataProviderConverter
from
paddle.trainer.PyDataProvider2
import
dense_vector
from
paddle.trainer.config_parser
import
parse_config
logging
.
basicConfig
(
format
=
'[%(levelname)s %(asctime)s %(filename)s:%(lineno)s] %(message)s'
)
logging
.
basicConfig
(
format
=
'[%(levelname)s %(asctime)s %(filename)s:%(lineno)s] %(message)s'
)
logging
.
getLogger
().
setLevel
(
logging
.
INFO
)
class
ImageClassifier
():
def
__init__
(
self
,
train_conf
,
...
...
@@ -58,8 +60,8 @@ class ImageClassifier():
self
.
oversample
=
oversample
self
.
is_color
=
is_color
self
.
transformer
=
image_util
.
ImageTransformer
(
is_color
=
is_color
)
self
.
transformer
.
set_transpose
((
2
,
0
,
1
))
self
.
transformer
=
image_util
.
ImageTransformer
(
is_color
=
is_color
)
self
.
transformer
.
set_transpose
((
2
,
0
,
1
))
self
.
mean_file
=
mean_file
mean
=
np
.
load
(
self
.
mean_file
)[
'data_mean'
]
...
...
@@ -69,7 +71,8 @@ class ImageClassifier():
conf_args
=
"is_test=1,use_gpu=%d,is_predict=1"
%
(
gpu
)
conf
=
parse_config
(
train_conf
,
conf_args
)
swig_paddle
.
initPaddle
(
"--use_gpu=%d"
%
(
gpu
))
self
.
network
=
swig_paddle
.
GradientMachine
.
createFromConfigProto
(
conf
.
model_config
)
self
.
network
=
swig_paddle
.
GradientMachine
.
createFromConfigProto
(
conf
.
model_config
)
assert
isinstance
(
self
.
network
,
swig_paddle
.
GradientMachine
)
self
.
network
.
loadParameters
(
self
.
model_dir
)
...
...
@@ -90,14 +93,14 @@ class ImageClassifier():
# image_util.resize_image: short side is self.resize_dim
image
=
image_util
.
resize_image
(
image
,
self
.
resize_dim
)
image
=
np
.
array
(
image
)
input
=
np
.
zeros
(
(
1
,
image
.
shape
[
0
],
image
.
shape
[
1
],
3
),
dtype
=
np
.
float32
)
input
=
np
.
zeros
(
(
1
,
image
.
shape
[
0
],
image
.
shape
[
1
],
3
),
dtype
=
np
.
float32
)
input
[
0
]
=
image
.
astype
(
np
.
float32
)
input
=
image_util
.
oversample
(
input
,
self
.
crop_dims
)
else
:
image
=
image
.
resize
(
self
.
crop_dims
,
Image
.
ANTIALIAS
)
input
=
np
.
zeros
(
(
1
,
self
.
crop_dims
[
0
],
self
.
crop_dims
[
1
],
3
),
dtype
=
np
.
float32
)
input
=
np
.
zeros
(
(
1
,
self
.
crop_dims
[
0
],
self
.
crop_dims
[
1
],
3
),
dtype
=
np
.
float32
)
input
[
0
]
=
np
.
array
(
image
).
astype
(
np
.
float32
)
data_in
=
[]
...
...
@@ -133,18 +136,20 @@ class ImageClassifier():
lab
=
np
.
argsort
(
-
prob
)
logging
.
info
(
"Label of %s is: %d"
,
image
,
lab
[
0
])
if
__name__
==
'__main__'
:
image_size
=
32
crop_size
=
32
multi_crop
=
True
config
=
"vgg_16_cifar.py"
output_layer
=
"__fc_layer_1__"
mean_path
=
"data/cifar-out/batches/batches.meta"
model_path
=
sys
.
argv
[
1
]
image
=
sys
.
argv
[
2
]
use_gpu
=
bool
(
int
(
sys
.
argv
[
3
]))
obj
=
ImageClassifier
(
train_conf
=
config
,
image_size
=
32
crop_size
=
32
multi_crop
=
True
config
=
"vgg_16_cifar.py"
output_layer
=
"__fc_layer_1__"
mean_path
=
"data/cifar-out/batches/batches.meta"
model_path
=
sys
.
argv
[
1
]
image
=
sys
.
argv
[
2
]
use_gpu
=
bool
(
int
(
sys
.
argv
[
3
]))
obj
=
ImageClassifier
(
train_conf
=
config
,
model_dir
=
model_path
,
resize_dim
=
image_size
,
crop_dim
=
crop_size
,
...
...
demo/image_classification/preprocess.py
浏览文件 @
319742c6
...
...
@@ -19,22 +19,34 @@ from optparse import OptionParser
def
option_parser
():
parser
=
OptionParser
(
usage
=
"usage: python preprcoess.py "
\
"-i data_dir [options]"
)
parser
.
add_option
(
"-i"
,
"--input"
,
action
=
"store"
,
dest
=
"input"
,
help
=
"Input data directory."
)
parser
.
add_option
(
"-s"
,
"--size"
,
action
=
"store"
,
dest
=
"size"
,
help
=
"Processed image size."
)
parser
.
add_option
(
"-c"
,
"--color"
,
action
=
"store"
,
dest
=
"color"
,
help
=
"whether to use color images."
)
parser
.
add_option
(
"-i"
,
"--input"
,
action
=
"store"
,
dest
=
"input"
,
help
=
"Input data directory."
)
parser
.
add_option
(
"-s"
,
"--size"
,
action
=
"store"
,
dest
=
"size"
,
help
=
"Processed image size."
)
parser
.
add_option
(
"-c"
,
"--color"
,
action
=
"store"
,
dest
=
"color"
,
help
=
"whether to use color images."
)
return
parser
.
parse_args
()
if
__name__
==
'__main__'
:
options
,
args
=
option_parser
()
data_dir
=
options
.
input
processed_image_size
=
int
(
options
.
size
)
color
=
options
.
color
==
"1"
data_creator
=
ImageClassificationDatasetCreater
(
data_dir
,
processed_image_size
,
color
)
data_creator
=
ImageClassificationDatasetCreater
(
data_dir
,
processed_image_size
,
color
)
data_creator
.
train_list_name
=
"train.txt"
data_creator
.
test_list_name
=
"test.txt"
data_creator
.
num_per_batch
=
1000
...
...
demo/image_classification/vgg_16_cifar.py
浏览文件 @
319742c6
...
...
@@ -18,14 +18,20 @@ is_predict = get_config_arg("is_predict", bool, False)
####################Data Configuration ##################
if
not
is_predict
:
data_dir
=
'data/cifar-out/batches/'
meta_path
=
data_dir
+
'batches.meta'
args
=
{
'meta'
:
meta_path
,
'mean_img_size'
:
32
,
'img_size'
:
32
,
'num_classes'
:
10
,
'use_jpeg'
:
1
,
'color'
:
"color"
}
define_py_data_sources2
(
train_list
=
"train.list"
,
data_dir
=
'data/cifar-out/batches/'
meta_path
=
data_dir
+
'batches.meta'
args
=
{
'meta'
:
meta_path
,
'mean_img_size'
:
32
,
'img_size'
:
32
,
'num_classes'
:
10
,
'use_jpeg'
:
1
,
'color'
:
"color"
}
define_py_data_sources2
(
train_list
=
"train.list"
,
test_list
=
"train.list"
,
module
=
'image_provider'
,
obj
=
'processData'
,
...
...
@@ -33,21 +39,17 @@ if not is_predict:
######################Algorithm Configuration #############
settings
(
batch_size
=
128
,
learning_rate
=
0.1
/
128.0
,
learning_method
=
MomentumOptimizer
(
0.9
),
regularization
=
L2Regularization
(
0.0005
*
128
)
)
batch_size
=
128
,
learning_rate
=
0.1
/
128.0
,
learning_method
=
MomentumOptimizer
(
0.9
),
regularization
=
L2Regularization
(
0.0005
*
128
))
#######################Network Configuration #############
data_size
=
3
*
32
*
32
label_size
=
10
img
=
data_layer
(
name
=
'image'
,
size
=
data_size
)
data_size
=
3
*
32
*
32
label_size
=
10
img
=
data_layer
(
name
=
'image'
,
size
=
data_size
)
# small_vgg is predefined in trainer_config_helpers.networks
predict
=
small_vgg
(
input_image
=
img
,
num_channels
=
3
,
num_classes
=
label_size
)
predict
=
small_vgg
(
input_image
=
img
,
num_channels
=
3
,
num_classes
=
label_size
)
if
not
is_predict
:
lbl
=
data_layer
(
name
=
"label"
,
size
=
label_size
)
...
...
demo/introduction/dataprovider.py
浏览文件 @
319742c6
...
...
@@ -15,10 +15,10 @@
from
paddle.trainer.PyDataProvider2
import
*
import
random
# define data types of input: 2 real numbers
@
provider
(
input_types
=
[
dense_vector
(
1
),
dense_vector
(
1
)],
use_seq
=
False
)
@
provider
(
input_types
=
[
dense_vector
(
1
),
dense_vector
(
1
)],
use_seq
=
False
)
def
process
(
settings
,
input_file
):
for
i
in
xrange
(
2000
):
x
=
random
.
random
()
yield
[
x
],
[
2
*
x
+
0.3
]
yield
[
x
],
[
2
*
x
+
0.3
]
demo/introduction/evaluate_model.py
浏览文件 @
319742c6
...
...
@@ -23,14 +23,17 @@ Usage:
import
numpy
as
np
import
os
def
load
(
file_name
):
with
open
(
file_name
,
'rb'
)
as
f
:
f
.
read
(
16
)
# skip header for float type.
return
np
.
fromfile
(
f
,
dtype
=
np
.
float32
)
def
main
():
print
'w=%.6f, b=%.6f from pass 29'
%
(
load
(
'output/pass-00029/w'
),
load
(
'output/pass-00029/b'
))
if
__name__
==
'__main__'
:
main
()
demo/introduction/trainer_config.py
浏览文件 @
319742c6
...
...
@@ -16,9 +16,14 @@ from paddle.trainer_config_helpers import *
# 1. read data. Suppose you saved above python code as dataprovider.py
data_file
=
'empty.list'
with
open
(
data_file
,
'w'
)
as
f
:
f
.
writelines
(
' '
)
define_py_data_sources2
(
train_list
=
data_file
,
test_list
=
None
,
module
=
'dataprovider'
,
obj
=
'process'
,
args
=
{})
with
open
(
data_file
,
'w'
)
as
f
:
f
.
writelines
(
' '
)
define_py_data_sources2
(
train_list
=
data_file
,
test_list
=
None
,
module
=
'dataprovider'
,
obj
=
'process'
,
args
=
{})
# 2. learning algorithm
settings
(
batch_size
=
12
,
learning_rate
=
1e-3
,
learning_method
=
MomentumOptimizer
())
...
...
@@ -26,7 +31,11 @@ settings(batch_size=12, learning_rate=1e-3, learning_method=MomentumOptimizer())
# 3. Network configuration
x
=
data_layer
(
name
=
'x'
,
size
=
1
)
y
=
data_layer
(
name
=
'y'
,
size
=
1
)
y_predict
=
fc_layer
(
input
=
x
,
param_attr
=
ParamAttr
(
name
=
'w'
),
size
=
1
,
act
=
LinearActivation
(),
bias_attr
=
ParamAttr
(
name
=
'b'
))
y_predict
=
fc_layer
(
input
=
x
,
param_attr
=
ParamAttr
(
name
=
'w'
),
size
=
1
,
act
=
LinearActivation
(),
bias_attr
=
ParamAttr
(
name
=
'b'
))
cost
=
regression_cost
(
input
=
y_predict
,
label
=
y
)
outputs
(
cost
)
demo/mnist/data/generate_list.py
浏览文件 @
319742c6
...
...
@@ -13,9 +13,9 @@
# limitations under the License.
o
=
open
(
"./"
+
"train.list"
,
"w"
)
o
.
write
(
"./data/raw_data/train"
+
"
\n
"
)
o
.
write
(
"./data/raw_data/train"
+
"
\n
"
)
o
.
close
()
o
=
open
(
"./"
+
"test.list"
,
"w"
)
o
.
write
(
"./data/raw_data/t10k"
+
"
\n
"
)
o
.
write
(
"./data/raw_data/t10k"
+
"
\n
"
)
o
.
close
()
demo/mnist/mnist_provider.py
浏览文件 @
319742c6
...
...
@@ -2,10 +2,9 @@ from paddle.trainer.PyDataProvider2 import *
# Define a py data provider
@
provider
(
input_types
=
{
'pixel'
:
dense_vector
(
28
*
28
),
'label'
:
integer_value
(
10
)
})
@
provider
(
input_types
=
{
'pixel'
:
dense_vector
(
28
*
28
),
'label'
:
integer_value
(
10
)})
def
process
(
settings
,
filename
):
# settings is not used currently.
imgf
=
filename
+
"-images-idx3-ubyte"
labelf
=
filename
+
"-labels-idx1-ubyte"
...
...
demo/mnist/vgg_16_mnist.py
浏览文件 @
319742c6
...
...
@@ -18,32 +18,29 @@ is_predict = get_config_arg("is_predict", bool, False)
####################Data Configuration ##################
if
not
is_predict
:
data_dir
=
'./data/'
define_py_data_sources2
(
train_list
=
data_dir
+
'train.list'
,
test_list
=
data_dir
+
'test.list'
,
data_dir
=
'./data/'
define_py_data_sources2
(
train_list
=
data_dir
+
'train.list'
,
test_list
=
data_dir
+
'test.list'
,
module
=
'mnist_provider'
,
obj
=
'process'
)
######################Algorithm Configuration #############
settings
(
batch_size
=
128
,
learning_rate
=
0.1
/
128.0
,
learning_method
=
MomentumOptimizer
(
0.9
),
regularization
=
L2Regularization
(
0.0005
*
128
)
)
batch_size
=
128
,
learning_rate
=
0.1
/
128.0
,
learning_method
=
MomentumOptimizer
(
0.9
),
regularization
=
L2Regularization
(
0.0005
*
128
))
#######################Network Configuration #############
data_size
=
1
*
28
*
28
label_size
=
10
data_size
=
1
*
28
*
28
label_size
=
10
img
=
data_layer
(
name
=
'pixel'
,
size
=
data_size
)
# small_vgg is predined in trainer_config_helpers.network
predict
=
small_vgg
(
input_image
=
img
,
num_channels
=
1
,
num_classes
=
label_size
)
predict
=
small_vgg
(
input_image
=
img
,
num_channels
=
1
,
num_classes
=
label_size
)
if
not
is_predict
:
lbl
=
data_layer
(
name
=
"label"
,
size
=
label_size
)
...
...
demo/model_zoo/embedding/extract_para.py
浏览文件 @
319742c6
...
...
@@ -12,7 +12,6 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Example:
python extract_para.py --preModel PREMODEL --preDict PREDICT
\
...
...
@@ -29,6 +28,7 @@ Options:
from
optparse
import
OptionParser
import
struct
def
get_row_index
(
preDict
,
usrDict
):
"""
Get the row positions for all words in user dictionary from pre-trained dictionary.
...
...
@@ -47,7 +47,9 @@ def get_row_index(preDict, usrDict):
pos
.
append
(
index
[
word
])
return
pos
def
extract_parameters_by_usrDict
(
preModel
,
preDict
,
usrModel
,
usrDict
,
paraDim
):
def
extract_parameters_by_usrDict
(
preModel
,
preDict
,
usrModel
,
usrDict
,
paraDim
):
"""
Extract desired parameters from a pretrained embedding model based on user dictionary
"""
...
...
@@ -70,6 +72,7 @@ def extract_parameters_by_usrDict(preModel, preDict, usrModel, usrDict, paraDim)
print
"extract parameters finish, total"
,
len
(
rowIndex
),
"lines"
fi
.
close
()
def
main
():
"""
Main entry for running paraconvert.py
...
...
@@ -78,19 +81,33 @@ def main():
"python %prog --preModel PREMODEL --preDict PREDICT"
\
" --usrModel USRMODEL --usrDict USRDICT -d DIM"
parser
=
OptionParser
(
usage
)
parser
.
add_option
(
"--preModel"
,
action
=
"store"
,
dest
=
"preModel"
,
parser
.
add_option
(
"--preModel"
,
action
=
"store"
,
dest
=
"preModel"
,
help
=
"the name of pretrained embedding model"
)
parser
.
add_option
(
"--preDict"
,
action
=
"store"
,
dest
=
"preDict"
,
parser
.
add_option
(
"--preDict"
,
action
=
"store"
,
dest
=
"preDict"
,
help
=
"the name of pretrained dictionary"
)
parser
.
add_option
(
"--usrModel"
,
action
=
"store"
,
dest
=
"usrModel"
,
parser
.
add_option
(
"--usrModel"
,
action
=
"store"
,
dest
=
"usrModel"
,
help
=
"the name of output usr embedding model"
)
parser
.
add_option
(
"--usrDict"
,
action
=
"store"
,
dest
=
"usrDict"
,
parser
.
add_option
(
"--usrDict"
,
action
=
"store"
,
dest
=
"usrDict"
,
help
=
"the name of user specified dictionary"
)
parser
.
add_option
(
"-d"
,
action
=
"store"
,
dest
=
"dim"
,
help
=
"dimension of parameter"
)
parser
.
add_option
(
"-d"
,
action
=
"store"
,
dest
=
"dim"
,
help
=
"dimension of parameter"
)
(
options
,
args
)
=
parser
.
parse_args
()
extract_parameters_by_usrDict
(
options
.
preModel
,
options
.
preDict
,
options
.
usrModel
,
options
.
usrDict
,
int
(
options
.
dim
))
options
.
usrModel
,
options
.
usrDict
,
int
(
options
.
dim
))
if
__name__
==
'__main__'
:
main
()
demo/model_zoo/embedding/paraconvert.py
浏览文件 @
319742c6
...
...
@@ -12,7 +12,6 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Example:
python paraconvert.py --b2t -i INPUT -o OUTPUT -d DIM
...
...
@@ -29,6 +28,7 @@ Options:
from
optparse
import
OptionParser
import
struct
def
binary2text
(
input
,
output
,
paraDim
):
"""
Convert a binary parameter file of embedding model to be a text file.
...
...
@@ -76,6 +76,7 @@ def binary2text(input, output, paraDim):
fo
.
close
()
print
"binary2text finish, total"
,
line
,
"lines"
def
get_para_count
(
input
):
"""
Compute the total number of embedding parameters in input text file.
...
...
@@ -90,6 +91,7 @@ def get_para_count(input):
numRows
+=
1
return
numRows
*
paraDim
def
text2binary
(
input
,
output
,
paddle_head
=
True
):
"""
Convert a text parameter file of embedding model to be a binary file.
...
...
@@ -123,6 +125,7 @@ def text2binary(input, output, paddle_head=True):
fo
.
close
()
print
"text2binary finish, total"
,
count
,
"lines"
def
main
():
"""
Main entry for running paraconvert.py
...
...
@@ -131,21 +134,26 @@ def main():
"python %prog --b2t -i INPUT -o OUTPUT -d DIM
\n
"
\
"python %prog --t2b -i INPUT -o OUTPUT"
parser
=
OptionParser
(
usage
)
parser
.
add_option
(
"--b2t"
,
action
=
"store_true"
,
parser
.
add_option
(
"--b2t"
,
action
=
"store_true"
,
help
=
"convert parameter file of embedding model from binary to text"
)
parser
.
add_option
(
"--t2b"
,
action
=
"store_true"
,
parser
.
add_option
(
"--t2b"
,
action
=
"store_true"
,
help
=
"convert parameter file of embedding model from text to binary"
)
parser
.
add_option
(
"-i"
,
action
=
"store"
,
dest
=
"input"
,
help
=
"input parameter file name"
)
parser
.
add_option
(
"-o"
,
action
=
"store"
,
dest
=
"output"
,
help
=
"output parameter file name"
)
parser
.
add_option
(
"-d"
,
action
=
"store"
,
dest
=
"dim"
,
help
=
"dimension of parameter"
)
parser
.
add_option
(
"-i"
,
action
=
"store"
,
dest
=
"input"
,
help
=
"input parameter file name"
)
parser
.
add_option
(
"-o"
,
action
=
"store"
,
dest
=
"output"
,
help
=
"output parameter file name"
)
parser
.
add_option
(
"-d"
,
action
=
"store"
,
dest
=
"dim"
,
help
=
"dimension of parameter"
)
(
options
,
args
)
=
parser
.
parse_args
()
if
options
.
b2t
:
binary2text
(
options
.
input
,
options
.
output
,
options
.
dim
)
if
options
.
t2b
:
text2binary
(
options
.
input
,
options
.
output
)
if
__name__
==
'__main__'
:
main
()
demo/model_zoo/resnet/classify.py
浏览文件 @
319742c6
...
...
@@ -26,16 +26,22 @@ from py_paddle import swig_paddle, DataProviderConverter
from
paddle.trainer.PyDataProvider2
import
dense_vector
from
paddle.trainer.config_parser
import
parse_config
logging
.
basicConfig
(
format
=
'[%(levelname)s %(asctime)s %(filename)s:%(lineno)s] %(message)s'
)
logging
.
basicConfig
(
format
=
'[%(levelname)s %(asctime)s %(filename)s:%(lineno)s] %(message)s'
)
logging
.
getLogger
().
setLevel
(
logging
.
INFO
)
class
ImageClassifier
():
def
__init__
(
self
,
train_conf
,
model_dir
=
None
,
resize_dim
=
256
,
crop_dim
=
224
,
def
__init__
(
self
,
train_conf
,
model_dir
=
None
,
resize_dim
=
256
,
crop_dim
=
224
,
use_gpu
=
True
,
mean_file
=
None
,
output_layer
=
None
,
oversample
=
False
,
is_color
=
True
):
oversample
=
False
,
is_color
=
True
):
"""
train_conf: network configure.
model_dir: string, directory of model.
...
...
@@ -62,9 +68,9 @@ class ImageClassifier():
assert
isinstance
(
self
.
output_layer
,
basestring
)
self
.
output_layer
=
self
.
output_layer
.
split
(
","
)
self
.
transformer
=
image_util
.
ImageTransformer
(
is_color
=
is_color
)
self
.
transformer
.
set_transpose
((
2
,
0
,
1
))
self
.
transformer
.
set_channel_swap
((
2
,
1
,
0
))
self
.
transformer
=
image_util
.
ImageTransformer
(
is_color
=
is_color
)
self
.
transformer
.
set_transpose
((
2
,
0
,
1
))
self
.
transformer
.
set_channel_swap
((
2
,
1
,
0
))
self
.
mean_file
=
mean_file
if
self
.
mean_file
is
not
None
:
...
...
@@ -74,12 +80,13 @@ class ImageClassifier():
else
:
# if you use three mean value, set like:
# this three mean value is calculated from ImageNet.
self
.
transformer
.
set_mean
(
np
.
array
([
103.939
,
116.779
,
123.68
]))
self
.
transformer
.
set_mean
(
np
.
array
([
103.939
,
116.779
,
123.68
]))
conf_args
=
"is_test=1,use_gpu=%d,is_predict=1"
%
(
int
(
use_gpu
))
conf
=
parse_config
(
train_conf
,
conf_args
)
swig_paddle
.
initPaddle
(
"--use_gpu=%d"
%
(
int
(
use_gpu
)))
self
.
network
=
swig_paddle
.
GradientMachine
.
createFromConfigProto
(
conf
.
model_config
)
self
.
network
=
swig_paddle
.
GradientMachine
.
createFromConfigProto
(
conf
.
model_config
)
assert
isinstance
(
self
.
network
,
swig_paddle
.
GradientMachine
)
self
.
network
.
loadParameters
(
self
.
model_dir
)
...
...
@@ -105,14 +112,14 @@ class ImageClassifier():
# image_util.resize_image: short side is self.resize_dim
image
=
image_util
.
resize_image
(
image
,
self
.
resize_dim
)
image
=
np
.
array
(
image
)
input
=
np
.
zeros
(
(
1
,
image
.
shape
[
0
],
image
.
shape
[
1
],
3
),
dtype
=
np
.
float32
)
input
=
np
.
zeros
(
(
1
,
image
.
shape
[
0
],
image
.
shape
[
1
],
3
),
dtype
=
np
.
float32
)
input
[
0
]
=
image
.
astype
(
np
.
float32
)
input
=
image_util
.
oversample
(
input
,
self
.
crop_dims
)
else
:
image
=
image
.
resize
(
self
.
crop_dims
,
Image
.
ANTIALIAS
)
input
=
np
.
zeros
(
(
1
,
self
.
crop_dims
[
0
],
self
.
crop_dims
[
1
],
3
),
dtype
=
np
.
float32
)
input
=
np
.
zeros
(
(
1
,
self
.
crop_dims
[
0
],
self
.
crop_dims
[
1
],
3
),
dtype
=
np
.
float32
)
input
[
0
]
=
np
.
array
(
image
).
astype
(
np
.
float32
)
data_in
=
[]
...
...
@@ -172,7 +179,7 @@ class ImageClassifier():
logging
.
info
(
"Label of %s is: %d"
,
image
,
lab
[
0
])
return
results
def
extract
(
self
,
data_file
,
output_dir
,
batch_size
=
10000
):
def
extract
(
self
,
data_file
,
output_dir
,
batch_size
=
10000
):
"""
extract and save features of output layers, which are
specify in Outputs() in network configure.
...
...
@@ -197,7 +204,7 @@ class ImageClassifier():
image_feature
[
file_name
]
=
feature
sample_num
+=
1
if
sample_num
==
batch_size
:
batch_name
=
os
.
path
.
join
(
output_dir
,
'batch_%d'
%
(
batch_num
))
batch_name
=
os
.
path
.
join
(
output_dir
,
'batch_%d'
%
(
batch_num
))
self
.
save_file
(
image_feature
,
batch_name
)
logging
.
info
(
'Finish batch %d'
,
batch_num
)
batch_num
+=
1
...
...
@@ -206,7 +213,7 @@ class ImageClassifier():
if
idx
%
1000
==
0
:
logging
.
info
(
'%d/%d, %s'
,
idx
,
len
(
image_files
),
file_name
)
if
sample_num
>
0
:
batch_name
=
os
.
path
.
join
(
output_dir
,
'batch_%d'
%
(
batch_num
))
batch_name
=
os
.
path
.
join
(
output_dir
,
'batch_%d'
%
(
batch_num
))
self
.
save_file
(
image_feature
,
batch_name
)
logging
.
info
(
'Finish batch %d'
,
batch_num
)
logging
.
info
(
'Done: make image feature batch'
)
...
...
@@ -215,37 +222,63 @@ class ImageClassifier():
of
=
open
(
file
,
'wb'
)
cPickle
.
dump
(
data
,
of
,
protocol
=
cPickle
.
HIGHEST_PROTOCOL
)
def
option_parser
():
"""
Main entry for predciting
"""
usage
=
"%prog -c config -i data_list -w model_dir [options]"
parser
=
OptionParser
(
usage
=
"usage: %s"
%
usage
)
parser
.
add_option
(
"-j"
,
"--job"
,
action
=
"store"
,
dest
=
"job_type"
,
parser
.
add_option
(
"-j"
,
"--job"
,
action
=
"store"
,
dest
=
"job_type"
,
help
=
"job type: predict, extract
\
predict: predicting,
\
extract: extract features"
)
parser
.
add_option
(
"-c"
,
"--conf"
,
action
=
"store"
,
dest
=
"train_conf"
,
parser
.
add_option
(
"-c"
,
"--conf"
,
action
=
"store"
,
dest
=
"train_conf"
,
help
=
"network config"
)
parser
.
add_option
(
"-i"
,
"--data"
,
action
=
"store"
,
dest
=
"data_file"
,
help
=
"image list"
)
parser
.
add_option
(
"-w"
,
"--model"
,
action
=
"store"
,
dest
=
"model_path"
,
default
=
None
,
help
=
"model path"
)
parser
.
add_option
(
"-g"
,
"--use_gpu"
,
action
=
"store"
,
dest
=
"use_gpu"
,
default
=
True
,
parser
.
add_option
(
"-i"
,
"--data"
,
action
=
"store"
,
dest
=
"data_file"
,
help
=
"image list"
)
parser
.
add_option
(
"-w"
,
"--model"
,
action
=
"store"
,
dest
=
"model_path"
,
default
=
None
,
help
=
"model path"
)
parser
.
add_option
(
"-g"
,
"--use_gpu"
,
action
=
"store"
,
dest
=
"use_gpu"
,
default
=
True
,
help
=
"Whether to use gpu mode."
)
parser
.
add_option
(
"-o"
,
"--output_dir"
,
action
=
"store"
,
dest
=
"output_dir"
,
default
=
"output"
,
help
=
"output path"
)
parser
.
add_option
(
"-m"
,
"--mean"
,
action
=
"store"
,
dest
=
"mean"
,
default
=
None
,
parser
.
add_option
(
"-o"
,
"--output_dir"
,
action
=
"store"
,
dest
=
"output_dir"
,
default
=
"output"
,
help
=
"output path"
)
parser
.
add_option
(
"-m"
,
"--mean"
,
action
=
"store"
,
dest
=
"mean"
,
default
=
None
,
help
=
"mean file."
)
parser
.
add_option
(
"-p"
,
"--multi_crop"
,
action
=
"store_true"
,
dest
=
"multi_crop"
,
default
=
False
,
parser
.
add_option
(
"-p"
,
"--multi_crop"
,
action
=
"store_true"
,
dest
=
"multi_crop"
,
default
=
False
,
help
=
"Wether to use multiple crops on image."
)
parser
.
add_option
(
"-l"
,
"--output_layer"
,
action
=
"store"
,
dest
=
"output_layer"
,
default
=
None
,
...
...
@@ -254,13 +287,15 @@ def option_parser():
"classification probability, output in resnet.py."
)
return
parser
.
parse_args
()
def
main
():
"""
1. parse input arguments.
2. predicting or extract features according job type.
"""
options
,
args
=
option_parser
()
obj
=
ImageClassifier
(
options
.
train_conf
,
obj
=
ImageClassifier
(
options
.
train_conf
,
options
.
model_path
,
use_gpu
=
options
.
use_gpu
,
mean_file
=
options
.
mean
,
...
...
@@ -270,8 +305,8 @@ def main():
obj
.
predict
(
options
.
data_file
)
elif
options
.
job_type
==
"extract"
:
obj
.
extract
(
options
.
data_file
,
options
.
output_dir
)
obj
.
extract
(
options
.
data_file
,
options
.
output_dir
)
if
__name__
==
'__main__'
:
main
()
demo/model_zoo/resnet/example/__init__.py
浏览文件 @
319742c6
...
...
@@ -11,4 +11,3 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
demo/model_zoo/resnet/example/image_list_provider.py
浏览文件 @
319742c6
...
...
@@ -16,8 +16,7 @@ from paddle.utils.image_util import *
from
paddle.trainer.PyDataProvider2
import
*
def
hook
(
settings
,
image_size
,
crop_size
,
color
,
file_list
,
is_train
,
**
kwargs
):
def
hook
(
settings
,
image_size
,
crop_size
,
color
,
file_list
,
is_train
,
**
kwargs
):
"""
Description: Init with a list of data file
file_list is the name list of input files.
...
...
@@ -58,7 +57,7 @@ def hook(settings, image_size, crop_size, color, file_list,
sz
=
settings
.
crop_size
*
settings
.
crop_size
settings
.
img_mean
=
np
.
zeros
(
sz
*
3
,
dtype
=
np
.
single
)
for
idx
,
value
in
enumerate
(
settings
.
mean_value
):
settings
.
img_mean
[
idx
*
sz
:
(
idx
+
1
)
*
sz
]
=
value
settings
.
img_mean
[
idx
*
sz
:(
idx
+
1
)
*
sz
]
=
value
settings
.
img_mean
=
settings
.
img_mean
.
reshape
(
3
,
settings
.
crop_size
,
settings
.
crop_size
)
...
...
@@ -69,7 +68,8 @@ def hook(settings, image_size, crop_size, color, file_list,
settings
.
input_types
=
[
dense_vector
(
settings
.
img_input_size
),
# image feature
integer_value
(
1
)]
# labels
integer_value
(
1
)
]
# labels
settings
.
logger
.
info
(
'Image short side: %s'
,
settings
.
img_size
)
settings
.
logger
.
info
(
'Crop size: %s'
,
settings
.
crop_size
)
...
...
@@ -97,9 +97,6 @@ def processData(settings, file_list):
# swap channel
if
settings
.
is_swap_channel
:
img
=
img
[
settings
.
swap_channel
,
:,
:]
img_feat
=
preprocess_img
(
img
,
settings
.
img_mean
,
settings
.
crop_size
,
settings
.
is_train
,
settings
.
color
)
img_feat
=
preprocess_img
(
img
,
settings
.
img_mean
,
settings
.
crop_size
,
settings
.
is_train
,
settings
.
color
)
yield
img_feat
.
tolist
(),
int
(
lab
.
strip
())
demo/model_zoo/resnet/load_feature.py
浏览文件 @
319742c6
...
...
@@ -17,9 +17,11 @@ import sys
import
cPickle
import
logging
logging
.
basicConfig
(
format
=
'[%(levelname)s %(asctime)s %(filename)s:%(lineno)s] %(message)s'
)
logging
.
basicConfig
(
format
=
'[%(levelname)s %(asctime)s %(filename)s:%(lineno)s] %(message)s'
)
logging
.
getLogger
().
setLevel
(
logging
.
INFO
)
def
load_feature_c
(
file
):
"""
Load feature extracted by C++ interface.
...
...
@@ -38,6 +40,7 @@ def load_feature_c(file):
f
.
close
()
return
features
def
load_feature_py
(
feature_dir
):
"""
Load feature extracted by python interface.
...
...
@@ -54,6 +57,7 @@ def load_feature_py(feature_dir):
logging
.
info
(
'Load feature file %s'
,
file_name
)
return
features
if
__name__
==
'__main__'
:
print
load_feature_py
(
sys
.
argv
[
1
])
#print load_feature_c(sys.argv[1])
demo/model_zoo/resnet/resnet.py
浏览文件 @
319742c6
...
...
@@ -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
():
...
...
demo/quick_start/api_train.py
浏览文件 @
319742c6
...
...
@@ -22,27 +22,32 @@ from py_paddle import DataProviderConverter
from
paddle.trainer.PyDataProvider2
\
import
integer_value
,
integer_value_sequence
,
sparse_binary_vector
def
parse_arguments
():
parser
=
argparse
.
ArgumentParser
()
parser
.
add_argument
(
"--train_data"
,
type
=
str
,
required
=
False
,
help
=
"train data file"
)
parser
.
add_argument
(
"--train_data"
,
type
=
str
,
required
=
False
,
help
=
"train data file"
)
parser
.
add_argument
(
"--test_data"
,
type
=
str
,
help
=
"test data file"
)
parser
.
add_argument
(
"--config"
,
type
=
str
,
required
=
True
,
help
=
"config file name"
)
parser
.
add_argument
(
"--config"
,
type
=
str
,
required
=
True
,
help
=
"config file name"
)
parser
.
add_argument
(
"--dict_file"
,
required
=
True
,
help
=
"dictionary file"
)
parser
.
add_argument
(
"--seq"
,
default
=
1
,
type
=
int
,
help
=
"whether use sequence training"
)
parser
.
add_argument
(
"--use_gpu"
,
default
=
0
,
type
=
int
,
help
=
"whether use GPU for training"
)
parser
.
add_argument
(
"--trainer_count"
,
default
=
1
,
type
=
int
,
parser
.
add_argument
(
"--seq"
,
default
=
1
,
type
=
int
,
help
=
"whether use sequence training"
)
parser
.
add_argument
(
"--use_gpu"
,
default
=
0
,
type
=
int
,
help
=
"whether use GPU for training"
)
parser
.
add_argument
(
"--trainer_count"
,
default
=
1
,
type
=
int
,
help
=
"Number of threads for training"
)
parser
.
add_argument
(
"--num_passes"
,
default
=
5
,
type
=
int
,
help
=
"Number of training passes"
)
parser
.
add_argument
(
"--num_passes"
,
default
=
5
,
type
=
int
,
help
=
"Number of training passes"
)
return
parser
.
parse_args
()
UNK_IDX
=
0
def
load_data
(
file_name
,
word_dict
):
with
open
(
file_name
,
'r'
)
as
f
:
for
line
in
f
:
...
...
@@ -51,6 +56,7 @@ def load_data(file_name, word_dict):
word_slot
=
[
word_dict
.
get
(
w
,
UNK_IDX
)
for
w
in
words
]
yield
word_slot
,
int
(
label
)
def
load_dict
(
dict_file
):
word_dict
=
dict
()
with
open
(
dict_file
,
'r'
)
as
f
:
...
...
@@ -59,6 +65,7 @@ def load_dict(dict_file):
word_dict
[
w
]
=
i
return
word_dict
def
main
():
options
=
parse_arguments
()
api
.
initPaddle
(
"--use_gpu=%s"
%
options
.
use_gpu
,
...
...
@@ -86,9 +93,9 @@ def main():
# create a data converter which converts data to PaddlePaddle
# internal format
input_types
=
[
integer_value_sequence
(
len
(
word_dict
))
if
options
.
seq
else
sparse_binary_vector
(
len
(
word_dict
)),
integer_value
(
2
)
]
integer_value_sequence
(
len
(
word_dict
))
if
options
.
seq
else
sparse_binary_vector
(
len
(
word_dict
)),
integer_value
(
2
)
]
converter
=
DataProviderConverter
(
input_types
)
batch_size
=
trainer_config
.
opt_config
.
batch_size
...
...
@@ -102,7 +109,7 @@ def main():
trainer
.
trainOneDataBatch
(
size
,
converter
(
batch
))
trainer
.
finishTrainPass
()
if
test_dataset
:
trainer
.
startTestPeriod
()
;
trainer
.
startTestPeriod
()
for
pos
in
xrange
(
0
,
len
(
test_dataset
),
batch_size
):
batch
=
itertools
.
islice
(
test_dataset
,
pos
,
pos
+
batch_size
)
size
=
min
(
batch_size
,
len
(
test_dataset
)
-
pos
)
...
...
@@ -110,5 +117,6 @@ def main():
trainer
.
finishTestPeriod
()
trainer
.
finishTrain
()
if
__name__
==
'__main__'
:
main
()
demo/quick_start/dataprovider_bow.py
浏览文件 @
319742c6
...
...
@@ -17,6 +17,7 @@ from paddle.trainer.PyDataProvider2 import *
# id of the word not in dictionary
UNK_IDX
=
0
# initializer is called by the framework during initialization.
# It allows the user to describe the data types and setup the
# necessary data structure for later use.
...
...
@@ -38,7 +39,9 @@ def initializer(settings, dictionary, **kwargs):
# The second input is an integer. It represents the category id of the
# sample. 2 means there are two labels in the dataset.
# (1 for positive and 0 for negative)
integer_value
(
2
)]
integer_value
(
2
)
]
# Delaring a data provider. It has an initializer 'data_initialzer'.
# It will cache the generated data of the first pass in memory, so that
...
...
@@ -69,9 +72,8 @@ def process(settings, file_name):
def
predict_initializer
(
settings
,
dictionary
,
**
kwargs
):
settings
.
word_dict
=
dictionary
settings
.
input_types
=
[
sparse_binary_vector
(
len
(
dictionary
))
]
settings
.
input_types
=
[
sparse_binary_vector
(
len
(
dictionary
))]
# Declaring a data provider for prediction. The difference with process
# is that label is not generated.
...
...
demo/quick_start/dataprovider_emb.py
浏览文件 @
319742c6
...
...
@@ -24,7 +24,8 @@ def initializer(settings, dictionary, **kwargs):
# The value of the integers range from 0 to len(dictrionary)-1
integer_value_sequence
(
len
(
dictionary
)),
# Define the second input for label id
integer_value
(
2
)]
integer_value
(
2
)
]
@
provider
(
init_hook
=
initializer
,
cache
=
CacheType
.
CACHE_PASS_IN_MEM
)
...
...
@@ -40,7 +41,8 @@ def process(settings, file_name):
def
predict_initializer
(
settings
,
dictionary
,
**
kwargs
):
settings
.
word_dict
=
dictionary
settings
.
input_types
=
[
integer_value
(
len
(
dictionary
),
seq_type
=
SequenceType
.
SEQUENCE
)
integer_value
(
len
(
dictionary
),
seq_type
=
SequenceType
.
SEQUENCE
)
]
...
...
demo/quick_start/preprocess.py
浏览文件 @
319742c6
...
...
@@ -13,7 +13,6 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
1. (remove HTML before or not)tokensizing
2. pos sample : rating score 5; neg sample: rating score 1-2.
...
...
@@ -35,7 +34,8 @@ import multiprocessing
batch_size
=
5000
word_count
=
{}
num_tokenize
=
max
(
1
,
multiprocessing
.
cpu_count
()
-
2
)
# parse + tokenize + save
num_tokenize
=
max
(
1
,
multiprocessing
.
cpu_count
()
-
2
)
# parse + tokenize + save
max_queue_size
=
8
parse_queue
=
Queue
(
maxsize
=
max_queue_size
+
num_tokenize
)
tokenize_queue
=
Queue
(
maxsize
=
max_queue_size
+
num_tokenize
)
...
...
demo/quick_start/trainer_config.bidi-lstm.py
浏览文件 @
319742c6
...
...
@@ -27,7 +27,8 @@ is_predict = get_config_arg('is_predict', bool, False)
trn
=
'data/train.list'
if
not
is_predict
else
None
tst
=
'data/test.list'
if
not
is_predict
else
'data/pred.list'
process
=
'process'
if
not
is_predict
else
'process_predict'
define_py_data_sources2
(
train_list
=
trn
,
define_py_data_sources2
(
train_list
=
trn
,
test_list
=
tst
,
module
=
"dataprovider_emb"
,
obj
=
process
,
...
...
@@ -39,19 +40,17 @@ settings(
learning_rate
=
2e-3
,
learning_method
=
AdamOptimizer
(),
regularization
=
L2Regularization
(
8e-4
),
gradient_clipping_threshold
=
25
)
gradient_clipping_threshold
=
25
)
bias_attr
=
ParamAttr
(
initial_std
=
0.
,
l2_rate
=
0.
)
bias_attr
=
ParamAttr
(
initial_std
=
0.
,
l2_rate
=
0.
)
data
=
data_layer
(
name
=
"word"
,
size
=
len
(
word_dict
))
emb
=
embedding_layer
(
input
=
data
,
size
=
128
)
bi_lstm
=
bidirectional_lstm
(
input
=
emb
,
size
=
128
)
dropout
=
dropout_layer
(
input
=
bi_lstm
,
dropout_rate
=
0.5
)
output
=
fc_layer
(
input
=
dropout
,
size
=
2
,
bias_attr
=
bias_attr
,
act
=
SoftmaxActivation
())
output
=
fc_layer
(
input
=
dropout
,
size
=
2
,
bias_attr
=
bias_attr
,
act
=
SoftmaxActivation
())
if
is_predict
:
maxid
=
maxid_layer
(
output
)
...
...
demo/quick_start/trainer_config.cnn.py
浏览文件 @
319742c6
...
...
@@ -27,7 +27,8 @@ is_predict = get_config_arg('is_predict', bool, False)
trn
=
'data/train.list'
if
not
is_predict
else
None
tst
=
'data/test.list'
if
not
is_predict
else
'data/pred.list'
process
=
'process'
if
not
is_predict
else
'process_predict'
define_py_data_sources2
(
train_list
=
trn
,
define_py_data_sources2
(
train_list
=
trn
,
test_list
=
tst
,
module
=
"dataprovider_emb"
,
obj
=
process
,
...
...
@@ -39,8 +40,7 @@ settings(
learning_rate
=
2e-3
,
learning_method
=
AdamOptimizer
(),
regularization
=
L2Regularization
(
8e-4
),
gradient_clipping_threshold
=
25
)
gradient_clipping_threshold
=
25
)
data
=
data_layer
(
name
=
"word"
,
size
=
len
(
word_dict
))
embedding
=
embedding_layer
(
input
=
data
,
size
=
128
)
...
...
demo/quick_start/trainer_config.db-lstm.py
浏览文件 @
319742c6
...
...
@@ -27,7 +27,8 @@ is_predict = get_config_arg('is_predict', bool, False)
trn
=
'data/train.list'
if
not
is_predict
else
None
tst
=
'data/test.list'
if
not
is_predict
else
'data/pred.list'
process
=
'process'
if
not
is_predict
else
'process_predict'
define_py_data_sources2
(
train_list
=
trn
,
define_py_data_sources2
(
train_list
=
trn
,
test_list
=
tst
,
module
=
"dataprovider_emb"
,
obj
=
process
,
...
...
@@ -39,10 +40,9 @@ settings(
learning_rate
=
2e-3
,
learning_method
=
AdamOptimizer
(),
regularization
=
L2Regularization
(
8e-4
),
gradient_clipping_threshold
=
25
)
gradient_clipping_threshold
=
25
)
bias_attr
=
ParamAttr
(
initial_std
=
0.
,
l2_rate
=
0.
)
bias_attr
=
ParamAttr
(
initial_std
=
0.
,
l2_rate
=
0.
)
data
=
data_layer
(
name
=
"word"
,
size
=
len
(
word_dict
))
emb
=
embedding_layer
(
input
=
data
,
size
=
128
)
...
...
@@ -52,17 +52,18 @@ lstm_0 = lstmemory(input=hidden_0, layer_attr=ExtraAttr(drop_rate=0.1))
input_layers
=
[
hidden_0
,
lstm_0
]
for
i
in
range
(
1
,
8
):
for
i
in
range
(
1
,
8
):
fc
=
fc_layer
(
input
=
input_layers
,
size
=
128
)
lstm
=
lstmemory
(
input
=
fc
,
layer_attr
=
ExtraAttr
(
drop_rate
=
0.1
),
reverse
=
(
i
%
2
)
==
1
,)
lstm
=
lstmemory
(
input
=
fc
,
layer_attr
=
ExtraAttr
(
drop_rate
=
0.1
),
reverse
=
(
i
%
2
)
==
1
,
)
input_layers
=
[
fc
,
lstm
]
lstm_last
=
pooling_layer
(
input
=
lstm
,
pooling_type
=
MaxPooling
())
output
=
fc_layer
(
input
=
lstm_last
,
size
=
2
,
bias_attr
=
bias_attr
,
act
=
SoftmaxActivation
())
output
=
fc_layer
(
input
=
lstm_last
,
size
=
2
,
bias_attr
=
bias_attr
,
act
=
SoftmaxActivation
())
if
is_predict
:
maxid
=
maxid_layer
(
output
)
...
...
demo/quick_start/trainer_config.emb.py
浏览文件 @
319742c6
...
...
@@ -27,7 +27,8 @@ is_predict = get_config_arg('is_predict', bool, False)
trn
=
'data/train.list'
if
not
is_predict
else
None
tst
=
'data/test.list'
if
not
is_predict
else
'data/pred.list'
process
=
'process'
if
not
is_predict
else
'process_predict'
define_py_data_sources2
(
train_list
=
trn
,
define_py_data_sources2
(
train_list
=
trn
,
test_list
=
tst
,
module
=
"dataprovider_emb"
,
obj
=
process
,
...
...
@@ -35,10 +36,7 @@ define_py_data_sources2(train_list=trn,
batch_size
=
128
if
not
is_predict
else
1
settings
(
batch_size
=
batch_size
,
learning_rate
=
2e-3
,
learning_method
=
AdamOptimizer
()
)
batch_size
=
batch_size
,
learning_rate
=
2e-3
,
learning_method
=
AdamOptimizer
())
data
=
data_layer
(
name
=
"word"
,
size
=
len
(
word_dict
))
embedding
=
embedding_layer
(
input
=
data
,
size
=
128
)
...
...
demo/quick_start/trainer_config.lr.py
浏览文件 @
319742c6
...
...
@@ -32,7 +32,8 @@ process = 'process' if not is_predict else 'process_predict'
# We need to use different process for training and prediction.
# For training, the input data includes both word IDs and labels.
# For prediction, the input data only includs word Ids.
define_py_data_sources2
(
train_list
=
trn
,
define_py_data_sources2
(
train_list
=
trn
,
test_list
=
tst
,
module
=
"dataprovider_bow"
,
obj
=
process
,
...
...
@@ -44,8 +45,7 @@ settings(
learning_rate
=
2e-3
,
learning_method
=
AdamOptimizer
(),
regularization
=
L2Regularization
(
8e-4
),
gradient_clipping_threshold
=
25
)
gradient_clipping_threshold
=
25
)
# Define the data for text features. The size of the data layer is the number
# of words in the dictionary.
...
...
demo/quick_start/trainer_config.lstm.py
浏览文件 @
319742c6
...
...
@@ -27,7 +27,8 @@ is_predict = get_config_arg('is_predict', bool, False)
trn
=
'data/train.list'
if
not
is_predict
else
None
tst
=
'data/test.list'
if
not
is_predict
else
'data/pred.list'
process
=
'process'
if
not
is_predict
else
'process_predict'
define_py_data_sources2
(
train_list
=
trn
,
define_py_data_sources2
(
train_list
=
trn
,
test_list
=
tst
,
module
=
"dataprovider_emb"
,
obj
=
process
,
...
...
@@ -39,17 +40,14 @@ settings(
learning_rate
=
2e-3
,
learning_method
=
AdamOptimizer
(),
regularization
=
L2Regularization
(
8e-4
),
gradient_clipping_threshold
=
25
)
gradient_clipping_threshold
=
25
)
data
=
data_layer
(
name
=
"word"
,
size
=
len
(
word_dict
))
emb
=
embedding_layer
(
input
=
data
,
size
=
128
)
lstm
=
simple_lstm
(
input
=
emb
,
size
=
128
,
lstm_cell_attr
=
ExtraAttr
(
drop_rate
=
0.25
))
lstm
=
simple_lstm
(
input
=
emb
,
size
=
128
,
lstm_cell_attr
=
ExtraAttr
(
drop_rate
=
0.25
))
lstm_max
=
pooling_layer
(
input
=
lstm
,
pooling_type
=
MaxPooling
())
output
=
fc_layer
(
input
=
lstm_max
,
size
=
2
,
act
=
SoftmaxActivation
())
output
=
fc_layer
(
input
=
lstm_max
,
size
=
2
,
act
=
SoftmaxActivation
())
if
is_predict
:
maxid
=
maxid_layer
(
output
)
outputs
([
maxid
,
output
])
...
...
demo/recommendation/common_utils.py
浏览文件 @
319742c6
...
...
@@ -21,8 +21,9 @@ def meta_to_header(meta, name):
yield
integer_value
(
each_meta
[
'max'
])
elif
each_meta
[
'type'
]
==
'embedding'
:
is_seq
=
each_meta
[
'seq'
]
==
'sequence'
yield
integer_value
(
len
(
each_meta
[
'dict'
]),
seq_type
=
SequenceType
.
SEQUENCE
if
is_seq
else
SequenceType
.
NO_SEQUENCE
)
yield
integer_value
(
len
(
each_meta
[
'dict'
]),
seq_type
=
SequenceType
.
SEQUENCE
if
is_seq
else
SequenceType
.
NO_SEQUENCE
)
elif
each_meta
[
'type'
]
==
'one_hot_dense'
:
yield
dense_vector
(
len
(
each_meta
[
'dict'
]))
demo/recommendation/data/config_generator.py
浏览文件 @
319742c6
...
...
@@ -12,7 +12,6 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
config_generator.py
...
...
@@ -29,10 +28,7 @@ import json
import
docopt
import
copy
DEFAULT_FILE
=
{
"type"
:
"split"
,
"delimiter"
:
","
}
DEFAULT_FILE
=
{
"type"
:
"split"
,
"delimiter"
:
","
}
DEFAULT_FIELD
=
{
"id"
:
{
...
...
@@ -107,19 +103,16 @@ def main(filename, fmt):
field
=
copy
.
deepcopy
(
DEFAULT_FIELD
[
field_key
])
field
[
'pos'
]
=
pos
fields
.
append
(
field
)
obj
[
k
]
=
{
"file"
:
file_dict
,
"fields"
:
fields
}
meta
=
{
"meta"
:
obj
}
obj
[
k
]
=
{
"file"
:
file_dict
,
"fields"
:
fields
}
meta
=
{
"meta"
:
obj
}
# print meta
if
fmt
==
'json'
:
def
formatter
(
x
):
import
json
return
json
.
dumps
(
x
,
indent
=
2
)
elif
fmt
==
'yaml'
:
def
formatter
(
x
):
import
yaml
return
yaml
.
safe_dump
(
x
,
default_flow_style
=
False
)
...
...
demo/recommendation/data/meta_generator.py
浏览文件 @
319742c6
...
...
@@ -12,7 +12,6 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Preprocess Movielens dataset, to get movie/user object.
...
...
@@ -66,8 +65,8 @@ class SortedIDGenerator(object):
self
.
__key_set__
.
add
(
key
)
def
finish_scan
(
self
,
compare
=
None
,
key
=
None
,
reverse
=
False
):
self
.
__key_set__
=
sorted
(
list
(
self
.
__key_set__
),
cmp
=
compare
,
key
=
key
,
reverse
=
reverse
)
self
.
__key_set__
=
sorted
(
list
(
self
.
__key_set__
),
cmp
=
compare
,
key
=
key
,
reverse
=
reverse
)
self
.
dict
=
dict
()
for
idx
,
each_key
in
enumerate
(
self
.
__key_set__
):
self
.
dict
[
each_key
]
=
idx
...
...
@@ -207,11 +206,10 @@ class EmbeddingFieldParser(object):
self
.
dict
=
EmbeddingFieldParser
.
CharBasedEmbeddingDict
(
self
.
seq_type
==
EmbeddingFieldParser
.
SEQUENCE
)
elif
config
[
'dict'
][
'type'
]
==
'split'
:
self
.
dict
=
SplitEmbeddingDict
(
config
[
'dict'
].
get
(
'delimiter'
,
','
))
self
.
dict
=
SplitEmbeddingDict
(
config
[
'dict'
].
get
(
'delimiter'
,
','
))
elif
config
[
'dict'
][
'type'
]
==
'whole_content'
:
self
.
dict
=
EmbeddingFieldParser
.
WholeContentDict
(
config
[
'dict'
][
'sort'
])
self
.
dict
=
EmbeddingFieldParser
.
WholeContentDict
(
config
[
'dict'
][
'sort'
])
else
:
print
config
assert
False
...
...
@@ -333,8 +331,8 @@ class ContentExtractorFactory(object):
return
PositionContentExtractor
(
config
[
'pos'
])
else
:
extra_args
=
config
[
'regex'
]
return
RegexPositionContentExtractor
(
pos
=
config
[
'pos'
],
**
extra_args
)
return
RegexPositionContentExtractor
(
pos
=
config
[
'pos'
],
**
extra_args
)
class
MetaFile
(
object
):
...
...
@@ -364,9 +362,10 @@ class MetaFile(object):
metas
=
map
(
lambda
x
:
x
.
meta_field
(),
field_parsers
)
# print metas
key_index
=
filter
(
lambda
x
:
x
is
not
None
,
map
(
lambda
(
idx
,
meta
):
idx
if
'is_key'
in
meta
and
meta
[
'is_key'
]
else
None
,
enumerate
(
metas
)))[
0
]
key_index
=
filter
(
lambda
x
:
x
is
not
None
,
map
(
lambda
(
idx
,
meta
):
idx
if
'is_key'
in
meta
and
meta
[
'is_key'
]
else
None
,
enumerate
(
metas
)))[
0
]
key_map
=
[]
for
i
in
range
(
min
(
key_index
,
len
(
metas
))):
...
...
@@ -374,12 +373,7 @@ class MetaFile(object):
for
i
in
range
(
key_index
+
1
,
len
(
metas
)):
key_map
.
append
(
i
)
obj
=
{
'__meta__'
:
{
'raw_meta'
:
metas
,
'feature_map'
:
key_map
}
}
obj
=
{
'__meta__'
:
{
'raw_meta'
:
metas
,
'feature_map'
:
key_map
}}
for
each_block
in
reader
.
read
():
idx
=
field_parsers
[
key_index
].
parse
(
each_block
)
...
...
demo/recommendation/data/split.py
浏览文件 @
319742c6
...
...
@@ -12,7 +12,6 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Separate movielens 1m dataset to train/test file.
...
...
demo/recommendation/dataprovider.py
浏览文件 @
319742c6
...
...
@@ -15,6 +15,7 @@
from
paddle.trainer.PyDataProvider2
import
*
import
common_utils
# parse
def
hook
(
settings
,
meta
,
**
kwargs
):
"""
Init hook is invoked before process data. It will set obj.slots and store
...
...
@@ -41,6 +42,7 @@ def hook(settings, meta, **kwargs):
settings
.
input_types
=
headers
settings
.
meta
=
meta
@
provider
(
init_hook
=
hook
,
cache
=
CacheType
.
CACHE_PASS_IN_MEM
)
def
process
(
settings
,
filename
):
with
open
(
filename
,
'r'
)
as
f
:
...
...
demo/recommendation/prediction.py
浏览文件 @
319742c6
...
...
@@ -28,7 +28,8 @@ if __name__ == '__main__':
model_path
=
sys
.
argv
[
1
]
swig_paddle
.
initPaddle
(
'--use_gpu=0'
)
conf
=
parse_config
(
"trainer_config.py"
,
"is_predict=1"
)
network
=
swig_paddle
.
GradientMachine
.
createFromConfigProto
(
conf
.
model_config
)
network
=
swig_paddle
.
GradientMachine
.
createFromConfigProto
(
conf
.
model_config
)
assert
isinstance
(
network
,
swig_paddle
.
GradientMachine
)
network
.
loadParameters
(
model_path
)
with
open
(
'./data/meta.bin'
,
'rb'
)
as
f
:
...
...
@@ -45,5 +46,6 @@ if __name__ == '__main__':
data
.
extend
(
movie_meta
)
data
.
append
(
user_id
-
1
)
data
.
extend
(
user_meta
)
print
"Prediction Score is %.2f"
%
((
network
.
forwardTest
(
cvt
.
convert
([
data
]))[
0
][
'value'
][
0
][
0
]
+
5
)
/
2
)
print
"Prediction Score is %.2f"
%
(
(
network
.
forwardTest
(
cvt
.
convert
([
data
]))[
0
][
'value'
][
0
][
0
]
+
5
)
/
2
)
demo/recommendation/trainer_config.py
浏览文件 @
319742c6
...
...
@@ -27,8 +27,8 @@ with open(META_FILE, 'rb') as f:
# load meta file
meta
=
pickle
.
load
(
f
)
settings
(
batch_size
=
1600
,
learning_rate
=
1e-3
,
learning_method
=
RMSPropOptimizer
())
settings
(
batch_size
=
1600
,
learning_rate
=
1e-3
,
learning_method
=
RMSPropOptimizer
())
def
construct_feature
(
name
):
...
...
@@ -59,11 +59,10 @@ def construct_feature(name):
slot_name
=
each_meta
.
get
(
'name'
,
'%s_id'
%
name
)
if
type_name
==
'id'
:
slot_dim
=
each_meta
[
'max'
]
embedding
=
embedding_layer
(
input
=
data_layer
(
slot_name
,
size
=
slot_dim
),
size
=
256
)
fusion
.
append
(
fc_layer
(
input
=
embedding
,
size
=
256
))
embedding
=
embedding_layer
(
input
=
data_layer
(
slot_name
,
size
=
slot_dim
),
size
=
256
)
fusion
.
append
(
fc_layer
(
input
=
embedding
,
size
=
256
))
elif
type_name
==
'embedding'
:
is_seq
=
each_meta
[
'seq'
]
==
'sequence'
slot_dim
=
len
(
each_meta
[
'dict'
])
...
...
@@ -71,17 +70,14 @@ def construct_feature(name):
embedding
=
embedding_layer
(
input
=
din
,
size
=
256
)
if
is_seq
:
fusion
.
append
(
text_conv_pool
(
input
=
embedding
,
context_len
=
5
,
hidden_size
=
256
))
text_conv_pool
(
input
=
embedding
,
context_len
=
5
,
hidden_size
=
256
))
else
:
fusion
.
append
(
fc_layer
(
input
=
embedding
,
size
=
256
))
fusion
.
append
(
fc_layer
(
input
=
embedding
,
size
=
256
))
elif
type_name
==
'one_hot_dense'
:
slot_dim
=
len
(
each_meta
[
'dict'
])
hidden
=
fc_layer
(
input
=
data_layer
(
slot_name
,
slot_dim
),
size
=
256
)
fusion
.
append
(
fc_layer
(
input
=
hidden
,
size
=
256
))
hidden
=
fc_layer
(
input
=
data_layer
(
slot_name
,
slot_dim
),
size
=
256
)
fusion
.
append
(
fc_layer
(
input
=
hidden
,
size
=
256
))
return
fc_layer
(
name
=
"%s_fusion"
%
name
,
input
=
fusion
,
size
=
256
)
...
...
@@ -90,10 +86,16 @@ movie_feature = construct_feature("movie")
user_feature
=
construct_feature
(
"user"
)
similarity
=
cos_sim
(
a
=
movie_feature
,
b
=
user_feature
)
if
not
is_predict
:
outputs
(
regression_cost
(
input
=
similarity
,
label
=
data_layer
(
'rating'
,
size
=
1
)))
define_py_data_sources2
(
'data/train.list'
,
'data/test.list'
,
module
=
'dataprovider'
,
obj
=
'process'
,
args
=
{
'meta'
:
meta
})
outputs
(
regression_cost
(
input
=
similarity
,
label
=
data_layer
(
'rating'
,
size
=
1
)))
define_py_data_sources2
(
'data/train.list'
,
'data/test.list'
,
module
=
'dataprovider'
,
obj
=
'process'
,
args
=
{
'meta'
:
meta
})
else
:
outputs
(
similarity
)
demo/semantic_role_labeling/dataprovider.py
浏览文件 @
319742c6
...
...
@@ -26,9 +26,9 @@ def hook(settings, word_dict, label_dict, **kwargs):
integer_value_sequence
(
len
(
word_dict
)),
integer_value_sequence
(
len
(
word_dict
)),
integer_value_sequence
(
len
(
word_dict
)),
integer_value_sequence
(
len
(
word_dict
)),
integer_value_sequence
(
2
),
integer_value_sequence
(
len
(
label_dict
))
]
integer_value_sequence
(
len
(
word_dict
)),
integer_value_sequence
(
2
),
integer_value_sequence
(
len
(
label_dict
))
]
@
provider
(
init_hook
=
hook
)
...
...
demo/semantic_role_labeling/db_lstm.py
浏览文件 @
319742c6
...
...
@@ -12,7 +12,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import
math
import
os
import
sys
...
...
demo/semantic_role_labeling/predict.py
浏览文件 @
319742c6
...
...
@@ -41,22 +41,16 @@ class Prediction():
len_dict
=
len
(
self
.
dict
)
len_label
=
len
(
self
.
labels
)
conf
=
parse_config
(
train_conf
,
'dict_len='
+
str
(
len_dict
)
+
',label_len='
+
str
(
len_label
)
+
',is_predict=True'
)
conf
=
parse_config
(
train_conf
,
'dict_len='
+
str
(
len_dict
)
+
',label_len='
+
str
(
len_label
)
+
',is_predict=True'
)
self
.
network
=
swig_paddle
.
GradientMachine
.
createFromConfigProto
(
conf
.
model_config
)
self
.
network
.
loadParameters
(
model_dir
)
slots
=
[
integer_value_sequence
(
len_dict
),
integer_value_sequence
(
len_dict
),
integer_value_sequence
(
len_dict
),
integer_value_sequence
(
len_dict
),
integer_value_sequence
(
len_dict
),
integer_value_sequence
(
2
)
integer_value_sequence
(
len_dict
),
integer_value_sequence
(
len_dict
),
integer_value_sequence
(
len_dict
),
integer_value_sequence
(
len_dict
),
integer_value_sequence
(
len_dict
),
integer_value_sequence
(
2
)
]
self
.
converter
=
DataProviderConverter
(
slots
)
...
...
@@ -110,8 +104,8 @@ class Prediction():
len_sen
=
len
(
sen
.
split
())
line_labels
=
lab
[
index
:
index
+
len_sen
]
index
+=
len_sen
fout
.
write
(
sen
+
'
\t
'
+
' '
.
join
(
[
self
.
labels_reverse
[
i
]
for
i
in
line_labels
])
+
'
\n
'
)
fout
.
write
(
sen
+
'
\t
'
+
' '
.
join
(
[
self
.
labels_reverse
[
i
]
for
i
in
line_labels
])
+
'
\n
'
)
def
option_parser
():
...
...
demo/sentiment/dataprovider.py
浏览文件 @
319742c6
...
...
@@ -17,8 +17,8 @@ from paddle.trainer.PyDataProvider2 import *
def
hook
(
settings
,
dictionary
,
**
kwargs
):
settings
.
word_dict
=
dictionary
settings
.
input_types
=
[
integer_value_sequence
(
len
(
settings
.
word_dict
)),
integer_value
(
2
)
]
integer_value_sequence
(
len
(
settings
.
word_dict
)),
integer_value
(
2
)
]
settings
.
logger
.
info
(
'dict len : %d'
%
(
len
(
settings
.
word_dict
)))
...
...
@@ -29,6 +29,7 @@ def process(settings, file_name):
label
,
comment
=
line
.
strip
().
split
(
'
\t\t
'
)
label
=
int
(
label
)
words
=
comment
.
split
()
word_slot
=
[
settings
.
word_dict
[
w
]
for
w
in
words
if
w
in
settings
.
word_dict
]
word_slot
=
[
settings
.
word_dict
[
w
]
for
w
in
words
if
w
in
settings
.
word_dict
]
yield
word_slot
,
label
demo/sentiment/predict.py
浏览文件 @
319742c6
...
...
@@ -18,14 +18,14 @@ from optparse import OptionParser
from
py_paddle
import
swig_paddle
,
DataProviderConverter
from
paddle.trainer.PyDataProvider2
import
integer_value_sequence
from
paddle.trainer.config_parser
import
parse_config
"""
Usage: run following command to show help message.
python predict.py -h
"""
class
SentimentPrediction
():
def
__init__
(
self
,
train_conf
,
dict_file
,
model_dir
=
None
,
label_file
=
None
):
def
__init__
(
self
,
train_conf
,
dict_file
,
model_dir
=
None
,
label_file
=
None
):
"""
train_conf: trainer configure.
dict_file: word dictionary file name.
...
...
@@ -44,7 +44,8 @@ class SentimentPrediction():
self
.
load_label
(
label_file
)
conf
=
parse_config
(
train_conf
,
"is_predict=1"
)
self
.
network
=
swig_paddle
.
GradientMachine
.
createFromConfigProto
(
conf
.
model_config
)
self
.
network
=
swig_paddle
.
GradientMachine
.
createFromConfigProto
(
conf
.
model_config
)
self
.
network
.
loadParameters
(
self
.
model_dir
)
input_types
=
[
integer_value_sequence
(
self
.
dict_dim
)]
self
.
converter
=
DataProviderConverter
(
input_types
)
...
...
@@ -61,7 +62,7 @@ class SentimentPrediction():
"""
Load label.
"""
self
.
label
=
{}
self
.
label
=
{}
for
v
in
open
(
label_file
,
'r'
):
self
.
label
[
int
(
v
.
split
(
'
\t
'
)[
1
])]
=
v
.
split
(
'
\t
'
)[
0
]
...
...
@@ -72,7 +73,9 @@ class SentimentPrediction():
with
open
(
data_file
,
'r'
)
as
fdata
:
for
line
in
fdata
:
words
=
line
.
strip
().
split
()
word_slot
=
[
self
.
word_dict
[
w
]
for
w
in
words
if
w
in
self
.
word_dict
]
word_slot
=
[
self
.
word_dict
[
w
]
for
w
in
words
if
w
in
self
.
word_dict
]
if
not
word_slot
:
print
"all words are not in dictionary: %s"
,
line
continue
...
...
@@ -89,25 +92,48 @@ class SentimentPrediction():
if
self
.
label
is
None
:
print
(
"%s: predicting label is %d"
%
(
data_file
,
lab
[
0
][
0
]))
else
:
print
(
"%s: predicting label is %s"
%
(
data_file
,
self
.
label
[
lab
[
0
][
0
]]))
print
(
"%s: predicting label is %s"
%
(
data_file
,
self
.
label
[
lab
[
0
][
0
]]))
def
option_parser
():
usage
=
"python predict.py -n config -w model_dir -d dictionary -i input_file "
parser
=
OptionParser
(
usage
=
"usage: %s [options]"
%
usage
)
parser
.
add_option
(
"-n"
,
"--tconf"
,
action
=
"store"
,
dest
=
"train_conf"
,
help
=
"network config"
)
parser
.
add_option
(
"-d"
,
"--dict"
,
action
=
"store"
,
dest
=
"dict_file"
,
help
=
"dictionary file"
)
parser
.
add_option
(
"-b"
,
"--label"
,
action
=
"store"
,
dest
=
"label"
,
default
=
None
,
parser
.
add_option
(
"-n"
,
"--tconf"
,
action
=
"store"
,
dest
=
"train_conf"
,
help
=
"network config"
)
parser
.
add_option
(
"-d"
,
"--dict"
,
action
=
"store"
,
dest
=
"dict_file"
,
help
=
"dictionary file"
)
parser
.
add_option
(
"-i"
,
"--data"
,
action
=
"store"
,
dest
=
"data"
,
help
=
"data file to predict"
)
parser
.
add_option
(
"-w"
,
"--model"
,
action
=
"store"
,
dest
=
"model_path"
,
default
=
None
,
parser
.
add_option
(
"-b"
,
"--label"
,
action
=
"store"
,
dest
=
"label"
,
default
=
None
,
help
=
"dictionary file"
)
parser
.
add_option
(
"-i"
,
"--data"
,
action
=
"store"
,
dest
=
"data"
,
help
=
"data file to predict"
)
parser
.
add_option
(
"-w"
,
"--model"
,
action
=
"store"
,
dest
=
"model_path"
,
default
=
None
,
help
=
"model path"
)
return
parser
.
parse_args
()
def
main
():
options
,
args
=
option_parser
()
train_conf
=
options
.
train_conf
...
...
@@ -119,5 +145,6 @@ def main():
predict
=
SentimentPrediction
(
train_conf
,
dict_file
,
model_path
,
label
)
predict
.
predict
(
data
)
if
__name__
==
'__main__'
:
main
()
demo/sentiment/preprocess.py
浏览文件 @
319742c6
...
...
@@ -22,13 +22,13 @@ from os.path import join as join_path
from
optparse
import
OptionParser
from
paddle.utils.preprocess_util
import
*
"""
Usage: run following command to show help message.
python preprocess.py -h
"""
def
save_dict
(
dict
,
filename
,
is_reverse
=
True
):
def
save_dict
(
dict
,
filename
,
is_reverse
=
True
):
"""
Save dictionary into file.
dict: input dictionary.
...
...
@@ -39,9 +39,10 @@ def save_dict(dict, filename, is_reverse = True):
f
=
open
(
filename
,
'w'
)
for
k
,
v
in
sorted
(
dict
.
items
(),
key
=
operator
.
itemgetter
(
1
),
\
reverse
=
is_reverse
):
f
.
write
(
'%s
\t
%s
\n
'
%
(
k
,
v
))
f
.
write
(
'%s
\t
%s
\n
'
%
(
k
,
v
))
f
.
close
()
def
tokenize
(
sentences
):
"""
Use tokenizer.perl to tokenize input sentences.
...
...
@@ -58,6 +59,7 @@ def tokenize(sentences):
toks
=
tok_text
.
split
(
'
\n
'
)[:
-
1
]
return
toks
def
read_lines
(
path
):
"""
path: String, file path.
...
...
@@ -71,12 +73,17 @@ def read_lines(path):
seqs
.
append
(
line
)
return
seqs
class
SentimentDataSetCreate
():
"""
A class to process data for sentiment analysis task.
"""
def
__init__
(
self
,
data_path
,
output_path
,
use_okenizer
=
True
,
multi_lines
=
False
):
def
__init__
(
self
,
data_path
,
output_path
,
use_okenizer
=
True
,
multi_lines
=
False
):
"""
data_path: string, traing and testing dataset path
output_path: string, output path, store processed dataset
...
...
@@ -164,23 +171,17 @@ class SentimentDataSetCreate():
# Preprocess train data.
train_data
,
train_lab_set
=
self
.
data_list
(
self
.
train_dir
)
print
"processing train set..."
file_lists
=
self
.
save_data
(
train_data
,
"train"
,
self
.
batch_size
,
True
,
file_lists
=
self
.
save_data
(
train_data
,
"train"
,
self
.
batch_size
,
True
,
True
)
save_list
(
file_lists
,
self
.
train_list
)
# If have test data path, preprocess test data.
if
os
.
path
.
exists
(
self
.
test_dir
):
test_data
,
test_lab_set
=
self
.
data_list
(
self
.
test_dir
)
assert
(
train_lab_set
==
test_lab_set
)
assert
(
train_lab_set
==
test_lab_set
)
print
"processing test set..."
file_lists
=
self
.
save_data
(
test_data
,
"test"
,
self
.
batch_size
,
False
,
self
.
dict_with_test
)
file_lists
=
self
.
save_data
(
test_data
,
"test"
,
self
.
batch_size
,
False
,
self
.
dict_with_test
)
save_list
(
file_lists
,
self
.
test_list
)
# save labels set.
...
...
@@ -191,7 +192,9 @@ class SentimentDataSetCreate():
save_dict
(
self
.
word_count
,
self
.
dict_file
,
True
)
self
.
dict_size
=
len
(
self
.
word_count
)
def
save_data
(
self
,
data
,
prefix
=
""
,
def
save_data
(
self
,
data
,
prefix
=
""
,
batch_size
=
50000
,
is_shuffle
=
False
,
build_dict
=
False
):
...
...
@@ -205,7 +208,8 @@ class SentimentDataSetCreate():
return: list of batch names
"""
if
is_shuffle
and
self
.
multi_lines
:
return
self
.
save_data_multi_lines
(
data
,
prefix
,
batch_size
,
build_dict
)
return
self
.
save_data_multi_lines
(
data
,
prefix
,
batch_size
,
build_dict
)
if
is_shuffle
:
random
.
shuffle
(
data
)
...
...
@@ -213,7 +217,7 @@ class SentimentDataSetCreate():
batch_names
=
[]
for
i
in
range
(
num_batches
):
batch_name
=
join_path
(
self
.
output_path
,
"%s_part_%03d"
%
(
prefix
,
i
))
"%s_part_%03d"
%
(
prefix
,
i
))
begin
=
i
*
batch_size
end
=
min
((
i
+
1
)
*
batch_size
,
len
(
data
))
# read a batch of data
...
...
@@ -246,7 +250,9 @@ class SentimentDataSetCreate():
data_list
=
tokenize
(
data_list
)
return
label_list
,
data_list
def
save_data_multi_lines
(
self
,
data
,
prefix
=
""
,
def
save_data_multi_lines
(
self
,
data
,
prefix
=
""
,
batch_size
=
50000
,
build_dict
=
False
):
"""
...
...
@@ -274,14 +280,14 @@ class SentimentDataSetCreate():
self
.
create_dict
(
data_list
)
length
=
len
(
label_list
)
perm_list
=
np
.
array
([
i
for
i
in
xrange
(
length
)
])
perm_list
=
np
.
array
([
i
for
i
in
xrange
(
length
)
])
random
.
shuffle
(
perm_list
)
num_batches
=
int
(
math
.
ceil
(
length
/
float
(
batch_size
)))
batch_names
=
[]
for
i
in
range
(
num_batches
):
batch_name
=
join_path
(
self
.
output_path
,
"%s_part_%03d"
%
(
prefix
,
i
))
"%s_part_%03d"
%
(
prefix
,
i
))
begin
=
i
*
batch_size
end
=
min
((
i
+
1
)
*
batch_size
,
length
)
sub_label
=
[
label_list
[
perm_list
[
i
]]
for
i
in
range
(
begin
,
end
)]
...
...
@@ -304,16 +310,29 @@ class SentimentDataSetCreate():
f
.
write
(
'%s
\t\t
%s
\n
'
%
(
lab
,
seq
))
f
.
close
()
def
option_parser
():
parser
=
OptionParser
(
usage
=
"usage: python preprcoess.py "
\
"-i data_dir [options]"
)
parser
.
add_option
(
"-i"
,
"--data"
,
action
=
"store"
,
dest
=
"input"
,
help
=
"Input data directory."
)
parser
.
add_option
(
"-o"
,
"--output"
,
action
=
"store"
,
dest
=
"output"
,
default
=
None
,
parser
.
add_option
(
"-i"
,
"--data"
,
action
=
"store"
,
dest
=
"input"
,
help
=
"Input data directory."
)
parser
.
add_option
(
"-o"
,
"--output"
,
action
=
"store"
,
dest
=
"output"
,
default
=
None
,
help
=
"Output directory."
)
parser
.
add_option
(
"-t"
,
"--tokenizer"
,
action
=
"store"
,
dest
=
"use_tokenizer"
,
default
=
True
,
parser
.
add_option
(
"-t"
,
"--tokenizer"
,
action
=
"store"
,
dest
=
"use_tokenizer"
,
default
=
True
,
help
=
"Whether to use tokenizer."
)
parser
.
add_option
(
"-m"
,
"--multi_lines"
,
action
=
"store"
,
dest
=
"multi_lines"
,
default
=
False
,
...
...
@@ -321,18 +340,20 @@ def option_parser():
"need to be shuffled, you should set -m True,"
)
return
parser
.
parse_args
()
def
main
():
options
,
args
=
option_parser
()
data_dir
=
options
.
input
output_dir
=
options
.
output
use_tokenizer
=
options
.
use_tokenizer
multi_lines
=
options
.
multi_lines
data_dir
=
options
.
input
output_dir
=
options
.
output
use_tokenizer
=
options
.
use_tokenizer
multi_lines
=
options
.
multi_lines
if
output_dir
is
None
:
outname
=
os
.
path
.
basename
(
options
.
input
)
output_dir
=
join_path
(
os
.
path
.
dirname
(
data_dir
),
'pre-'
+
outname
)
data_creator
=
SentimentDataSetCreate
(
data_dir
,
output_dir
,
use_tokenizer
,
multi_lines
)
data_creator
=
SentimentDataSetCreate
(
data_dir
,
output_dir
,
use_tokenizer
,
multi_lines
)
data_creator
.
create_dataset
()
if
__name__
==
'__main__'
:
main
()
demo/sentiment/sentiment_net.py
浏览文件 @
319742c6
...
...
@@ -47,7 +47,9 @@ def sentiment_data(data_dir=None,
for
i
,
line
in
enumerate
(
open
(
dict_file
,
'r'
)):
word_dict
[
line
.
split
(
'
\t
'
)[
0
]]
=
i
define_py_data_sources2
(
train_list
,
test_list
,
define_py_data_sources2
(
train_list
,
test_list
,
module
=
"dataprovider"
,
obj
=
"process"
,
args
=
{
'dictionary'
:
word_dict
})
...
...
@@ -64,8 +66,7 @@ def bidirectional_lstm_net(input_dim,
emb
=
embedding_layer
(
input
=
data
,
size
=
emb_dim
)
bi_lstm
=
bidirectional_lstm
(
input
=
emb
,
size
=
lstm_dim
)
dropout
=
dropout_layer
(
input
=
bi_lstm
,
dropout_rate
=
0.5
)
output
=
fc_layer
(
input
=
dropout
,
size
=
class_dim
,
act
=
SoftmaxActivation
())
output
=
fc_layer
(
input
=
dropout
,
size
=
class_dim
,
act
=
SoftmaxActivation
())
if
not
is_predict
:
lbl
=
data_layer
(
"label"
,
1
)
...
...
@@ -109,27 +110,36 @@ def stacked_lstm_net(input_dim,
data
=
data_layer
(
"word"
,
input_dim
)
emb
=
embedding_layer
(
input
=
data
,
size
=
emb_dim
)
fc1
=
fc_layer
(
input
=
emb
,
size
=
hid_dim
,
act
=
linear
,
bias_attr
=
bias_attr
)
lstm1
=
lstmemory
(
input
=
fc1
,
act
=
relu
,
bias_attr
=
bias_attr
,
layer_attr
=
layer_attr
)
fc1
=
fc_layer
(
input
=
emb
,
size
=
hid_dim
,
act
=
linear
,
bias_attr
=
bias_attr
)
lstm1
=
lstmemory
(
input
=
fc1
,
act
=
relu
,
bias_attr
=
bias_attr
,
layer_attr
=
layer_attr
)
inputs
=
[
fc1
,
lstm1
]
for
i
in
range
(
2
,
stacked_num
+
1
):
fc
=
fc_layer
(
input
=
inputs
,
size
=
hid_dim
,
act
=
linear
,
param_attr
=
para_attr
,
bias_attr
=
bias_attr
)
lstm
=
lstmemory
(
input
=
fc
,
reverse
=
(
i
%
2
)
==
0
,
act
=
relu
,
bias_attr
=
bias_attr
,
layer_attr
=
layer_attr
)
fc
=
fc_layer
(
input
=
inputs
,
size
=
hid_dim
,
act
=
linear
,
param_attr
=
para_attr
,
bias_attr
=
bias_attr
)
lstm
=
lstmemory
(
input
=
fc
,
reverse
=
(
i
%
2
)
==
0
,
act
=
relu
,
bias_attr
=
bias_attr
,
layer_attr
=
layer_attr
)
inputs
=
[
fc
,
lstm
]
fc_last
=
pooling_layer
(
input
=
inputs
[
0
],
pooling_type
=
MaxPooling
())
lstm_last
=
pooling_layer
(
input
=
inputs
[
1
],
pooling_type
=
MaxPooling
())
output
=
fc_layer
(
input
=
[
fc_last
,
lstm_last
],
size
=
class_dim
,
output
=
fc_layer
(
input
=
[
fc_last
,
lstm_last
],
size
=
class_dim
,
act
=
SoftmaxActivation
(),
bias_attr
=
bias_attr
,
param_attr
=
para_attr
)
bias_attr
=
bias_attr
,
param_attr
=
para_attr
)
if
is_predict
:
outputs
(
output
)
else
:
outputs
(
classification_cost
(
input
=
output
,
label
=
data_layer
(
'label'
,
1
)))
outputs
(
classification_cost
(
input
=
output
,
label
=
data_layer
(
'label'
,
1
)))
demo/sentiment/trainer_config.py
浏览文件 @
319742c6
...
...
@@ -30,10 +30,9 @@ settings(
learning_rate
=
2e-3
,
learning_method
=
AdamOptimizer
(),
regularization
=
L2Regularization
(
8e-4
),
gradient_clipping_threshold
=
25
)
gradient_clipping_threshold
=
25
)
#################### Network Config ######################
stacked_lstm_net
(
dict_dim
,
class_dim
=
class_dim
,
stacked_num
=
3
,
is_predict
=
is_predict
)
stacked_lstm_net
(
dict_dim
,
class_dim
=
class_dim
,
stacked_num
=
3
,
is_predict
=
is_predict
)
# bidirectional_lstm_net(dict_dim, class_dim=class_dim, is_predict=is_predict)
demo/seqToseq/dataprovider.py
浏览文件 @
319742c6
...
...
@@ -62,8 +62,7 @@ def process(settings, file_name):
if
settings
.
job_mode
:
trg_seq
=
line_split
[
1
]
# one target sequence
trg_words
=
trg_seq
.
split
()
trg_ids
=
[
settings
.
trg_dict
.
get
(
w
,
UNK_IDX
)
for
w
in
trg_words
]
trg_ids
=
[
settings
.
trg_dict
.
get
(
w
,
UNK_IDX
)
for
w
in
trg_words
]
# remove sequence whose length > 80 in training mode
if
len
(
src_ids
)
>
80
or
len
(
trg_ids
)
>
80
:
...
...
demo/seqToseq/preprocess.py
浏览文件 @
319742c6
...
...
@@ -12,7 +12,6 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Example:
python preprocess.py -i INPUT [-d DICTSIZE] [-m]
...
...
@@ -30,6 +29,7 @@ import string
from
optparse
import
OptionParser
from
paddle.utils.preprocess_util
import
save_list
,
DatasetCreater
class
SeqToSeqDatasetCreater
(
DatasetCreater
):
"""
A class to process data for sequence to sequence application.
...
...
@@ -75,7 +75,7 @@ class SeqToSeqDatasetCreater(DatasetCreater):
if
not
os
.
path
.
exists
(
output
):
os
.
system
(
cmd
+
'> '
+
output
)
def
build_dict
(
self
,
file_path
,
dict_path
,
dict_size
=
-
1
):
def
build_dict
(
self
,
file_path
,
dict_path
,
dict_size
=
-
1
):
"""
Create the dictionary for the file, Note that
1. Valid characters include all printable characters
...
...
@@ -104,15 +104,18 @@ class SeqToSeqDatasetCreater(DatasetCreater):
output
=
open
(
dict_path
,
"w+"
)
output
.
write
(
'<s>
\n
<e>
\n
<unk>
\n
'
)
count
=
3
for
key
,
value
in
sorted
(
dictory
.
items
(),
key
=
lambda
d
:
d
[
1
],
reverse
=
True
):
for
key
,
value
in
sorted
(
dictory
.
items
(),
key
=
lambda
d
:
d
[
1
],
reverse
=
True
):
output
.
write
(
key
+
"
\n
"
)
count
+=
1
if
count
==
dict_size
:
break
self
.
dict_size
=
count
def
create_dataset
(
self
,
dict_size
=
-
1
,
mergeDict
=
False
,
suffixes
=
[
'.src'
,
'.trg'
]):
def
create_dataset
(
self
,
dict_size
=-
1
,
mergeDict
=
False
,
suffixes
=
[
'.src'
,
'.trg'
]):
"""
Create seqToseq dataset
"""
...
...
@@ -141,7 +144,8 @@ class SeqToSeqDatasetCreater(DatasetCreater):
file_list
.
sort
()
for
i
in
range
(
0
,
len
(
file_list
),
2
):
if
file_list
[
i
][:
-
suffix_len
]
!=
file_list
[
i
+
1
][:
-
suffix_len
]:
raise
RuntimeError
(
"source and target file name should be equal"
)
raise
RuntimeError
(
"source and target file name should be equal"
)
# cat all the files with the same suffix in dataset
for
suffix
in
suffixes
:
...
...
@@ -163,8 +167,10 @@ class SeqToSeqDatasetCreater(DatasetCreater):
# build dictionary for train data
dict
=
[
'src.dict'
,
'trg.dict'
]
dict_path
=
[
os
.
path
.
join
(
self
.
output_path
,
dict
[
0
]),
os
.
path
.
join
(
self
.
output_path
,
dict
[
1
])]
dict_path
=
[
os
.
path
.
join
(
self
.
output_path
,
dict
[
0
]),
os
.
path
.
join
(
self
.
output_path
,
dict
[
1
])
]
if
mergeDict
:
outname
=
os
.
path
.
join
(
train_dir
,
train_dataset
.
split
(
'/'
)[
-
1
])
print
'build src dictionary for train data'
...
...
@@ -173,21 +179,29 @@ class SeqToSeqDatasetCreater(DatasetCreater):
os
.
system
(
'cp '
+
dict_path
[
0
]
+
' '
+
dict_path
[
1
])
else
:
outname
=
os
.
path
.
join
(
train_dataset
,
self
.
train_dir_name
)
for
id
in
range
(
0
,
2
):
for
id
in
range
(
0
,
2
):
suffix
=
suffixes
[
id
]
print
'build '
+
suffix
[
1
:]
+
' dictionary for train data'
self
.
build_dict
(
outname
+
suffix
,
dict_path
[
id
],
dict_size
)
print
'dictionary size is'
,
self
.
dict_size
def
main
():
usage
=
"usage:
\n
"
\
"python %prog -i INPUT [-d DICTSIZE] [-m]"
parser
=
OptionParser
(
usage
)
parser
.
add_option
(
"-i"
,
action
=
"store"
,
dest
=
"input"
,
help
=
"input original dataset path"
)
parser
.
add_option
(
"-d"
,
action
=
"store"
,
dest
=
"dictsize"
,
parser
.
add_option
(
"-i"
,
action
=
"store"
,
dest
=
"input"
,
help
=
"input original dataset path"
)
parser
.
add_option
(
"-d"
,
action
=
"store"
,
dest
=
"dictsize"
,
help
=
"specified word count of dictionary"
)
parser
.
add_option
(
"-m"
,
"--mergeDict"
,
action
=
"store_true"
,
dest
=
"mergeDict"
,
parser
.
add_option
(
"-m"
,
"--mergeDict"
,
action
=
"store_true"
,
dest
=
"mergeDict"
,
help
=
"merge source and target dictionary"
)
(
options
,
args
)
=
parser
.
parse_args
()
if
options
.
input
[
-
1
]
==
os
.
path
.
sep
:
...
...
@@ -200,5 +214,6 @@ def main():
data_creator
=
SeqToSeqDatasetCreater
(
options
.
input
,
output_path
)
data_creator
.
create_dataset
(
dictsize
,
options
.
mergeDict
)
if
__name__
==
"__main__"
:
main
()
;
main
()
demo/seqToseq/seqToseq_net.py
浏览文件 @
319742c6
...
...
@@ -50,16 +50,21 @@ def seq_to_seq_data(data_dir,
trg_dict
=
None
else
:
train_list
=
os
.
path
.
join
(
data_dir
,
train_list
)
test_list
=
os
.
path
.
join
(
data_dir
,
test_list
)
define_py_data_sources2
(
train_list
,
test_list
,
module
=
"dataprovider"
,
obj
=
"process"
,
args
=
{
"src_dict"
:
src_dict
,
test_list
=
os
.
path
.
join
(
data_dir
,
test_list
)
define_py_data_sources2
(
train_list
,
test_list
,
module
=
"dataprovider"
,
obj
=
"process"
,
args
=
{
"src_dict"
:
src_dict
,
"trg_dict"
:
trg_dict
})
return
{
"src_dict_path"
:
src_lang_dict
,
"trg_dict_path"
:
trg_lang_dict
,
"gen_result"
:
gen_result
}
return
{
"src_dict_path"
:
src_lang_dict
,
"trg_dict_path"
:
trg_lang_dict
,
"gen_result"
:
gen_result
}
def
gru_encoder_decoder
(
data_conf
,
...
...
@@ -90,25 +95,25 @@ def gru_encoder_decoder(data_conf,
size
=
word_vector_dim
,
param_attr
=
ParamAttr
(
name
=
'_source_language_embedding'
))
src_forward
=
simple_gru
(
input
=
src_embedding
,
size
=
encoder_size
)
src_backward
=
simple_gru
(
input
=
src_embedding
,
size
=
encoder_size
,
reverse
=
True
)
src_backward
=
simple_gru
(
input
=
src_embedding
,
size
=
encoder_size
,
reverse
=
True
)
encoded_vector
=
concat_layer
(
input
=
[
src_forward
,
src_backward
])
with
mixed_layer
(
size
=
decoder_size
)
as
encoded_proj
:
encoded_proj
+=
full_matrix_projection
(
input
=
encoded_vector
)
backward_first
=
first_seq
(
input
=
src_backward
)
with
mixed_layer
(
size
=
decoder_size
,
with
mixed_layer
(
size
=
decoder_size
,
act
=
TanhActivation
(),
)
as
decoder_boot
:
decoder_boot
+=
full_matrix_projection
(
input
=
backward_first
)
def
gru_decoder_with_attention
(
enc_vec
,
enc_proj
,
current_word
):
decoder_mem
=
memory
(
name
=
'gru_decoder'
,
size
=
decoder_size
,
boot_layer
=
decoder_boot
)
decoder_mem
=
memory
(
name
=
'gru_decoder'
,
size
=
decoder_size
,
boot_layer
=
decoder_boot
)
context
=
simple_attention
(
encoded_sequence
=
enc_vec
,
context
=
simple_attention
(
encoded_sequence
=
enc_vec
,
encoded_proj
=
enc_proj
,
decoder_state
=
decoder_mem
,
)
...
...
@@ -116,25 +121,29 @@ def gru_encoder_decoder(data_conf,
decoder_inputs
+=
full_matrix_projection
(
input
=
context
)
decoder_inputs
+=
full_matrix_projection
(
input
=
current_word
)
gru_step
=
gru_step_layer
(
name
=
'gru_decoder'
,
gru_step
=
gru_step_layer
(
name
=
'gru_decoder'
,
input
=
decoder_inputs
,
output_mem
=
decoder_mem
,
size
=
decoder_size
)
with
mixed_layer
(
size
=
target_dict_dim
,
bias_attr
=
True
,
with
mixed_layer
(
size
=
target_dict_dim
,
bias_attr
=
True
,
act
=
SoftmaxActivation
())
as
out
:
out
+=
full_matrix_projection
(
input
=
gru_step
)
return
out
decoder_group_name
=
"decoder_group"
group_inputs
=
[
StaticInput
(
input
=
encoded_vector
,
is_seq
=
True
),
StaticInput
(
input
=
encoded_proj
,
is_seq
=
True
)]
group_inputs
=
[
StaticInput
(
input
=
encoded_vector
,
is_seq
=
True
),
StaticInput
(
input
=
encoded_proj
,
is_seq
=
True
)
]
if
not
is_generating
:
trg_embedding
=
embedding_layer
(
input
=
data_layer
(
name
=
'target_language_word'
,
size
=
target_dict_dim
),
input
=
data_layer
(
name
=
'target_language_word'
,
size
=
target_dict_dim
),
size
=
word_vector_dim
,
param_attr
=
ParamAttr
(
name
=
'_target_language_embedding'
))
group_inputs
.
append
(
trg_embedding
)
...
...
@@ -144,12 +153,12 @@ def gru_encoder_decoder(data_conf,
# while encoded source sequence is accessed to as an unbounded memory.
# Here, the StaticInput defines a read-only memory
# for the recurrent_group.
decoder
=
recurrent_group
(
name
=
decoder_group_name
,
decoder
=
recurrent_group
(
name
=
decoder_group_name
,
step
=
gru_decoder_with_attention
,
input
=
group_inputs
)
lbl
=
data_layer
(
name
=
'target_language_next_word'
,
size
=
target_dict_dim
)
lbl
=
data_layer
(
name
=
'target_language_next_word'
,
size
=
target_dict_dim
)
cost
=
classification_cost
(
input
=
decoder
,
label
=
lbl
)
outputs
(
cost
)
else
:
...
...
@@ -168,7 +177,8 @@ def gru_encoder_decoder(data_conf,
embedding_size
=
word_vector_dim
)
group_inputs
.
append
(
trg_embedding
)
beam_gen
=
beam_search
(
name
=
decoder_group_name
,
beam_gen
=
beam_search
(
name
=
decoder_group_name
,
step
=
gru_decoder_with_attention
,
input
=
group_inputs
,
bos_id
=
0
,
...
...
@@ -176,8 +186,10 @@ def gru_encoder_decoder(data_conf,
beam_size
=
beam_size
,
max_length
=
max_length
)
seqtext_printer_evaluator
(
input
=
beam_gen
,
id_input
=
data_layer
(
name
=
"sent_id"
,
size
=
1
),
seqtext_printer_evaluator
(
input
=
beam_gen
,
id_input
=
data_layer
(
name
=
"sent_id"
,
size
=
1
),
dict_file
=
trg_dict_path
,
result_file
=
gen_trans_file
)
outputs
(
beam_gen
)
demo/sequence_tagging/dataprovider.py
浏览文件 @
319742c6
...
...
@@ -17,8 +17,7 @@ import gzip
import
logging
logging
.
basicConfig
(
format
=
'[%(levelname)s %(asctime)s %(filename)s:%(lineno)s] %(message)s'
,
)
format
=
'[%(levelname)s %(asctime)s %(filename)s:%(lineno)s] %(message)s'
,
)
logger
=
logging
.
getLogger
(
'paddle'
)
logger
.
setLevel
(
logging
.
INFO
)
...
...
@@ -32,28 +31,25 @@ num_original_columns = 3
# [[-1,0], [0,0]] means previous token at column 0 and current token at
# column 0 are combined as one feature.
patterns
=
[
[[
-
2
,
0
]],
[[
-
1
,
0
]],
[[
0
,
0
]],
[[
1
,
0
]],
[[
2
,
0
]],
[[
-
1
,
0
],
[
0
,
0
]],
[[
0
,
0
],
[
1
,
0
]],
[[
-
2
,
1
]],
[[
-
1
,
1
]],
[[
0
,
1
]],
[[
1
,
1
]],
[[
2
,
1
]],
[[
-
2
,
1
],
[
-
1
,
1
]],
[[
-
1
,
1
],
[
0
,
1
]],
[[
0
,
1
],
[
1
,
1
]],
[[
1
,
1
],
[
2
,
1
]],
[[
-
2
,
1
],
[
-
1
,
1
],
[
0
,
1
]],
[[
-
1
,
1
],
[
0
,
1
],
[
1
,
1
]],
[[
0
,
1
],
[
1
,
1
],
[
2
,
1
]],
[[
-
2
,
0
]],
[[
-
1
,
0
]],
[[
0
,
0
]],
[[
1
,
0
]],
[[
2
,
0
]],
[[
-
1
,
0
],
[
0
,
0
]],
[[
0
,
0
],
[
1
,
0
]],
[[
-
2
,
1
]],
[[
-
1
,
1
]],
[[
0
,
1
]],
[[
1
,
1
]],
[[
2
,
1
]],
[[
-
2
,
1
],
[
-
1
,
1
]],
[[
-
1
,
1
],
[
0
,
1
]],
[[
0
,
1
],
[
1
,
1
]],
[[
1
,
1
],
[
2
,
1
]],
[[
-
2
,
1
],
[
-
1
,
1
],
[
0
,
1
]],
[[
-
1
,
1
],
[
0
,
1
],
[
1
,
1
]],
[[
0
,
1
],
[
1
,
1
],
[
2
,
1
]],
]
dict_label
=
{
...
...
@@ -82,9 +78,11 @@ dict_label = {
'O'
:
22
}
def
make_features
(
sequence
):
length
=
len
(
sequence
)
num_features
=
len
(
sequence
[
0
])
def
get_features
(
pos
):
if
pos
<
0
:
return
[
'#B%s'
%
-
pos
]
*
num_features
...
...
@@ -94,9 +92,10 @@ def make_features(sequence):
for
i
in
xrange
(
length
):
for
pattern
in
patterns
:
fname
=
'/'
.
join
([
get_features
(
i
+
pos
)[
f
]
for
pos
,
f
in
pattern
])
fname
=
'/'
.
join
([
get_features
(
i
+
pos
)[
f
]
for
pos
,
f
in
pattern
])
sequence
[
i
].
append
(
fname
)
'''
Source file format:
Each line is for one timestep. The features are separated by space.
...
...
@@ -109,6 +108,8 @@ i-th column.
return a list of dict for each column
'''
def
create_dictionaries
(
filename
,
cutoff
,
oov_policy
):
def
add_to_dict
(
sequence
,
dicts
):
num_features
=
len
(
dicts
)
...
...
@@ -140,7 +141,6 @@ def create_dictionaries(filename, cutoff, oov_policy):
features
=
line
.
split
(
' '
)
sequence
.
append
(
features
)
for
i
in
xrange
(
num_features
):
dct
=
dicts
[
i
]
n
=
1
if
oov_policy
[
i
]
==
OOV_POLICY_USE
else
0
...
...
@@ -187,12 +187,15 @@ def initializer(settings, **xargs):
logger
.
info
(
"feature size=%s"
%
dim
)
settings
.
input_types
=
input_types
'''
if oov_policy[i] == OOV_POLICY_USE, features in i-th column which are not
existed in dicts[i] will be assigned to id 0.
if oov_policy[i] == OOV_POLICY_ERROR, all features in i-th column MUST exist
in dicts[i].
'''
@
provider
(
init_hook
=
initializer
,
cache
=
CacheType
.
CACHE_PASS_IN_MEM
)
def
process
(
settings
,
filename
):
input_file
=
filename
...
...
@@ -255,4 +258,3 @@ def process(settings, filename):
f
.
close
()
logger
.
info
(
"num_sequences=%s"
%
num_sequences
)
demo/sequence_tagging/linear_crf.py
浏览文件 @
319742c6
...
...
@@ -16,12 +16,12 @@ from paddle.trainer_config_helpers import *
import
math
define_py_data_sources2
(
train_list
=
"data/train.list"
,
define_py_data_sources2
(
train_list
=
"data/train.list"
,
test_list
=
"data/test.list"
,
module
=
"dataprovider"
,
obj
=
"process"
)
batch_size
=
1
settings
(
learning_method
=
MomentumOptimizer
(),
...
...
@@ -30,14 +30,15 @@ settings(
average_window
=
0.5
,
learning_rate
=
1e-1
,
learning_rate_decay_a
=
1e-5
,
learning_rate_decay_b
=
0.25
,
)
learning_rate_decay_b
=
0.25
,
)
num_label_types
=
23
num_label_types
=
23
def
get_simd_size
(
size
):
return
int
(
math
.
ceil
(
float
(
size
)
/
8
))
*
8
# Currently, in order to use sparse_update=True,
# the size has to be aligned.
num_label_types
=
get_simd_size
(
num_label_types
)
...
...
@@ -45,40 +46,37 @@ num_label_types = get_simd_size(num_label_types)
features
=
data_layer
(
name
=
"features"
,
size
=
76328
)
word
=
data_layer
(
name
=
"word"
,
size
=
6778
)
pos
=
data_layer
(
name
=
"pos"
,
size
=
44
)
chunk
=
data_layer
(
name
=
"chunk"
,
size
=
num_label_types
)
chunk
=
data_layer
(
name
=
"chunk"
,
size
=
num_label_types
)
crf_input
=
fc_layer
(
input
=
features
,
size
=
num_label_types
,
act
=
LinearActivation
(),
bias_attr
=
False
,
param_attr
=
ParamAttr
(
initial_std
=
0
,
sparse_update
=
True
))
param_attr
=
ParamAttr
(
initial_std
=
0
,
sparse_update
=
True
))
crf
=
crf_layer
(
crf
=
crf_layer
(
input
=
crf_input
,
label
=
chunk
,
param_attr
=
ParamAttr
(
name
=
"crfw"
,
initial_std
=
0
),
)
param_attr
=
ParamAttr
(
name
=
"crfw"
,
initial_std
=
0
),
)
crf_decoding
=
crf_decoding_layer
(
crf_decoding
=
crf_decoding_layer
(
size
=
num_label_types
,
input
=
crf_input
,
label
=
chunk
,
param_attr
=
ParamAttr
(
name
=
"crfw"
),
)
param_attr
=
ParamAttr
(
name
=
"crfw"
),
)
sum_evaluator
(
name
=
"error"
,
input
=
crf_decoding
,
)
input
=
crf_decoding
,
)
chunk_evaluator
(
name
=
"chunk_f1"
,
input
=
[
crf_decoding
,
chunk
],
input
=
[
crf_decoding
,
chunk
],
chunk_scheme
=
"IOB"
,
num_chunk_types
=
11
,
)
num_chunk_types
=
11
,
)
inputs
(
word
,
pos
,
chunk
,
features
)
outputs
(
crf
)
demo/sequence_tagging/rnn_crf.py
浏览文件 @
319742c6
...
...
@@ -16,7 +16,8 @@ from paddle.trainer_config_helpers import *
import
math
define_py_data_sources2
(
train_list
=
"data/train.list"
,
define_py_data_sources2
(
train_list
=
"data/train.list"
,
test_list
=
"data/test.list"
,
module
=
"dataprovider"
,
obj
=
"process"
)
...
...
@@ -27,29 +28,27 @@ settings(
batch_size
=
batch_size
,
regularization
=
L2Regularization
(
batch_size
*
1e-5
),
average_window
=
0.5
,
learning_rate
=
2e-3
,
learning_rate_decay_a
=
5e-7
,
learning_rate_decay_b
=
0.5
,
)
learning_rate
=
2e-3
,
learning_rate_decay_a
=
5e-7
,
learning_rate_decay_b
=
0.5
,
)
word_dim
=
128
word_dim
=
128
hidden_dim
=
128
with_rnn
=
True
initial_std
=
1
/
math
.
sqrt
(
hidden_dim
)
param_attr
=
ParamAttr
(
initial_std
=
initial_std
)
cpu_layer_attr
=
ExtraLayerAttribute
(
device
=-
1
)
initial_std
=
1
/
math
.
sqrt
(
hidden_dim
)
param_attr
=
ParamAttr
(
initial_std
=
initial_std
)
cpu_layer_attr
=
ExtraLayerAttribute
(
device
=-
1
)
default_device
(
0
)
num_label_types
=
23
num_label_types
=
23
features
=
data_layer
(
name
=
"features"
,
size
=
76328
)
word
=
data_layer
(
name
=
"word"
,
size
=
6778
)
pos
=
data_layer
(
name
=
"pos"
,
size
=
44
)
chunk
=
data_layer
(
name
=
"chunk"
,
size
=
num_label_types
,
layer_attr
=
cpu_layer_attr
)
chunk
=
data_layer
(
name
=
"chunk"
,
size
=
num_label_types
,
layer_attr
=
cpu_layer_attr
)
emb
=
embedding_layer
(
input
=
word
,
size
=
word_dim
,
param_attr
=
ParamAttr
(
initial_std
=
0
))
...
...
@@ -58,73 +57,64 @@ hidden1 = mixed_layer(
size
=
hidden_dim
,
act
=
STanhActivation
(),
bias_attr
=
True
,
input
=
[
full_matrix_projection
(
emb
),
table_projection
(
pos
,
param_attr
=
param_attr
)]
)
input
=
[
full_matrix_projection
(
emb
),
table_projection
(
pos
,
param_attr
=
param_attr
)
])
if
with_rnn
:
rnn1
=
recurrent_layer
(
act
=
ReluActivation
(),
bias_attr
=
True
,
input
=
hidden1
,
param_attr
=
ParamAttr
(
initial_std
=
0
),
)
param_attr
=
ParamAttr
(
initial_std
=
0
),
)
hidden2
=
mixed_layer
(
size
=
hidden_dim
,
act
=
STanhActivation
(),
bias_attr
=
True
,
input
=
[
full_matrix_projection
(
hidden1
)
]
+
([
full_matrix_projection
(
rnn1
,
param_attr
=
ParamAttr
(
initial_std
=
0
))
]
if
with_rnn
else
[]),
)
input
=
[
full_matrix_projection
(
hidden1
)]
+
([
full_matrix_projection
(
rnn1
,
param_attr
=
ParamAttr
(
initial_std
=
0
))]
if
with_rnn
else
[]),
)
if
with_rnn
:
rnn2
=
recurrent_layer
(
rnn2
=
recurrent_layer
(
reverse
=
True
,
act
=
ReluActivation
(),
bias_attr
=
True
,
input
=
hidden2
,
param_attr
=
ParamAttr
(
initial_std
=
0
),
)
param_attr
=
ParamAttr
(
initial_std
=
0
),
)
crf_input
=
mixed_layer
(
size
=
num_label_types
,
bias_attr
=
False
,
input
=
[
full_matrix_projection
(
hidden2
),
]
+
([
full_matrix_projection
(
rnn2
,
param_attr
=
ParamAttr
(
initial_std
=
0
))
]
if
with_rnn
else
[]),
)
input
=
[
full_matrix_projection
(
hidden2
),
]
+
([
full_matrix_projection
(
rnn2
,
param_attr
=
ParamAttr
(
initial_std
=
0
))]
if
with_rnn
else
[]),
)
crf
=
crf_layer
(
input
=
crf_input
,
label
=
chunk
,
param_attr
=
ParamAttr
(
name
=
"crfw"
,
initial_std
=
0
),
layer_attr
=
cpu_layer_attr
,
)
param_attr
=
ParamAttr
(
name
=
"crfw"
,
initial_std
=
0
)
,
layer_attr
=
cpu_layer_attr
,
)
crf_decoding
=
crf_decoding_layer
(
size
=
num_label_types
,
input
=
crf_input
,
label
=
chunk
,
param_attr
=
ParamAttr
(
name
=
"crfw"
),
layer_attr
=
cpu_layer_attr
,
)
layer_attr
=
cpu_layer_attr
,
)
sum_evaluator
(
name
=
"error"
,
input
=
crf_decoding
,
)
input
=
crf_decoding
,
)
chunk_evaluator
(
name
=
"chunk_f1"
,
input
=
[
crf_decoding
,
chunk
],
input
=
[
crf_decoding
,
chunk
],
chunk_scheme
=
"IOB"
,
num_chunk_types
=
11
,
)
num_chunk_types
=
11
,
)
inputs
(
word
,
pos
,
chunk
,
features
)
outputs
(
crf
)
doc/ui/predict/predict_sample.py
浏览文件 @
319742c6
...
...
@@ -16,82 +16,113 @@ from py_paddle import swig_paddle, DataProviderConverter
from
paddle.trainer.PyDataProvider2
import
dense_vector
from
paddle.trainer.config_parser
import
parse_config
TEST_DATA
=
[[[
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.215686
,
0.533333
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.67451
,
0.992157
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.070588
,
0.886275
,
0.992157
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.192157
,
0.070588
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.670588
,
0.992157
,
0.992157
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.117647
,
0.933333
,
0.858824
,
0.313725
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.090196
,
0.858824
,
0.992157
,
0.831373
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.141176
,
0.992157
,
0.992157
,
0.611765
,
0.054902
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.258824
,
0.992157
,
0.992157
,
0.529412
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.368627
,
0.992157
,
0.992157
,
0.419608
,
0.003922
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.094118
,
0.835294
,
0.992157
,
0.992157
,
0.517647
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.603922
,
0.992157
,
0.992157
,
0.992157
,
0.603922
,
0.545098
,
0.043137
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.447059
,
0.992157
,
0.992157
,
0.956863
,
0.062745
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.011765
,
0.666667
,
0.992157
,
0.992157
,
0.992157
,
0.992157
,
0.992157
,
0.745098
,
0.137255
,
0
,
0
,
0
,
0
,
0
,
0.152941
,
0.866667
,
0.992157
,
0.992157
,
0.521569
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.070588
,
0.992157
,
0.992157
,
0.992157
,
0.803922
,
0.352941
,
0.745098
,
0.992157
,
0.945098
,
0.317647
,
0
,
0
,
0
,
0
,
0.580392
,
0.992157
,
0.992157
,
0.764706
,
0.043137
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.070588
,
0.992157
,
0.992157
,
0.776471
,
0.043137
,
0
,
0.007843
,
0.27451
,
0.882353
,
0.941176
,
0.176471
,
0
,
0
,
0.180392
,
0.898039
,
0.992157
,
0.992157
,
0.313725
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.070588
,
0.992157
,
0.992157
,
0.713725
,
0
,
0
,
0
,
0
,
0.627451
,
0.992157
,
0.729412
,
0.062745
,
0
,
0.509804
,
0.992157
,
0.992157
,
0.776471
,
0.035294
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.494118
,
0.992157
,
0.992157
,
0.968627
,
0.168627
,
0
,
0
,
0
,
0.423529
,
0.992157
,
0.992157
,
0.364706
,
0
,
0.717647
,
0.992157
,
0.992157
,
0.317647
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.533333
,
0.992157
,
0.984314
,
0.945098
,
0.603922
,
0
,
0
,
0
,
0.003922
,
0.466667
,
0.992157
,
0.988235
,
0.976471
,
0.992157
,
0.992157
,
0.788235
,
0.007843
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.686275
,
0.882353
,
0.364706
,
0
,
0
,
0
,
0
,
0
,
0
,
0.098039
,
0.588235
,
0.992157
,
0.992157
,
0.992157
,
0.980392
,
0.305882
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.101961
,
0.67451
,
0.321569
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.105882
,
0.733333
,
0.976471
,
0.811765
,
0.713725
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.65098
,
0.992157
,
0.321569
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.25098
,
0.007843
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0.94902
,
0.219608
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.968627
,
0.764706
,
0.152941
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.498039
,
0.25098
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
]],
[
[
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.298039
,
0.333333
,
0.333333
,
0.333333
,
0.337255
,
0.333333
,
0.333333
,
0.109804
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.027451
,
0.223529
,
0.776471
,
0.964706
,
0.988235
,
0.988235
,
0.988235
,
0.992157
,
0.988235
,
0.988235
,
0.780392
,
0.098039
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.14902
,
0.698039
,
0.988235
,
0.992157
,
0.988235
,
0.901961
,
0.87451
,
0.568627
,
0.882353
,
0.976471
,
0.988235
,
0.988235
,
0.501961
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.188235
,
0.647059
,
0.988235
,
0.988235
,
0.745098
,
0.439216
,
0.098039
,
0
,
0
,
0
,
0.572549
,
0.988235
,
0.988235
,
0.988235
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.2
,
0.933333
,
0.992157
,
0.941176
,
0.247059
,
0
,
0
,
0
,
0
,
0
,
0
,
0.188235
,
0.898039
,
0.992157
,
0.992157
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.039216
,
0.639216
,
0.933333
,
0.988235
,
0.913725
,
0.278431
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.113725
,
0.843137
,
0.988235
,
0.988235
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.235294
,
0.988235
,
0.992157
,
0.988235
,
0.815686
,
0.07451
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.333333
,
0.988235
,
0.988235
,
0.552941
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.211765
,
0.878431
,
0.988235
,
0.992157
,
0.701961
,
0.329412
,
0.109804
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.698039
,
0.988235
,
0.913725
,
0.145098
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.188235
,
0.890196
,
0.988235
,
0.988235
,
0.745098
,
0.047059
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.882353
,
0.988235
,
0.568627
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.2
,
0.933333
,
0.992157
,
0.992157
,
0.992157
,
0.447059
,
0.294118
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.447059
,
0.992157
,
0.768627
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.623529
,
0.988235
,
0.988235
,
0.988235
,
0.988235
,
0.992157
,
0.47451
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.188235
,
0.933333
,
0.87451
,
0.509804
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.992157
,
0.988235
,
0.937255
,
0.792157
,
0.988235
,
0.894118
,
0.082353
,
0
,
0
,
0
,
0
,
0
,
0
,
0.027451
,
0.647059
,
0.992157
,
0.654902
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.623529
,
0.988235
,
0.913725
,
0.329412
,
0.376471
,
0.184314
,
0
,
0
,
0
,
0
,
0
,
0
,
0.027451
,
0.513725
,
0.988235
,
0.635294
,
0.219608
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.196078
,
0.929412
,
0.988235
,
0.988235
,
0.741176
,
0.309804
,
0
,
0
,
0
,
0
,
0
,
0
,
0.529412
,
0.988235
,
0.678431
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.223529
,
0.992157
,
0.992157
,
1
,
0.992157
,
0.992157
,
0.992157
,
0.992157
,
1
,
0.992157
,
0.992157
,
0.882353
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.023529
,
0.478431
,
0.654902
,
0.658824
,
0.952941
,
0.988235
,
0.988235
,
0.988235
,
0.992157
,
0.988235
,
0.729412
,
0.278431
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.196078
,
0.647059
,
0.764706
,
0.764706
,
0.768627
,
0.580392
,
0.047059
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
]]]
TEST_DATA
=
[[[
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.215686
,
0.533333
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.67451
,
0.992157
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.070588
,
0.886275
,
0.992157
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.192157
,
0.070588
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.670588
,
0.992157
,
0.992157
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.117647
,
0.933333
,
0.858824
,
0.313725
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.090196
,
0.858824
,
0.992157
,
0.831373
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.141176
,
0.992157
,
0.992157
,
0.611765
,
0.054902
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.258824
,
0.992157
,
0.992157
,
0.529412
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.368627
,
0.992157
,
0.992157
,
0.419608
,
0.003922
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.094118
,
0.835294
,
0.992157
,
0.992157
,
0.517647
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.603922
,
0.992157
,
0.992157
,
0.992157
,
0.603922
,
0.545098
,
0.043137
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.447059
,
0.992157
,
0.992157
,
0.956863
,
0.062745
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.011765
,
0.666667
,
0.992157
,
0.992157
,
0.992157
,
0.992157
,
0.992157
,
0.745098
,
0.137255
,
0
,
0
,
0
,
0
,
0
,
0.152941
,
0.866667
,
0.992157
,
0.992157
,
0.521569
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.070588
,
0.992157
,
0.992157
,
0.992157
,
0.803922
,
0.352941
,
0.745098
,
0.992157
,
0.945098
,
0.317647
,
0
,
0
,
0
,
0
,
0.580392
,
0.992157
,
0.992157
,
0.764706
,
0.043137
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.070588
,
0.992157
,
0.992157
,
0.776471
,
0.043137
,
0
,
0.007843
,
0.27451
,
0.882353
,
0.941176
,
0.176471
,
0
,
0
,
0.180392
,
0.898039
,
0.992157
,
0.992157
,
0.313725
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.070588
,
0.992157
,
0.992157
,
0.713725
,
0
,
0
,
0
,
0
,
0.627451
,
0.992157
,
0.729412
,
0.062745
,
0
,
0.509804
,
0.992157
,
0.992157
,
0.776471
,
0.035294
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.494118
,
0.992157
,
0.992157
,
0.968627
,
0.168627
,
0
,
0
,
0
,
0.423529
,
0.992157
,
0.992157
,
0.364706
,
0
,
0.717647
,
0.992157
,
0.992157
,
0.317647
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.533333
,
0.992157
,
0.984314
,
0.945098
,
0.603922
,
0
,
0
,
0
,
0.003922
,
0.466667
,
0.992157
,
0.988235
,
0.976471
,
0.992157
,
0.992157
,
0.788235
,
0.007843
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.686275
,
0.882353
,
0.364706
,
0
,
0
,
0
,
0
,
0
,
0
,
0.098039
,
0.588235
,
0.992157
,
0.992157
,
0.992157
,
0.980392
,
0.305882
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.101961
,
0.67451
,
0.321569
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.105882
,
0.733333
,
0.976471
,
0.811765
,
0.713725
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.65098
,
0.992157
,
0.321569
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.25098
,
0.007843
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0.94902
,
0.219608
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.968627
,
0.764706
,
0.152941
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.498039
,
0.25098
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
]],
[[
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.298039
,
0.333333
,
0.333333
,
0.333333
,
0.337255
,
0.333333
,
0.333333
,
0.109804
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.027451
,
0.223529
,
0.776471
,
0.964706
,
0.988235
,
0.988235
,
0.988235
,
0.992157
,
0.988235
,
0.988235
,
0.780392
,
0.098039
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.14902
,
0.698039
,
0.988235
,
0.992157
,
0.988235
,
0.901961
,
0.87451
,
0.568627
,
0.882353
,
0.976471
,
0.988235
,
0.988235
,
0.501961
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.188235
,
0.647059
,
0.988235
,
0.988235
,
0.745098
,
0.439216
,
0.098039
,
0
,
0
,
0
,
0.572549
,
0.988235
,
0.988235
,
0.988235
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.2
,
0.933333
,
0.992157
,
0.941176
,
0.247059
,
0
,
0
,
0
,
0
,
0
,
0
,
0.188235
,
0.898039
,
0.992157
,
0.992157
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.039216
,
0.639216
,
0.933333
,
0.988235
,
0.913725
,
0.278431
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.113725
,
0.843137
,
0.988235
,
0.988235
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.235294
,
0.988235
,
0.992157
,
0.988235
,
0.815686
,
0.07451
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.333333
,
0.988235
,
0.988235
,
0.552941
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.211765
,
0.878431
,
0.988235
,
0.992157
,
0.701961
,
0.329412
,
0.109804
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.698039
,
0.988235
,
0.913725
,
0.145098
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.188235
,
0.890196
,
0.988235
,
0.988235
,
0.745098
,
0.047059
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.882353
,
0.988235
,
0.568627
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.2
,
0.933333
,
0.992157
,
0.992157
,
0.992157
,
0.447059
,
0.294118
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.447059
,
0.992157
,
0.768627
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.623529
,
0.988235
,
0.988235
,
0.988235
,
0.988235
,
0.992157
,
0.47451
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.188235
,
0.933333
,
0.87451
,
0.509804
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.992157
,
0.988235
,
0.937255
,
0.792157
,
0.988235
,
0.894118
,
0.082353
,
0
,
0
,
0
,
0
,
0
,
0
,
0.027451
,
0.647059
,
0.992157
,
0.654902
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.623529
,
0.988235
,
0.913725
,
0.329412
,
0.376471
,
0.184314
,
0
,
0
,
0
,
0
,
0
,
0
,
0.027451
,
0.513725
,
0.988235
,
0.635294
,
0.219608
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.196078
,
0.929412
,
0.988235
,
0.988235
,
0.741176
,
0.309804
,
0
,
0
,
0
,
0
,
0
,
0
,
0.529412
,
0.988235
,
0.678431
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.223529
,
0.992157
,
0.992157
,
1
,
0.992157
,
0.992157
,
0.992157
,
0.992157
,
1
,
0.992157
,
0.992157
,
0.882353
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.023529
,
0.478431
,
0.654902
,
0.658824
,
0.952941
,
0.988235
,
0.988235
,
0.988235
,
0.992157
,
0.988235
,
0.729412
,
0.278431
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0.196078
,
0.647059
,
0.764706
,
0.764706
,
0.768627
,
0.580392
,
0.047059
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
]]]
def
main
():
conf
=
parse_config
(
"./mnist_model/trainer_config.py"
,
""
)
print
conf
.
data_config
.
load_data_args
network
=
swig_paddle
.
GradientMachine
.
createFromConfigProto
(
conf
.
model_config
)
network
=
swig_paddle
.
GradientMachine
.
createFromConfigProto
(
conf
.
model_config
)
assert
isinstance
(
network
,
swig_paddle
.
GradientMachine
)
# For code hint.
network
.
loadParameters
(
"./mnist_model/"
)
converter
=
DataProviderConverter
([
dense_vector
(
784
)])
...
...
doc_cn/concepts/trainer_config.py
浏览文件 @
319742c6
from
paddle.trainer_config_helpers
import
*
define_py_data_sources2
(
train_list
=
'train.list'
,
define_py_data_sources2
(
train_list
=
'train.list'
,
test_list
=
'test.list'
,
module
=
'provider'
,
obj
=
'process'
)
...
...
@@ -8,16 +9,21 @@ settings(
batch_size
=
128
,
learning_rate
=
1e-3
,
learning_method
=
AdamOptimizer
(),
regularization
=
L2Regularization
(
0.5
)
)
regularization
=
L2Regularization
(
0.5
))
img
=
data_layer
(
name
=
'pixel'
,
size
=
28
*
28
)
hidden1
=
simple_img_conv_pool
(
input
=
img
,
filter_size
=
3
,
num_filters
=
32
,
pool_size
=
3
,
num_channel
=
1
)
hidden1
=
simple_img_conv_pool
(
input
=
img
,
filter_size
=
3
,
num_filters
=
32
,
pool_size
=
3
,
num_channel
=
1
)
hidden2
=
fc_layer
(
input
=
hidden1
,
size
=
200
,
act
=
TanhActivation
(),
hidden2
=
fc_layer
(
input
=
hidden1
,
size
=
200
,
act
=
TanhActivation
(),
layer_attr
=
ExtraAttr
(
drop_rate
=
0.5
))
predict
=
fc_layer
(
input
=
hidden2
,
size
=
10
,
act
=
SoftmaxActivation
())
outputs
(
classification_cost
(
input
=
predict
,
label
=
data_layer
(
name
=
'label'
,
size
=
10
)))
outputs
(
classification_cost
(
input
=
predict
,
label
=
data_layer
(
name
=
'label'
,
size
=
10
)))
doc_cn/faq/word2vec_config.py
浏览文件 @
319742c6
...
# the settings and define data provider is omitted.
DICT_DIM
=
3000
# dictionary dimension.
word_ids
=
data_layer
(
'word_ids'
,
size
=
DICT_DIM
)
DICT_DIM
=
3000
# dictionary dimension.
word_ids
=
data_layer
(
'word_ids'
,
size
=
DICT_DIM
)
emb
=
embedding_layer
(
input
=
word_ids
,
size
=
256
,
param_attr
=
ParamAttr
(
sparse_update
=
True
))
emb
=
embedding_layer
(
input
=
word_ids
,
size
=
256
,
param_attr
=
ParamAttr
(
sparse_update
=
True
))
emb_sum
=
pooling_layer
(
input
=
emb
,
pooling_type
=
SumPooling
())
predict
=
fc_layer
(
input
=
emb_sum
,
size
=
DICT_DIM
,
act
=
Softmax
())
outputs
(
classification_cost
(
input
=
predict
,
label
=
data_layer
(
'label'
,
size
=
DICT_DIM
)))
\ No newline at end of file
outputs
(
classification_cost
(
input
=
predict
,
label
=
data_layer
(
'label'
,
size
=
DICT_DIM
)))
doc_cn/faq/word2vec_dataprovider.py
浏览文件 @
319742c6
DICT_DIM
=
3000
DICT_DIM
=
3000
@
provider
(
input_types
=
[
integer_sequence
(
DICT_DIM
),
integer_value
(
DICT_DIM
)])
def
process
(
settings
,
filename
):
with
open
(
filename
)
as
f
:
...
...
doc_cn/ui/data_provider/mnist_config.py
浏览文件 @
319742c6
from
paddle.trainer_config_helpers
import
*
define_py_data_sources2
(
train_list
=
'train.list'
,
define_py_data_sources2
(
train_list
=
'train.list'
,
test_list
=
None
,
module
=
'mnist_provider'
,
obj
=
'process'
)
...
...
doc_cn/ui/data_provider/mnist_provider.dict.py
浏览文件 @
319742c6
...
...
@@ -2,10 +2,9 @@ from paddle.trainer.PyDataProvider2 import *
# Define a py data provider
@
provider
(
input_types
=
{
'pixel'
:
dense_vector
(
28
*
28
),
'label'
:
integer_value
(
10
)
})
@
provider
(
input_types
=
{
'pixel'
:
dense_vector
(
28
*
28
),
'label'
:
integer_value
(
10
)})
def
process
(
settings
,
filename
):
# settings is not used currently.
f
=
open
(
filename
,
'r'
)
# open one of training file
...
...
doc_cn/ui/data_provider/mnist_provider.py
浏览文件 @
319742c6
...
...
@@ -2,10 +2,7 @@ from paddle.trainer.PyDataProvider2 import *
# Define a py data provider
@
provider
(
input_types
=
[
dense_vector
(
28
*
28
),
integer_value
(
10
)
])
@
provider
(
input_types
=
[
dense_vector
(
28
*
28
),
integer_value
(
10
)])
def
process
(
settings
,
filename
):
# settings is not used currently.
f
=
open
(
filename
,
'r'
)
# open one of training file
...
...
doc_cn/ui/data_provider/sentimental_config.py
浏览文件 @
319742c6
...
...
@@ -3,8 +3,11 @@ from paddle.trainer_config_helpers import *
dictionary
=
dict
()
...
# read dictionary from outside
define_py_data_sources2
(
train_list
=
'train.list'
,
test_list
=
None
,
module
=
'sentimental_provider'
,
obj
=
'process'
,
define_py_data_sources2
(
train_list
=
'train.list'
,
test_list
=
None
,
module
=
'sentimental_provider'
,
obj
=
'process'
,
# above codes same as mnist sample.
args
=
{
# pass to provider.
'dictionary'
:
dictionary
...
...
doc_cn/ui/data_provider/sentimental_provider.py
浏览文件 @
319742c6
...
...
@@ -12,7 +12,8 @@ def on_init(settings, dictionary, **kwargs):
# The text is a sequence of integer values, and each value is a word id.
# The whole sequence is the sentences that we want to predict its
# sentimental.
integer_value
(
len
(
dictionary
),
seq_type
=
SequenceType
),
# text input
integer_value
(
len
(
dictionary
),
seq_type
=
SequenceType
),
# text input
# label positive/negative
integer_value
(
2
)
...
...
paddle/api/__init__.py
浏览文件 @
319742c6
...
...
@@ -11,4 +11,3 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
paddle/api/paddle_ld_flags.py
浏览文件 @
319742c6
...
...
@@ -29,7 +29,10 @@ try:
whole_start
=
""
whole_end
=
""
LIB_DIRS
=
[
"math"
,
'utils'
,
'parameter'
,
"gserver"
,
"api"
,
"cuda"
,
"pserver"
,
"trainer"
]
LIB_DIRS
=
[
"math"
,
'utils'
,
'parameter'
,
"gserver"
,
"api"
,
"cuda"
,
"pserver"
,
"trainer"
]
PARENT_LIB_DIRS
=
[
'proto'
]
class
PaddleLDFlag
(
object
):
...
...
@@ -55,18 +58,19 @@ try:
self
.
curt
=
CUDA_LIBRARIES
def
ldflag_str
(
self
):
return
" "
.
join
([
self
.
libs_dir_str
(),
self
.
parent_dir_str
(),
self
.
libs_str
()])
return
" "
.
join
(
[
self
.
libs_dir_str
(),
self
.
parent_dir_str
(),
self
.
libs_str
()])
def
libs_dir_str
(
self
):
libdirs
=
LIB_DIRS
return
" "
.
join
(
map
(
lambda
x
:
"-L"
+
os
.
path
.
join
(
self
.
paddle_build_dir
,
x
),
return
" "
.
join
(
map
(
lambda
x
:
"-L"
+
os
.
path
.
join
(
self
.
paddle_build_dir
,
x
),
libdirs
))
def
parent_dir_str
(
self
):
libdirs
=
PARENT_LIB_DIRS
return
" "
.
join
(
map
(
lambda
x
:
"-L"
+
os
.
path
.
join
(
self
.
paddle_build_dir
,
'..'
,
x
),
return
" "
.
join
(
map
(
lambda
x
:
"-L"
+
os
.
path
.
join
(
self
.
paddle_build_dir
,
'..'
,
x
),
libdirs
))
def
libs_str
(
self
):
...
...
@@ -113,10 +117,10 @@ try:
return
cmake_flag
elif
cmake_flag
.
startswith
(
"-l"
):
# normal link command
return
cmake_flag
elif
cmake_flag
in
[
"gflags-shared"
,
"gflags-static
"
,
"gflags_nothreads-shared"
,
"gflags_nothreads-static"
]:
# special for gflags
elif
cmake_flag
in
[
"gflags-shared"
,
"gflags-static"
,
"gflags_nothreads-shared
"
,
"gflags_nothreads-static"
]:
# special for gflags
assert
PaddleLDFlag
.
cmake_bool
(
self
.
gflags_location
)
return
self
.
gflags_location
elif
len
(
cmake_flag
)
!=
0
:
...
...
@@ -132,18 +136,22 @@ try:
:type cmake_str: str
:rtype: bool
"""
if
cmake_str
in
[
"FALSE"
,
"OFF"
,
"NO"
]
or
cmake_str
.
endswith
(
"-NOTFOUND"
):
if
cmake_str
in
[
"FALSE"
,
"OFF"
,
"NO"
]
or
cmake_str
.
endswith
(
"-NOTFOUND"
):
return
False
else
:
return
True
def
c_flag
(
self
):
if
self
.
with_coverage
:
return
[
"-fprofile-arcs"
,
"-ftest-coverage"
,
"-O0"
,
"-g"
]
else
:
return
None
except
ImportError
:
class
PaddleLDFlag
(
object
):
def
ldflag_str
(
self
):
pass
def
c_flag
(
self
):
pass
paddle/api/test/testArguments.py
浏览文件 @
319742c6
...
...
@@ -32,7 +32,7 @@ class TestArguments(unittest.TestCase):
iv
=
args
.
getSlotIds
(
0
)
assert
isinstance
(
iv
,
swig_paddle
.
IVector
)
np_arr
=
iv
.
toNumpyArrayInplace
()
self
.
assertEqual
(
np_arr
.
shape
,
(
6
,))
self
.
assertEqual
(
np_arr
.
shape
,
(
6
,
))
if
__name__
==
'__main__'
:
...
...
paddle/api/test/testGradientMachine.py
浏览文件 @
319742c6
...
...
@@ -30,8 +30,8 @@ class TestGradientMachine(unittest.TestCase):
self
.
assertIsNotNone
(
model_config
)
machine
=
swig_paddle
.
GradientMachine
.
createByModelConfig
(
model_config
,
swig_paddle
.
CREATE_MODE_NORMAL
,
swig_paddle
.
ParameterOptimizer
.
create
(
opt_config
).
getParameterTypes
(
))
swig_paddle
.
ParameterOptimizer
.
create
(
opt_config
).
getParameterTypes
(
))
self
.
assertIsNotNone
(
machine
)
ipt
,
_
=
util
.
loadMNISTTrainData
()
output
=
swig_paddle
.
Arguments
.
createArguments
(
0
)
...
...
@@ -43,7 +43,7 @@ class TestGradientMachine(unittest.TestCase):
assert
isinstance
(
param
,
swig_paddle
.
Parameter
)
val
=
param
.
getBuf
(
swig_paddle
.
PARAMETER_VALUE
)
assert
isinstance
(
val
,
swig_paddle
.
Vector
)
arr
=
numpy
.
full
((
len
(
val
),),
0.1
,
dtype
=
"float32"
)
arr
=
numpy
.
full
((
len
(
val
),
),
0.1
,
dtype
=
"float32"
)
val
.
copyFromNumpyArray
(
arr
)
param_config
=
param
.
getConfig
().
toProto
()
assert
isinstance
(
param_config
,
...
...
paddle/api/test/testMatrix.py
浏览文件 @
319742c6
...
...
@@ -69,7 +69,8 @@ class TestMatrix(unittest.TestCase):
def
test_numpy
(
self
):
numpy_mat
=
np
.
matrix
([[
1
,
2
],
[
3
,
4
],
[
5
,
6
]],
dtype
=
"float32"
)
m
=
swig_paddle
.
Matrix
.
createCpuDenseFromNumpy
(
numpy_mat
)
self
.
assertEqual
((
int
(
m
.
getHeight
()),
int
(
m
.
getWidth
())),
numpy_mat
.
shape
)
self
.
assertEqual
(
(
int
(
m
.
getHeight
()),
int
(
m
.
getWidth
())),
numpy_mat
.
shape
)
# the numpy matrix and paddle matrix shared the same memory.
numpy_mat
[
0
,
1
]
=
342.23
...
...
paddle/api/test/testTrain.py
浏览文件 @
319742c6
...
...
@@ -98,7 +98,8 @@ def main():
cost_vec
=
outArgs
.
getSlotValue
(
0
)
assert
isinstance
(
cost_vec
,
swig_paddle
.
Matrix
)
cost_vec
=
cost_vec
.
copyToNumpyMat
()
print
'Finish Batch'
,
batch_id
,
'with cost '
,
cost_vec
.
sum
()
/
batch_size
print
'Finish Batch'
,
batch_id
,
'with cost '
,
cost_vec
.
sum
(
)
/
batch_size
batch_id
+=
1
for
optimizer
in
optimizers
:
...
...
paddle/api/test/testTrainConfig.py
浏览文件 @
319742c6
from
paddle.trainer_config_helpers
import
*
settings
(
batch_size
=
100
,
learning_method
=
AdamOptimizer
()
)
settings
(
batch_size
=
100
,
learning_method
=
AdamOptimizer
())
din
=
data_layer
(
name
=
'input'
,
size
=
784
)
...
...
paddle/api/test/testTrainer.py
浏览文件 @
319742c6
...
...
@@ -17,9 +17,9 @@ from paddle.trainer.config_parser import logger
from
py_paddle
import
swig_paddle
import
util
def
main
():
trainer_config
=
parse_config
(
"./testTrainConfig.py"
,
""
)
trainer_config
=
parse_config
(
"./testTrainConfig.py"
,
""
)
model
=
swig_paddle
.
GradientMachine
.
createFromConfigProto
(
trainer_config
.
model_config
)
trainer
=
swig_paddle
.
Trainer
.
create
(
trainer_config
,
model
)
...
...
paddle/api/test/testVector.py
浏览文件 @
319742c6
...
...
@@ -112,5 +112,6 @@ class TestVector(unittest.TestCase):
if
__name__
==
'__main__'
:
swig_paddle
.
initPaddle
(
"--use_gpu=1"
if
swig_paddle
.
isGpuVersion
()
else
"--use_gpu=0"
)
swig_paddle
.
initPaddle
(
"--use_gpu=1"
if
swig_paddle
.
isGpuVersion
()
else
"--use_gpu=0"
)
unittest
.
main
()
paddle/gserver/tests/__init__.py
浏览文件 @
319742c6
...
...
@@ -11,4 +11,3 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
paddle/gserver/tests/pyDataProvider.py
浏览文件 @
319742c6
...
...
@@ -16,6 +16,7 @@ import numpy
import
struct
import
traceback
def
header_creator
():
ret
=
""
ret
+=
struct
.
pack
(
'i'
,
3
)
# slot num
...
...
@@ -28,6 +29,7 @@ def header_creator():
ret
+=
struct
.
pack
(
'i'
,
2
)
# slot2 dim
return
ret
def
dense_value_creator
(
sample_num
):
ret
=
""
ret
+=
struct
.
pack
(
'i'
,
sample_num
)
# slot0 sample num
...
...
@@ -37,6 +39,7 @@ def dense_value_creator(sample_num):
ret
+=
struct
.
pack
(
'f'
,
3.0
)
return
ret
def
sparse_value_creator
(
sample_num
):
ret
=
""
ret
+=
struct
.
pack
(
'i'
,
sample_num
)
# slot1 sample num
...
...
@@ -48,6 +51,7 @@ def sparse_value_creator(sample_num):
ret
+=
struct
.
pack
(
'i'
,
2
)
return
ret
def
index_value_creator
(
sample_num
):
ret
=
""
ret
+=
struct
.
pack
(
'i'
,
sample_num
)
# slot2 sample num
...
...
@@ -55,6 +59,7 @@ def index_value_creator(sample_num):
ret
+=
struct
.
pack
(
'i'
,
0
)
return
ret
def
sequenceStartPositions_creator
():
ret
=
""
ret
+=
struct
.
pack
(
'i'
,
2
)
# slot0 sequence num
...
...
@@ -67,6 +72,7 @@ def sequenceStartPositions_creator():
ret
+=
struct
.
pack
(
'i'
,
1
)
# slot2 sequence value2
return
ret
def
subSequenceStartPositions_creator
():
ret
=
""
ret
+=
struct
.
pack
(
'i'
,
3
)
# slot0 subsequence num
...
...
@@ -82,6 +88,7 @@ def subSequenceStartPositions_creator():
ret
+=
struct
.
pack
(
'i'
,
2
)
# slot2 subsequence value3
return
ret
class
SimpleDataProvider
:
def
__init__
(
self
,
*
file_list
):
self
.
file_list
=
file_list
...
...
@@ -104,6 +111,7 @@ class SimpleDataProvider:
ret
+=
sequenceStartPositions_creator
()
return
ret
class
SimpleNestDataProvider
:
def
__init__
(
self
,
*
file_list
):
self
.
file_list
=
file_list
...
...
@@ -127,6 +135,7 @@ class SimpleNestDataProvider:
ret
+=
subSequenceStartPositions_creator
()
return
ret
if
__name__
==
"__main__"
:
# test code
data_provider
=
SimpleDataProvider
(
'./test_batch'
)
...
...
paddle/gserver/tests/rnn_data_provider.py
浏览文件 @
319742c6
...
...
@@ -22,17 +22,19 @@ data = [
[[[
0
,
2
],
[
2
,
5
],
[
0
,
1
,
2
]],
1
],
]
# Used for sequence_nest_rnn.conf
@
provider
(
input_types
=
[
integer_value_sub_sequence
(
10
),
integer_value
(
3
)],
@
provider
(
input_types
=
[
integer_value_sub_sequence
(
10
),
integer_value
(
3
)],
should_shuffle
=
False
)
def
process_subseq
(
settings
,
file_name
):
for
d
in
data
:
yield
d
# Used for sequence_rnn.conf
@
provider
(
input_types
=
[
integer_value_sequence
(
10
),
integer_value
(
3
)],
@
provider
(
input_types
=
[
integer_value_sequence
(
10
),
integer_value
(
3
)],
should_shuffle
=
False
)
def
process_seq
(
settings
,
file_name
):
for
d
in
data
:
...
...
@@ -41,17 +43,19 @@ def process_seq(settings, file_name):
seq
+=
subseq
yield
seq
,
d
[
1
]
# Used for sequence_nest_rnn_multi_input.conf
@
provider
(
input_types
=
[
integer_value_sub_sequence
(
10
),
integer_value
(
3
)],
@
provider
(
input_types
=
[
integer_value_sub_sequence
(
10
),
integer_value
(
3
)],
should_shuffle
=
False
)
def
process_subseq2
(
settings
,
file_name
):
for
d
in
data
:
yield
d
# Used for sequence_rnn_multi_input.conf
@
provider
(
input_types
=
[
integer_value_sequence
(
10
),
integer_value
(
3
)],
@
provider
(
input_types
=
[
integer_value_sequence
(
10
),
integer_value
(
3
)],
should_shuffle
=
False
)
def
process_seq2
(
settings
,
file_name
):
for
d
in
data
:
...
...
@@ -60,16 +64,20 @@ def process_seq2(settings, file_name):
seq
+=
subseq
yield
seq
,
d
[
1
]
###########################################################
data2
=
[
[[[
1
,
2
],
[
4
,
5
,
2
]],
[[
5
,
4
,
1
],
[
3
,
1
]]
,
0
],
[[[
0
,
2
],
[
2
,
5
],
[
0
,
1
,
2
]],[[
1
,
5
],
[
4
],
[
2
,
3
,
6
,
1
]],
1
],
[[[
1
,
2
],
[
4
,
5
,
2
]],
[[
5
,
4
,
1
],
[
3
,
1
]]
,
0
],
[[[
0
,
2
],
[
2
,
5
],
[
0
,
1
,
2
]],
[[
1
,
5
],
[
4
],
[
2
,
3
,
6
,
1
]],
1
],
]
# Used for sequence_nest_rnn_multi_unequalength_inputs.conf
@
provider
(
input_types
=
[
integer_value_sub_sequence
(
10
),
integer_value_sub_sequence
(
10
),
integer_value
(
2
)],
@
provider
(
input_types
=
[
integer_value_sub_sequence
(
10
),
integer_value_sub_sequence
(
10
),
integer_value
(
2
)
],
should_shuffle
=
False
)
def
process_unequalength_subseq
(
settings
,
file_name
):
for
d
in
data2
:
...
...
@@ -77,14 +85,13 @@ def process_unequalength_subseq(settings, file_name):
# Used for sequence_rnn_multi_unequalength_inputs.conf
@
provider
(
input_types
=
[
integer_value_sequence
(
10
),
integer_value_sequence
(
10
),
integer_value
(
2
)],
@
provider
(
input_types
=
[
integer_value_sequence
(
10
),
integer_value_sequence
(
10
),
integer_value
(
2
)
],
should_shuffle
=
False
)
def
process_unequalength_seq
(
settings
,
file_name
):
for
d
in
data2
:
words1
=
reduce
(
lambda
x
,
y
:
x
+
y
,
d
[
0
])
words2
=
reduce
(
lambda
x
,
y
:
x
+
y
,
d
[
1
])
words1
=
reduce
(
lambda
x
,
y
:
x
+
y
,
d
[
0
])
words2
=
reduce
(
lambda
x
,
y
:
x
+
y
,
d
[
1
])
yield
words1
,
words2
,
d
[
2
]
paddle/gserver/tests/sequenceGen.py
浏览文件 @
319742c6
...
...
@@ -20,8 +20,9 @@ from paddle.trainer.PyDataProvider2 import *
def
hook
(
settings
,
dict_file
,
**
kwargs
):
settings
.
word_dict
=
dict_file
settings
.
input_types
=
[
integer_value_sequence
(
len
(
settings
.
word_dict
)),
integer_value
(
3
)]
settings
.
input_types
=
[
integer_value_sequence
(
len
(
settings
.
word_dict
)),
integer_value
(
3
)
]
settings
.
logger
.
info
(
'dict len : %d'
%
(
len
(
settings
.
word_dict
)))
...
...
@@ -32,16 +33,19 @@ def process(settings, file_name):
label
,
comment
=
line
.
strip
().
split
(
'
\t
'
)
label
=
int
(
''
.
join
(
label
.
split
()))
words
=
comment
.
split
()
word_slot
=
[
settings
.
word_dict
[
w
]
for
w
in
words
if
w
in
settings
.
word_dict
]
word_slot
=
[
settings
.
word_dict
[
w
]
for
w
in
words
if
w
in
settings
.
word_dict
]
yield
word_slot
,
label
## for hierarchical sequence network
def
hook2
(
settings
,
dict_file
,
**
kwargs
):
settings
.
word_dict
=
dict_file
settings
.
input_types
=
[
integer_value_sub_sequence
(
len
(
settings
.
word_dict
)),
integer_value_sequence
(
3
)]
settings
.
input_types
=
[
integer_value_sub_sequence
(
len
(
settings
.
word_dict
)),
integer_value_sequence
(
3
)
]
settings
.
logger
.
info
(
'dict len : %d'
%
(
len
(
settings
.
word_dict
)))
...
...
@@ -55,8 +59,10 @@ def process2(settings, file_name):
label
,
comment
=
line
.
strip
().
split
(
'
\t
'
)
label
=
int
(
''
.
join
(
label
.
split
()))
words
=
comment
.
split
()
word_slot
=
[
settings
.
word_dict
[
w
]
for
w
in
words
if
w
in
settings
.
word_dict
]
word_slot
=
[
settings
.
word_dict
[
w
]
for
w
in
words
if
w
in
settings
.
word_dict
]
label_list
.
append
(
label
)
word_slot_list
.
append
(
word_slot
)
else
:
...
...
paddle/gserver/tests/sequence_layer_group.conf
浏览文件 @
319742c6
...
...
@@ -21,15 +21,16 @@ dict_file = dict()
for
line_count
,
line
in
enumerate
(
open
(
dict_path
,
"r"
)):
dict_file
[
line
.
strip
()] =
line_count
define_py_data_sources2
(
train_list
=
'gserver/tests/Sequence/train.list'
,
define_py_data_sources2
(
train_list
=
'gserver/tests/Sequence/train.list'
,
test_list
=
None
,
module
=
'sequenceGen'
,
obj
=
'process'
,
args
={
"dict_file"
:
dict_file
})
args
={
"dict_file"
:
dict_file
})
settings
(
batch_size
=
5
)
######################## network configure ################################
dict_dim
=
len
(
open
(
dict_path
,
'r'
).
readlines
())
dict_dim
=
len
(
open
(
dict_path
,
'r'
).
readlines
())
word_dim
=
128
hidden_dim
=
256
label_dim
=
3
...
...
@@ -39,10 +40,11 @@ data = data_layer(name="word", size=dict_dim)
emb
=
embedding_layer
(
input
=
data
,
size
=
word_dim
)
# (lstm_input + lstm) is equal to lstmemory
with
mixed_layer
(
size
=
hidden_dim
*
4
)
as
lstm_input
:
with
mixed_layer
(
size
=
hidden_dim
*
4
)
as
lstm_input
:
lstm_input
+=
full_matrix_projection
(
input
=
emb
)
lstm
=
lstmemory_group
(
input
=
lstm_input
,
lstm
=
lstmemory_group
(
input
=
lstm_input
,
size
=
hidden_dim
,
act
=
TanhActivation
(),
gate_act
=
SigmoidActivation
(),
...
...
@@ -51,9 +53,11 @@ lstm = lstmemory_group(input=lstm_input,
lstm_last
=
last_seq
(
input
=
lstm
)
with
mixed_layer
(
size
=
label_dim
,
act
=
SoftmaxActivation
(),
bias_attr
=
True
)
as
output
:
with
mixed_layer
(
size
=
label_dim
,
act
=
SoftmaxActivation
(),
bias_attr
=
True
)
as
output
:
output
+=
full_matrix_projection
(
input
=
lstm_last
)
outputs
(
classification_cost
(
input
=
output
,
label
=
data_layer
(
name
=
"label"
,
size
=
1
)))
outputs
(
classification_cost
(
input
=
output
,
label
=
data_layer
(
name
=
"label"
,
size
=
1
)))
paddle/gserver/tests/sequence_nest_layer_group.conf
浏览文件 @
319742c6
...
...
@@ -21,15 +21,16 @@ dict_file = dict()
for
line_count
,
line
in
enumerate
(
open
(
dict_path
,
"r"
)):
dict_file
[
line
.
strip
()] =
line_count
define_py_data_sources2
(
train_list
=
'gserver/tests/Sequence/train.list.nest'
,
define_py_data_sources2
(
train_list
=
'gserver/tests/Sequence/train.list.nest'
,
test_list
=
None
,
module
=
'sequenceGen'
,
obj
=
'process2'
,
args
={
"dict_file"
:
dict_file
})
args
={
"dict_file"
:
dict_file
})
settings
(
batch_size
=
2
)
######################## network configure ################################
dict_dim
=
len
(
open
(
dict_path
,
'r'
).
readlines
())
dict_dim
=
len
(
open
(
dict_path
,
'r'
).
readlines
())
word_dim
=
128
hidden_dim
=
256
label_dim
=
3
...
...
@@ -38,12 +39,14 @@ data = data_layer(name="word", size=dict_dim)
emb_group
=
embedding_layer
(
input
=
data
,
size
=
word_dim
)
# (lstm_input + lstm) is equal to lstmemory
def
lstm_group
(
lstm_group_input
):
with
mixed_layer
(
size
=
hidden_dim
*
4
)
as
group_input
:
with
mixed_layer
(
size
=
hidden_dim
*
4
)
as
group_input
:
group_input
+=
full_matrix_projection
(
input
=
lstm_group_input
)
lstm_output
=
lstmemory_group
(
input
=
group_input
,
lstm_output
=
lstmemory_group
(
input
=
group_input
,
name
=
"lstm_group"
,
size
=
hidden_dim
,
act
=
TanhActivation
(),
...
...
@@ -52,23 +55,30 @@ def lstm_group(lstm_group_input):
lstm_layer_attr
=
ExtraLayerAttribute
(
error_clipping_threshold
=
50
))
return
lstm_output
lstm_nest_group
=
recurrent_group
(
input
=
SubsequenceInput
(
emb_group
),
step
=
lstm_group
,
name
=
"lstm_nest_group"
)
lstm_nest_group
=
recurrent_group
(
input
=
SubsequenceInput
(
emb_group
),
step
=
lstm_group
,
name
=
"lstm_nest_group"
)
# hasSubseq ->(seqlastins) seq
lstm_last
=
last_seq
(
input
=
lstm_nest_group
,
agg_level
=
AggregateLevel
.
EACH_SEQUENCE
)
lstm_last
=
last_seq
(
input
=
lstm_nest_group
,
agg_level
=
AggregateLevel
.
EACH_SEQUENCE
)
# seq ->(expand) hasSubseq
lstm_expand
=
expand_layer
(
input
=
lstm_last
,
expand_as
=
emb_group
,
expand_level
=
ExpandLevel
.
FROM_SEQUENCE
)
lstm_expand
=
expand_layer
(
input
=
lstm_last
,
expand_as
=
emb_group
,
expand_level
=
ExpandLevel
.
FROM_SEQUENCE
)
# hasSubseq ->(average) seq
lstm_average
=
pooling_layer
(
input
=
lstm_expand
,
lstm_average
=
pooling_layer
(
input
=
lstm_expand
,
pooling_type
=
AvgPooling
(),
agg_level
=
AggregateLevel
.
EACH_SEQUENCE
)
with
mixed_layer
(
size
=
label_dim
,
act
=
SoftmaxActivation
(),
bias_attr
=
True
)
as
output
:
with
mixed_layer
(
size
=
label_dim
,
act
=
SoftmaxActivation
(),
bias_attr
=
True
)
as
output
:
output
+=
full_matrix_projection
(
input
=
lstm_average
)
outputs
(
classification_cost
(
input
=
output
,
label
=
data_layer
(
name
=
"label"
,
size
=
1
)))
outputs
(
classification_cost
(
input
=
output
,
label
=
data_layer
(
name
=
"label"
,
size
=
1
)))
paddle/gserver/tests/test_PyDataProvider2.py
浏览文件 @
319742c6
...
...
@@ -33,16 +33,19 @@ def test_init_hooker(setting, value, **kwargs):
setting
.
value
=
value
@
provider
(
input_types
=
[
dense_vector
(
20
,
seq_type
=
SequenceType
.
NO_SEQUENCE
)],
@
provider
(
input_types
=
[
dense_vector
(
20
,
seq_type
=
SequenceType
.
NO_SEQUENCE
)],
init_hook
=
test_init_hooker
)
def
test_init_hook
(
setting
,
filename
):
for
i
in
xrange
(
200
):
yield
setting
.
value
@
provider
(
input_types
=
[
sparse_binary_vector
(
30000
,
seq_type
=
SequenceType
.
NO_SEQUENCE
)])
@
provider
(
input_types
=
[
sparse_binary_vector
(
30000
,
seq_type
=
SequenceType
.
NO_SEQUENCE
)
])
def
test_sparse_non_value_no_seq
(
setting
,
filename
):
for
i
in
xrange
(
200
):
yield
[(
i
+
1
)
*
(
j
+
1
)
for
j
in
xrange
(
10
)]
...
...
@@ -77,7 +80,9 @@ def test_min_pool_size(setting, filename):
yield
random
.
randint
(
0
,
100
-
1
)
@
provider
(
input_types
=
[
index_slot
(
100
,
seq_type
=
SequenceType
.
SEQUENCE
)],
@
provider
(
input_types
=
[
index_slot
(
100
,
seq_type
=
SequenceType
.
SEQUENCE
)],
can_over_batch_size
=
False
,
calc_batch_size
=
lambda
x
:
len
(
x
[
0
]))
def
test_can_over_batch_size
(
setting
,
filename
):
...
...
@@ -86,16 +91,14 @@ def test_can_over_batch_size(setting, filename):
yield
[
random
.
randint
(
0
,
100
-
1
)
for
_
in
xrange
(
seq_len
)]
@
provider
(
input_types
=
{
'input1'
:
index_slot
(
10
),
'input2'
:
index_slot
(
10
)})
@
provider
(
input_types
=
{
'input1'
:
index_slot
(
10
),
'input2'
:
index_slot
(
10
)})
def
test_input_order
(
setting
,
filename
):
for
_
in
xrange
(
1000
):
yield
{
'input1'
:
0
,
'input2'
:
1
}
yield
{
'input1'
:
0
,
'input2'
:
1
}
@
provider
(
input_types
=
[
index_slot
(
10
)],
@
provider
(
input_types
=
[
index_slot
(
10
)],
check
=
True
,
check_fail_continue
=
True
,
should_shuffle
=
"123"
)
# also test should shuffle
...
...
@@ -108,4 +111,3 @@ def test_check(settings, filename):
if
i
<
10
:
yield_good_value
=
True
yield
i
paddle/py_paddle/__init__.py
浏览文件 @
319742c6
...
...
@@ -15,9 +15,10 @@
from
util
import
DataProviderWrapperConverter
from
dataprovider_converter
import
DataProviderConverter
__all__
=
[
'paddle'
,
__all__
=
[
'paddle'
,
'DataProviderConverter'
,
'DataProviderWrapperConverter'
,
# for deprecated usage.
'loadParameterFile'
]
'loadParameterFile'
]
util
.
monkeypatches
()
paddle/py_paddle/dataprovider_converter.py
浏览文件 @
319742c6
...
...
@@ -45,10 +45,8 @@ class DenseScanner(IScanner):
def
finish_scan
(
self
,
argument
):
assert
isinstance
(
argument
,
swig_paddle
.
Arguments
)
assert
isinstance
(
self
.
input_type
,
dp2
.
InputType
)
m
=
swig_paddle
.
Matrix
.
createDense
(
self
.
__mat__
,
self
.
__height__
,
self
.
input_type
.
dim
,
False
)
m
=
swig_paddle
.
Matrix
.
createDense
(
self
.
__mat__
,
self
.
__height__
,
self
.
input_type
.
dim
,
False
)
argument
.
setSlotValue
(
self
.
pos
,
m
)
...
...
@@ -141,8 +139,10 @@ class DataProviderConverter(object):
assert
isinstance
(
argument
,
swig_paddle
.
Arguments
)
argument
.
resize
(
len
(
self
.
input_types
))
scanners
=
[
DataProviderConverter
.
create_scanner
(
i
,
each_type
)
for
i
,
each_type
in
enumerate
(
self
.
input_types
)]
scanners
=
[
DataProviderConverter
.
create_scanner
(
i
,
each_type
)
for
i
,
each_type
in
enumerate
(
self
.
input_types
)
]
for
each_sample
in
dat
:
for
each_step
,
scanner
in
zip
(
each_sample
,
scanners
):
...
...
@@ -171,11 +171,14 @@ class DataProviderConverter(object):
assert
retv
is
not
None
if
each
.
seq_type
==
dp2
.
SequenceType
.
SUB_SEQUENCE
:
retv
=
SequenceScanner
(
each
,
i
,
retv
,
lambda
a
,
p
,
seq
:
a
.
setSlotSubSequenceStartPositions
(
p
,
seq
))
if
each
.
seq_type
in
[
dp2
.
SequenceType
.
SUB_SEQUENCE
,
dp2
.
SequenceType
.
SEQUENCE
]:
retv
=
SequenceScanner
(
each
,
i
,
retv
,
lambda
a
,
p
,
seq
:
a
.
setSlotSequenceStartPositions
(
p
,
seq
))
retv
=
SequenceScanner
(
each
,
i
,
retv
,
lambda
a
,
p
,
seq
:
a
.
setSlotSubSequenceStartPositions
(
p
,
seq
))
if
each
.
seq_type
in
[
dp2
.
SequenceType
.
SUB_SEQUENCE
,
dp2
.
SequenceType
.
SEQUENCE
]:
retv
=
SequenceScanner
(
each
,
i
,
retv
,
lambda
a
,
p
,
seq
:
a
.
setSlotSequenceStartPositions
(
p
,
seq
))
return
retv
paddle/py_paddle/util.py
浏览文件 @
319742c6
...
...
@@ -11,7 +11,6 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Some Useful method for py_paddle.
"""
...
...
@@ -79,6 +78,7 @@ class __ParameterCallbackWrapper__(swig_paddle.UpdateCallback):
else
:
return
__ParameterCallbackWrapper__
(
callback
).
__disown__
()
def
__arguments_to_numpy__
(
i
,
arg
):
assert
isinstance
(
arg
,
swig_paddle
.
Arguments
)
value
=
arg
.
getSlotValue
(
i
)
...
...
@@ -89,10 +89,8 @@ def __arguments_to_numpy__(i, arg):
if
ids
is
not
None
:
assert
isinstance
(
ids
,
swig_paddle
.
IVector
)
ids
=
ids
.
copyToNumpyArray
()
return
{
"value"
:
value
,
"id"
:
ids
}
return
{
"value"
:
value
,
"id"
:
ids
}
def
__monkeypatch_gradient_machine__
():
"""
...
...
@@ -102,7 +100,6 @@ def __monkeypatch_gradient_machine__():
swig_paddle
.
GradientMachine
.
loadFromConfigFile
=
\
staticmethod
(
loadGradientMachine
)
def
__matrix_to_numpy__
(
m
):
if
isinstance
(
m
,
swig_paddle
.
Matrix
):
return
m
.
copyToNumpyMat
()
...
...
@@ -113,9 +110,11 @@ def __monkeypatch_gradient_machine__():
def
createFromConfigProto
(
protoObj
,
createMode
=
swig_paddle
.
CREATE_MODE_NORMAL
,
paramTypes
=
[
swig_paddle
.
PARAMETER_VALUE
,
paramTypes
=
[
swig_paddle
.
PARAMETER_VALUE
,
swig_paddle
.
PARAMETER_GRADIENT
,
swig_paddle
.
PARAMETER_MOMENTUM
]):
swig_paddle
.
PARAMETER_MOMENTUM
]):
"""
Create Gradient Machine From Proto object.
:param protoObj: Model config
...
...
@@ -145,8 +144,10 @@ def __monkeypatch_gradient_machine__():
"""
outArgs
=
swig_paddle
.
Arguments
.
createArguments
(
0
)
self
.
forward
(
inArgs
,
outArgs
,
swig_paddle
.
PASS_TEST
)
return
[
__arguments_to_numpy__
(
i
,
outArgs
)
for
i
in
xrange
(
outArgs
.
getSlotNum
())]
return
[
__arguments_to_numpy__
(
i
,
outArgs
)
for
i
in
xrange
(
outArgs
.
getSlotNum
())
]
swig_paddle
.
GradientMachine
.
forwardTest
=
forwardTest
...
...
@@ -167,7 +168,10 @@ def __monkeypatch_gradient_machine__():
swig_paddle
.
GradientMachine
.
__forwardBackward__
=
\
swig_paddle
.
GradientMachine
.
forwardBackward
def
forwardBackward
(
self
,
inArgs
,
outArgs
,
passType
,
def
forwardBackward
(
self
,
inArgs
,
outArgs
,
passType
,
callback
=
swig_paddle
.
UpdateCallback
()):
"""
GradientMachine forward backward.
...
...
@@ -315,9 +319,8 @@ class DataProviderWrapperConverter(object):
self
.
cols
+=
other
def
__call__
(
self
,
slot_idx
,
arg
):
mat
=
swig_paddle
.
Matrix
.
createSparse
(
len
(
self
.
indices
)
-
1
,
self
.
dim
,
len
(
self
.
cols
),
True
)
mat
=
swig_paddle
.
Matrix
.
createSparse
(
len
(
self
.
indices
)
-
1
,
self
.
dim
,
len
(
self
.
cols
),
True
)
assert
isinstance
(
mat
,
swig_paddle
.
Matrix
)
mat
.
sparseCopyFrom
(
self
.
indices
,
self
.
cols
)
self
.
putIntoArg
(
slot_idx
,
arg
,
mat
)
...
...
@@ -341,9 +344,8 @@ class DataProviderWrapperConverter(object):
self
.
values
+=
map
(
lambda
x
:
x
[
1
],
other
)
def
__call__
(
self
,
slot_idx
,
arg
):
mat
=
swig_paddle
.
Matrix
.
createSparse
(
len
(
self
.
indices
)
-
1
,
self
.
dim
,
len
(
self
.
cols
),
False
)
mat
=
swig_paddle
.
Matrix
.
createSparse
(
len
(
self
.
indices
)
-
1
,
self
.
dim
,
len
(
self
.
cols
),
False
)
assert
isinstance
(
mat
,
swig_paddle
.
Matrix
)
mat
.
sparseCopyFrom
(
self
.
indices
,
self
.
cols
,
self
.
values
)
self
.
putIntoArg
(
slot_idx
,
arg
,
mat
)
...
...
@@ -353,7 +355,8 @@ class DataProviderWrapperConverter(object):
paddle
.
trainer
.
PyDataProviderWrapper
.
IndexSlot
:
IdValueConverter
,
paddle
.
trainer
.
PyDataProviderWrapper
.
SparseNonValueSlot
:
SparseNonValueConverter
,
paddle
.
trainer
.
PyDataProviderWrapper
.
SparseValueSlot
:
SparseValueConverter
paddle
.
trainer
.
PyDataProviderWrapper
.
SparseValueSlot
:
SparseValueConverter
}
def
__init__
(
self
,
use_seq
,
header
):
...
...
@@ -381,9 +384,8 @@ class DataProviderWrapperConverter(object):
assert
isinstance
(
argument
,
swig_paddle
.
Arguments
)
argument
.
resize
(
len
(
self
.
__header__
))
values
=
map
(
lambda
x
:
DataProviderWrapperConverter
.
__SLOT_VALUE_CONVERTER_MAP__
[
x
.
__class__
](
x
),
values
=
map
(
lambda
x
:
DataProviderWrapperConverter
.
__SLOT_VALUE_CONVERTER_MAP__
[
x
.
__class__
](
x
),
self
.
__header__
)
if
self
.
__use_seq__
:
...
...
@@ -394,14 +396,13 @@ class DataProviderWrapperConverter(object):
for
slot_idx
,
sequence
in
enumerate
(
each_sample
):
for
raw_data
in
sequence
:
values
[
slot_idx
].
append
(
raw_data
)
seq_start_pos
[
slot_idx
].
append
(
seq_start_pos
[
slot_idx
][
-
1
]
+
len
(
sequence
))
seq_start_pos
[
slot_idx
].
append
(
seq_start_pos
[
slot_idx
][
-
1
]
+
len
(
sequence
))
seq_dim
[
slot_idx
].
append
(
len
(
sequence
))
for
slot_idx
in
xrange
(
len
(
self
.
__header__
)):
argument
.
setSlotSequenceDim
(
slot_idx
,
swig_paddle
.
IVector
.
create
(
seq_dim
[
slot_idx
]))
argument
.
setSlotSequenceDim
(
slot_idx
,
swig_paddle
.
IVector
.
create
(
seq_dim
[
slot_idx
]))
argument
.
setSlotSequenceStartPositions
(
slot_idx
,
swig_paddle
.
IVector
.
create
(
seq_start_pos
[
slot_idx
]))
...
...
@@ -422,7 +423,6 @@ class DataProviderWrapperConverter(object):
return
self
.
convert
(
wrapper_data
,
argument
)
def
__monkey_patch_protobuf_objects__
():
def
ParameterConfig_toProto
(
self
):
"""
...
...
@@ -459,8 +459,7 @@ def __monkey_patch_protobuf_objects__():
:return: paddle.OptimizationConfig
"""
assert
isinstance
(
protoObj
,
paddle
.
proto
.
OptimizationConfig
)
assert
isinstance
(
protoObj
,
paddle
.
proto
.
OptimizationConfig
)
return
swig_paddle
.
OptimizationConfig
.
createFromProtoString
(
protoObj
.
SerializeToString
())
...
...
@@ -475,8 +474,7 @@ def __monkey_patch_protobuf_objects__():
:param protoObj: proto.TrainerConfig
:return: paddle.TrainerConfig
"""
assert
isinstance
(
protoObj
,
paddle
.
proto
.
TrainerConfig
)
assert
isinstance
(
protoObj
,
paddle
.
proto
.
TrainerConfig
)
return
swig_paddle
.
TrainerConfig
.
createFromProtoString
(
protoObj
.
SerializeToString
())
...
...
@@ -537,6 +535,7 @@ def __monkey_patch_trainer__():
assert
isinstance
(
model
,
swig_paddle
.
GradientMachine
)
return
swig_paddle
.
Trainer
.
__create__
(
swig_paddle
.
TrainerConfig
.
createFromProto
(
config
),
model
)
swig_paddle
.
Trainer
.
create
=
staticmethod
(
Trainer_create
)
swig_paddle
.
Trainer
.
__getForwardOutput__
=
\
...
...
@@ -551,14 +550,19 @@ def __monkey_patch_trainer__():
numpy.ndarray.
"""
outArgs
=
self
.
__getForwardOutput__
()
return
[
__arguments_to_numpy__
(
i
,
outArgs
)
for
i
in
xrange
(
outArgs
.
getSlotNum
())]
return
[
__arguments_to_numpy__
(
i
,
outArgs
)
for
i
in
xrange
(
outArgs
.
getSlotNum
())
]
swig_paddle
.
Trainer
.
getForwardOutput
=
getForwardOutput
def
monkeypatches
():
patches
=
[
__monkeypatch_init_paddle__
,
__monkeypatch_gradient_machine__
,
__monkey_patch_protobuf_objects__
,
__monkey_patch_parameter__
,
__monkey_patch_trainer__
]
patches
=
[
__monkeypatch_init_paddle__
,
__monkeypatch_gradient_machine__
,
__monkey_patch_protobuf_objects__
,
__monkey_patch_parameter__
,
__monkey_patch_trainer__
]
for
patch
in
patches
:
patch
()
paddle/scripts/cluster_train/conf.py
浏览文件 @
319742c6
...
...
@@ -15,15 +15,12 @@
HOSTS
=
[
"root@192.168.100.17"
,
"root@192.168.100.18"
,
]
]
'''
workspace configuration
'''
#root dir for workspace, can be set as any director with real user account
ROOT_DIR
=
"/home/paddle"
'''
network configuration
'''
...
...
@@ -37,4 +34,4 @@ PADDLE_PORTS_NUM = 2
PADDLE_PORTS_NUM_FOR_SPARSE
=
2
#environments setting for all processes in cluster job
LD_LIBRARY_PATH
=
"/usr/local/cuda/lib64:/usr/lib64"
LD_LIBRARY_PATH
=
"/usr/local/cuda/lib64:/usr/lib64"
paddle/scripts/cluster_train/paddle.py
浏览文件 @
319742c6
...
...
@@ -12,8 +12,6 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
""" module for launching cluster job """
import
os
...
...
@@ -23,13 +21,13 @@ import copy
import
time
import
signal
from
fabric.api
import
run
,
put
,
settings
,
env
,
prefix
from
fabric.tasks
import
execute
#configuration for cluster
import
conf
def
refine_unknown_args
(
cmd_args
):
'''
refine unknown parameters to handle some special parameters
...
...
@@ -50,6 +48,7 @@ def refine_unknown_args(cmd_args):
new_args
.
append
(
arg
)
return
new_args
def
kill_process
():
'''
kill comments threads
...
...
@@ -60,6 +59,7 @@ def kill_process():
| awk '{print $2}'
\
| xargs kill > /dev/null 2>&1"
)
def
job_prepare
(
jobdir
,
data
=
None
):
'''
prepare job related workspace data
...
...
@@ -70,6 +70,7 @@ def job_prepare(jobdir, data=None):
This function just prepare all related model and other resources
needed at runtime.
'''
def
job_create_workspace
(
jobdir
,
data
=
None
):
'''
prepare job workspace, common file, etc.
...
...
@@ -96,6 +97,7 @@ def job_prepare(jobdir, data=None):
with
settings
(
warn_only
=
True
):
execute
(
kill_process
,
hosts
=
conf
.
HOSTS
)
def
job_pserver
(
jobdir
,
pids
=
None
):
'''
start all pservers
...
...
@@ -124,9 +126,8 @@ def job_pserver(jobdir, pids=None):
execute
(
start_pserver
,
jobdir
,
pargs
,
hosts
=
conf
.
HOSTS
)
def
job_trainer
(
jobdir
,
train_args_dict
,
pids
=
None
):
def
job_trainer
(
jobdir
,
train_args_dict
,
pids
=
None
):
'''
start paddle trainer
'''
...
...
@@ -171,9 +172,8 @@ def job_trainer(jobdir,
train_args
+=
" --trainer_id="
+
str
(
i
)
execute
(
start_trainer
,
jobdir
,
train_args
,
hosts
=
conf
.
HOSTS
[
i
])
def
job_all
(
job_package
,
jobdir
=
None
,
train_args_dict
=
None
):
def
job_all
(
job_package
,
jobdir
=
None
,
train_args_dict
=
None
):
'''
param job_package
param train_args_dict
...
...
@@ -187,36 +187,47 @@ def job_all(job_package,
job_trainer
(
jobdir
,
train_args_dict
)
job_clean
()
def
job_clean
():
'''
if starting job failed from paddle internal, the framework always
is launched successfully since these process are daemon processes.
so this job_clean can alway clean job rubbish process with ctrl+c.
'''
def
signal_handler
(
signal
,
frame
):
'''
SIGINT handler
'''
def
kill_process
():
run
(
"ps aux
\
| grep paddle_process_by_paddle
\
| grep -v grep
\
| awk '{print $2}'
\
| xargs kill > /dev/null 2>&1"
)
with
settings
(
warn_only
=
True
):
execute
(
kill_process
,
hosts
=
conf
.
HOSTS
)
signal
.
signal
(
signal
.
SIGINT
,
signal_handler
)
signal
.
pause
()
if
__name__
==
'__main__'
:
parser
=
argparse
.
ArgumentParser
(
prog
=
"paddle.py"
,
description
=
'simple tool for cluster training'
)
parser
.
add_argument
(
'-j'
,
'--job_workspace'
,
required
=
False
,
default
=
None
,
parser
=
argparse
.
ArgumentParser
(
prog
=
"paddle.py"
,
description
=
'simple tool for cluster training'
)
parser
.
add_argument
(
'-j'
,
'--job_workspace'
,
required
=
False
,
default
=
None
,
help
=
'job workspace'
)
parser
.
add_argument
(
'-p'
,
'--job_dispatch_package'
,
required
=
False
,
default
=
None
,
parser
.
add_argument
(
'-p'
,
'--job_dispatch_package'
,
required
=
False
,
default
=
None
,
help
=
'job package for dispatching to all other nodes'
)
args
,
train_args_list
=
parser
.
parse_known_args
()
...
...
@@ -227,14 +238,10 @@ if __name__ == '__main__':
#if assigned workspace, do not need to dispatch data,
#so job_local_package should be None
assert
args
.
job_dispatch_package
is
None
job_all
(
None
,
args
.
job_workspace
,
train_args_dict
)
job_all
(
None
,
args
.
job_workspace
,
train_args_dict
)
elif
args
.
job_dispatch_package
is
not
None
:
assert
args
.
job_workspace
is
None
assert
os
.
path
.
isdir
(
args
.
job_dispatch_package
)
job_all
(
args
.
job_dispatch_package
,
None
,
train_args_dict
)
job_all
(
args
.
job_dispatch_package
,
None
,
train_args_dict
)
else
:
print
"--job_workspace or --job_dispatch_package should be set"
paddle/trainer/tests/__init__.py
浏览文件 @
319742c6
...
...
@@ -11,4 +11,3 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
paddle/trainer/tests/config_parser_test.py
浏览文件 @
319742c6
paddle/trainer/tests/gen_proto_data.py
浏览文件 @
319742c6
...
...
@@ -21,8 +21,7 @@ import logging
import
pprint
logging
.
basicConfig
(
format
=
'[%(levelname)s %(asctime)s %(filename)s:%(lineno)s] %(message)s'
,
)
format
=
'[%(levelname)s %(asctime)s %(filename)s:%(lineno)s] %(message)s'
,
)
logger
=
logging
.
getLogger
(
'paddle'
)
logger
.
setLevel
(
logging
.
INFO
)
...
...
@@ -36,33 +35,32 @@ num_original_columns = 3
# [[-1,0], [0,0]] means previous token at column 0 and current token at
# column 0 are combined as one feature.
patterns
=
[
[[
-
2
,
0
]],
[[
-
1
,
0
]],
[[
0
,
0
]],
[[
1
,
0
]],
[[
2
,
0
]],
[[
-
1
,
0
],
[
0
,
0
]],
[[
0
,
0
],
[
1
,
0
]],
[[
-
2
,
1
]],
[[
-
1
,
1
]],
[[
0
,
1
]],
[[
1
,
1
]],
[[
2
,
1
]],
[[
-
2
,
1
],
[
-
1
,
1
]],
[[
-
1
,
1
],
[
0
,
1
]],
[[
0
,
1
],
[
1
,
1
]],
[[
1
,
1
],
[
2
,
1
]],
[[
-
2
,
1
],
[
-
1
,
1
],
[
0
,
1
]],
[[
-
1
,
1
],
[
0
,
1
],
[
1
,
1
]],
[[
0
,
1
],
[
1
,
1
],
[
2
,
1
]],
[[
-
2
,
0
]],
[[
-
1
,
0
]],
[[
0
,
0
]],
[[
1
,
0
]],
[[
2
,
0
]],
[[
-
1
,
0
],
[
0
,
0
]],
[[
0
,
0
],
[
1
,
0
]],
[[
-
2
,
1
]],
[[
-
1
,
1
]],
[[
0
,
1
]],
[[
1
,
1
]],
[[
2
,
1
]],
[[
-
2
,
1
],
[
-
1
,
1
]],
[[
-
1
,
1
],
[
0
,
1
]],
[[
0
,
1
],
[
1
,
1
]],
[[
1
,
1
],
[
2
,
1
]],
[[
-
2
,
1
],
[
-
1
,
1
],
[
0
,
1
]],
[[
-
1
,
1
],
[
0
,
1
],
[
1
,
1
]],
[[
0
,
1
],
[
1
,
1
],
[
2
,
1
]],
]
def
make_features
(
sequence
):
length
=
len
(
sequence
)
num_features
=
len
(
sequence
[
0
])
def
get_features
(
pos
):
if
pos
<
0
:
return
[
'#B%s'
%
-
pos
]
*
num_features
...
...
@@ -72,9 +70,10 @@ def make_features(sequence):
for
i
in
xrange
(
length
):
for
pattern
in
patterns
:
fname
=
'/'
.
join
([
get_features
(
i
+
pos
)[
f
]
for
pos
,
f
in
pattern
])
fname
=
'/'
.
join
([
get_features
(
i
+
pos
)[
f
]
for
pos
,
f
in
pattern
])
sequence
[
i
].
append
(
fname
)
'''
Source file format:
Each line is for one timestep. The features are separated by space.
...
...
@@ -87,6 +86,8 @@ i-th column.
return a list of dict for each column
'''
def
create_dictionaries
(
filename
,
cutoff
,
oov_policy
):
def
add_to_dict
(
sequence
,
dicts
):
num_features
=
len
(
dicts
)
...
...
@@ -118,7 +119,6 @@ def create_dictionaries(filename, cutoff, oov_policy):
features
=
line
.
split
(
' '
)
sequence
.
append
(
features
)
for
i
in
xrange
(
num_features
):
dct
=
dicts
[
i
]
n
=
1
if
oov_policy
[
i
]
==
OOV_POLICY_USE
else
0
...
...
@@ -161,12 +161,9 @@ existed in dicts[i] will be assigned to id 0.
if oov_policy[i] == OOV_POLICY_ERROR, all features in i-th column MUST exist
in dicts[i].
'''
def
gen_proto_file
(
input_file
,
dicts
,
oov_policy
,
output_file
):
def
gen_proto_file
(
input_file
,
dicts
,
oov_policy
,
output_file
):
def
write_sequence
(
out
,
sequence
):
num_features
=
len
(
dicts
)
is_beginning
=
True
...
...
@@ -213,8 +210,8 @@ def gen_proto_file(
if
patterns
:
slot_def
=
header
.
slot_defs
.
add
()
slot_def
.
type
=
DataFormat
.
SlotDef
.
VECTOR_SPARSE_NON_VALUE
slot_def
.
dim
=
sum
(
[
len
(
dicts
[
i
])
for
i
in
xrange
(
num_original_columns
,
len
(
dicts
))])
slot_def
.
dim
=
sum
(
[
len
(
dicts
[
i
])
for
i
in
xrange
(
num_original_columns
,
len
(
dicts
))])
logger
.
info
(
"feature_dim=%s"
%
slot_def
.
dim
)
for
i
in
xrange
(
num_original_columns
):
...
...
@@ -242,6 +239,7 @@ def gen_proto_file(
logger
.
info
(
"num_sequences=%s"
%
num_sequences
)
dict2
=
{
'B-ADJP'
:
0
,
'I-ADJP'
:
1
,
...
...
@@ -273,16 +271,9 @@ if __name__ == '__main__':
cutoff
+=
[
3
]
*
len
(
patterns
)
oov_policy
=
[
OOV_POLICY_IGNORE
,
OOV_POLICY_ERROR
,
OOV_POLICY_ERROR
]
oov_policy
+=
[
OOV_POLICY_IGNORE
]
*
len
(
patterns
)
dicts
=
create_dictionaries
(
'trainer/tests/train.txt'
,
cutoff
,
oov_policy
)
dicts
=
create_dictionaries
(
'trainer/tests/train.txt'
,
cutoff
,
oov_policy
)
dicts
[
2
]
=
dict2
gen_proto_file
(
'trainer/tests/train.txt'
,
dicts
,
oov_policy
,
gen_proto_file
(
'trainer/tests/train.txt'
,
dicts
,
oov_policy
,
'trainer/tests/train_proto.bin'
)
gen_proto_file
(
'trainer/tests/test.txt'
,
dicts
,
oov_policy
,
gen_proto_file
(
'trainer/tests/test.txt'
,
dicts
,
oov_policy
,
'trainer/tests/test_proto.bin'
)
paddle/trainer/tests/testPyDataWrapper.py
浏览文件 @
319742c6
...
...
@@ -21,7 +21,10 @@ import json
import
string
@
provider
(
slots
=
[
SparseNonValueSlot
(
10
),
DenseSlot
(
2
),
SparseValueSlot
(
10
),
StringSlot
(
1
),
IndexSlot
(
3
)])
@
provider
(
slots
=
[
SparseNonValueSlot
(
10
),
DenseSlot
(
2
),
SparseValueSlot
(
10
),
StringSlot
(
1
),
IndexSlot
(
3
)
])
def
processNonSequenceData
(
obj
,
filename
):
with
open
(
filename
,
"rb"
)
as
f
:
for
line
in
f
:
...
...
@@ -50,6 +53,7 @@ val_randomer = lambda: random.uniform(-1.0, 1.0)
seq_count_randomer
=
lambda
:
random
.
randrange
(
1
,
SEQUENCE_LIMIT
)
str_count_randomer
=
lambda
:
random
.
randrange
(
1
,
STRING_LIMIT
)
class
IDRandomer
():
# A random generator, return unique id
def
__init__
(
self
):
self
.
id_set
=
set
()
...
...
@@ -61,38 +65,57 @@ class IDRandomer(): # A random generator, return unique id
return
idx
else
:
return
self
.
__call__
()
# SparseValueSlot
def
sparse_value_creator
(
_
):
rand
=
IDRandomer
()
return
[(
rand
(),
val_randomer
())
for
_
in
xrange
(
sparse_count_randomer
())]
sparse_value
=
map
(
sparse_value_creator
,
range
(
seq_count_randomer
()))
# DenseSlot
def
dense_creator
(
_
):
return
[
val_randomer
()
for
_
in
xrange
(
SPARSE_ID_LIMIT
)]
dense
=
map
(
dense_creator
,
range
(
seq_count_randomer
()))
# SparseNonValueSlot
def
sparse_creator
(
_
):
rand
=
IDRandomer
()
return
[
rand
()
for
_
in
xrange
(
sparse_count_randomer
())]
sparse_nonvalue
=
map
(
sparse_creator
,
range
(
seq_count_randomer
()))
# IndexSlot
ids
=
[
sparse_id_randomer
()
for
_
in
range
(
seq_count_randomer
())]
# StringSlot
def
random_str
(
size
=
8
,
chars
=
string
.
ascii_letters
+
string
.
digits
):
def
random_str
(
size
=
8
,
chars
=
string
.
ascii_letters
+
string
.
digits
):
return
''
.
join
(
random
.
choice
(
chars
)
for
_
in
range
(
size
))
strs
=
[
random_str
(
str_count_randomer
())
for
_
in
range
(
seq_count_randomer
())]
def
processSeqAndGenerateDataInit
(
obj
,
*
args
,
**
kwargs
):
obj
.
json_filename
=
kwargs
.
get
(
"load_data_args"
,
"test_data.json"
)
@
provider
(
slots
=
[
SparseValueSlot
(
SPARSE_ID_LIMIT
),
DenseSlot
(
SPARSE_ID_LIMIT
),
@
provider
(
slots
=
[
SparseValueSlot
(
SPARSE_ID_LIMIT
),
DenseSlot
(
SPARSE_ID_LIMIT
),
SparseNonValueSlot
(
SPARSE_ID_LIMIT
),
IndexSlot
(
SPARSE_ID_LIMIT
),
StringSlot
(
SPARSE_ID_LIMIT
)],
use_seq
=
True
,
init_hook
=
processSeqAndGenerateDataInit
)
StringSlot
(
SPARSE_ID_LIMIT
)
],
use_seq
=
True
,
init_hook
=
processSeqAndGenerateDataInit
)
def
processSeqAndGenerateData
(
obj
,
name
):
retv
=
[
sparse_value
,
dense
,
sparse_nonvalue
,
ids
,
strs
]
# Write to protoseq.
...
...
@@ -104,10 +127,15 @@ def processSeqAndGenerateData(obj, name):
def
processSubSeqAndGenerateDataInit
(
obj
,
*
args
,
**
kwargs
):
obj
.
json_filename
=
kwargs
.
get
(
"load_data_args"
,
"test_data.json"
)
@
provider
(
slots
=
[
SparseValueSlot
(
SPARSE_ID_LIMIT
),
DenseSlot
(
SPARSE_ID_LIMIT
),
@
provider
(
slots
=
[
SparseValueSlot
(
SPARSE_ID_LIMIT
),
DenseSlot
(
SPARSE_ID_LIMIT
),
SparseNonValueSlot
(
SPARSE_ID_LIMIT
),
IndexSlot
(
SPARSE_ID_LIMIT
),
StringSlot
(
SPARSE_ID_LIMIT
)],
use_seq
=
True
,
init_hook
=
processSubSeqAndGenerateDataInit
)
StringSlot
(
SPARSE_ID_LIMIT
)
],
use_seq
=
True
,
init_hook
=
processSubSeqAndGenerateDataInit
)
def
processSubSeqAndGenerateData
(
obj
,
name
):
retv_json
=
[
sparse_value
,
dense
,
sparse_nonvalue
,
ids
,
strs
]
retv_wrapper
=
[[
sparse_value
],
[
dense
],
[
sparse_nonvalue
],
[
ids
],
[
strs
]]
...
...
@@ -116,6 +144,7 @@ def processSubSeqAndGenerateData(obj, name):
json
.
dump
(
retv_json
,
f
)
yield
retv_wrapper
if
__name__
==
"__main__"
:
pvd
=
processNonSequenceData
(
"test.txt"
)
print
pvd
.
getNextBatch
(
100
)
...
...
paddle/utils/enable_virtualenv.py
浏览文件 @
319742c6
import
os
def
__activate_virtual_env__
():
__path__
=
os
.
getenv
(
'VIRTUAL_ENV'
)
if
__path__
is
None
:
...
...
@@ -7,4 +8,5 @@ def __activate_virtual_env__():
__script__
=
os
.
path
.
join
(
__path__
,
'bin'
,
'activate_this.py'
)
execfile
(
__script__
,
{
'__file__'
:
__script__
})
__activate_virtual_env__
()
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录