Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
hapi
提交
3dd26cff
H
hapi
项目概览
PaddlePaddle
/
hapi
通知
11
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
4
列表
看板
标记
里程碑
合并请求
7
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
H
hapi
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
4
Issue
4
列表
看板
标记
里程碑
合并请求
7
合并请求
7
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
3dd26cff
编写于
4月 28, 2020
作者:
Q
qingqing01
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add doc and unit testing
上级
d9a42a7d
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
255 addition
and
152 deletion
+255
-152
hapi/callbacks.py
hapi/callbacks.py
+10
-11
hapi/loss.py
hapi/loss.py
+2
-2
hapi/model.py
hapi/model.py
+42
-33
hapi/tests/test_model.py
hapi/tests/test_model.py
+201
-106
未找到文件。
hapi/callbacks.py
浏览文件 @
3dd26cff
...
@@ -185,6 +185,9 @@ class ProgBarLogger(Callback):
...
@@ -185,6 +185,9 @@ class ProgBarLogger(Callback):
self
.
verbose
=
verbose
self
.
verbose
=
verbose
self
.
log_freq
=
log_freq
self
.
log_freq
=
log_freq
def
_is_print
(
self
):
return
self
.
verbose
and
ParallelEnv
().
local_rank
==
0
def
on_train_begin
(
self
,
logs
=
None
):
def
on_train_begin
(
self
,
logs
=
None
):
self
.
epochs
=
self
.
params
[
'epochs'
]
self
.
epochs
=
self
.
params
[
'epochs'
]
assert
self
.
epochs
assert
self
.
epochs
...
@@ -195,7 +198,7 @@ class ProgBarLogger(Callback):
...
@@ -195,7 +198,7 @@ class ProgBarLogger(Callback):
self
.
steps
=
self
.
params
[
'steps'
]
self
.
steps
=
self
.
params
[
'steps'
]
self
.
epoch
=
epoch
self
.
epoch
=
epoch
self
.
train_step
=
0
self
.
train_step
=
0
if
self
.
verbose
and
self
.
epochs
and
ParallelEnv
().
local_rank
==
0
:
if
self
.
epochs
and
self
.
_is_print
()
:
print
(
'Epoch %d/%d'
%
(
epoch
+
1
,
self
.
epochs
))
print
(
'Epoch %d/%d'
%
(
epoch
+
1
,
self
.
epochs
))
self
.
train_progbar
=
ProgressBar
(
num
=
self
.
steps
,
verbose
=
self
.
verbose
)
self
.
train_progbar
=
ProgressBar
(
num
=
self
.
steps
,
verbose
=
self
.
verbose
)
...
@@ -213,15 +216,13 @@ class ProgBarLogger(Callback):
...
@@ -213,15 +216,13 @@ class ProgBarLogger(Callback):
logs
=
logs
or
{}
logs
=
logs
or
{}
self
.
train_step
+=
1
self
.
train_step
+=
1
if
self
.
train_step
%
self
.
log_freq
==
0
and
self
.
verbose
and
ParallelEnv
(
if
self
.
_is_print
()
and
self
.
train_step
%
self
.
log_freq
==
0
:
).
local_rank
==
0
:
if
self
.
steps
is
None
or
self
.
train_step
<
self
.
steps
:
if
self
.
steps
is
None
or
self
.
train_step
<
self
.
steps
:
self
.
_updates
(
logs
,
'train'
)
self
.
_updates
(
logs
,
'train'
)
def
on_epoch_end
(
self
,
epoch
,
logs
=
None
):
def
on_epoch_end
(
self
,
epoch
,
logs
=
None
):
logs
=
logs
or
{}
logs
=
logs
or
{}
if
self
.
train_step
%
self
.
log_freq
!=
0
and
self
.
verbose
and
ParallelEnv
(
if
self
.
_is_print
()
and
(
self
.
steps
is
not
None
):
).
local_rank
==
0
:
self
.
_updates
(
logs
,
'train'
)
self
.
_updates
(
logs
,
'train'
)
def
on_eval_begin
(
self
,
logs
=
None
):
def
on_eval_begin
(
self
,
logs
=
None
):
...
@@ -231,7 +232,7 @@ class ProgBarLogger(Callback):
...
@@ -231,7 +232,7 @@ class ProgBarLogger(Callback):
self
.
evaled_samples
=
0
self
.
evaled_samples
=
0
self
.
eval_progbar
=
ProgressBar
(
self
.
eval_progbar
=
ProgressBar
(
num
=
self
.
eval_steps
,
verbose
=
self
.
verbose
)
num
=
self
.
eval_steps
,
verbose
=
self
.
verbose
)
if
ParallelEnv
().
local_rank
==
0
:
if
self
.
_is_print
()
:
print
(
'Eval begin...'
)
print
(
'Eval begin...'
)
def
on_eval_batch_end
(
self
,
step
,
logs
=
None
):
def
on_eval_batch_end
(
self
,
step
,
logs
=
None
):
...
@@ -240,16 +241,14 @@ class ProgBarLogger(Callback):
...
@@ -240,16 +241,14 @@ class ProgBarLogger(Callback):
samples
=
logs
.
get
(
'batch_size'
,
1
)
samples
=
logs
.
get
(
'batch_size'
,
1
)
self
.
evaled_samples
+=
samples
self
.
evaled_samples
+=
samples
if
self
.
eval_step
%
self
.
log_freq
==
0
and
self
.
verbose
and
ParallelEnv
(
if
self
.
_is_print
()
and
self
.
eval_step
%
self
.
log_freq
==
0
:
).
local_rank
==
0
:
if
self
.
eval_steps
is
None
or
self
.
eval_step
<
self
.
eval_steps
:
if
self
.
eval_steps
is
None
or
self
.
eval_step
<
self
.
eval_steps
:
self
.
_updates
(
logs
,
'eval'
)
self
.
_updates
(
logs
,
'eval'
)
def
on_eval_end
(
self
,
logs
=
None
):
def
on_eval_end
(
self
,
logs
=
None
):
logs
=
logs
or
{}
logs
=
logs
or
{}
if
self
.
verbose
and
ParallelEnv
().
local_rank
==
0
:
if
self
.
_is_print
()
and
(
self
.
steps
is
not
None
):
if
self
.
eval_step
%
self
.
log_freq
!=
0
:
self
.
_updates
(
logs
,
'eval'
)
self
.
_updates
(
logs
,
'eval'
)
print
(
'Eval samples: %d'
%
(
self
.
evaled_samples
))
print
(
'Eval samples: %d'
%
(
self
.
evaled_samples
))
...
...
hapi/loss.py
浏览文件 @
3dd26cff
...
@@ -66,7 +66,7 @@ class CrossEntropy(Loss):
...
@@ -66,7 +66,7 @@ class CrossEntropy(Loss):
"""
"""
def
__init__
(
self
,
average
=
True
):
def
__init__
(
self
,
average
=
True
):
super
(
CrossEntropy
,
self
).
__init__
()
super
(
CrossEntropy
,
self
).
__init__
(
average
)
def
forward
(
self
,
outputs
,
labels
):
def
forward
(
self
,
outputs
,
labels
):
return
[
return
[
...
@@ -88,7 +88,7 @@ class SoftmaxWithCrossEntropy(Loss):
...
@@ -88,7 +88,7 @@ class SoftmaxWithCrossEntropy(Loss):
"""
"""
def
__init__
(
self
,
average
=
True
):
def
__init__
(
self
,
average
=
True
):
super
(
SoftmaxWithCrossEntropy
,
self
).
__init__
()
super
(
SoftmaxWithCrossEntropy
,
self
).
__init__
(
average
)
def
forward
(
self
,
outputs
,
labels
):
def
forward
(
self
,
outputs
,
labels
):
return
[
return
[
...
...
hapi/model.py
浏览文件 @
3dd26cff
...
@@ -653,28 +653,30 @@ class Model(fluid.dygraph.Layer):
...
@@ -653,28 +653,30 @@ class Model(fluid.dygraph.Layer):
import paddle
import paddle
import paddle.fluid as fluid
import paddle.fluid as fluid
#import paddle.incubate.hapi as hapi
#import paddle.incubate.hapi as hapi
import hapi as hapi
from hapi import Model, Input, set_device
from hapi.loss import CrossEntropy
from hapi.dataset import MNIST
class MyModel(
hapi.model.
Model):
class MyModel(Model):
def __init__(self):
def __init__(self):
super(MyModel, self).__init__()
super(MyModel, self).__init__()
self._fc = fluid.dygraph.Linear(784, 10, act='softmax')
self._fc = fluid.dygraph.Linear(784, 10, act='softmax')
def forward(self, x):
def forward(self, x):
y = self._fc(x)
y = self._fc(x)
return y
return y
device =
hapi.model.
set_device('gpu')
device = set_device('gpu')
# if use static graph, do not set
# if use static graph, do not set
fluid.enable_dygraph(device)
fluid.enable_dygraph(device)
model = MyModel()
model = MyModel()
optim = fluid.optimizer.SGD(learning_rate=1e-3,
optim = fluid.optimizer.SGD(learning_rate=1e-3,
parameter_list=model.parameters())
parameter_list=model.parameters())
inputs = [
hapi.model.
Input([None, 784], 'float32', name='x')]
inputs = [Input([None, 784], 'float32', name='x')]
labels = [
hapi.model.
Input([None, 1], 'int64', name='label')]
labels = [Input([None, 1], 'int64', name='label')]
mnist_data =
hapi.datasets.
MNIST(mode='train')
mnist_data = MNIST(mode='train')
model.prepare(optim,
model.prepare(optim,
hapi.model.CrossEntropy(
),
CrossEntropy(average=True
),
hapi.metrics.Accuracy(),
hapi.metrics.Accuracy(),
inputs,
inputs,
labels,
labels,
...
@@ -721,9 +723,9 @@ class Model(fluid.dygraph.Layer):
...
@@ -721,9 +723,9 @@ class Model(fluid.dygraph.Layer):
import numpy as np
import numpy as np
import paddle.fluid as fluid
import paddle.fluid as fluid
import paddle.incubate.hapi as hapi
from hapi import Model, Input, set_device
class MyModel(
hapi.
Model):
class MyModel(Model):
def __init__(self):
def __init__(self):
super(MyModel, self).__init__()
super(MyModel, self).__init__()
self._fc = Linear(784, 1, act='softmax')
self._fc = Linear(784, 1, act='softmax')
...
@@ -738,10 +740,10 @@ class Model(fluid.dygraph.Layer):
...
@@ -738,10 +740,10 @@ class Model(fluid.dygraph.Layer):
optim = fluid.optimizer.SGD(learning_rate=1e-3,
optim = fluid.optimizer.SGD(learning_rate=1e-3,
parameter_list=model.parameters())
parameter_list=model.parameters())
inputs = [
hapi.model.
Input([None, 784], 'float32', name='x')]
inputs = [Input([None, 784], 'float32', name='x')]
labels = [
hapi.model.
Input([None, 1], 'int64', name='label')]
labels = [Input([None, 1], 'int64', name='label')]
model.prepare(optim,
model.prepare(optim,
hapi.model.CrossEntropy(
),
CrossEntropy(average=True
),
inputs=inputs,
inputs=inputs,
labels=labels,
labels=labels,
device=device)
device=device)
...
@@ -750,7 +752,7 @@ class Model(fluid.dygraph.Layer):
...
@@ -750,7 +752,7 @@ class Model(fluid.dygraph.Layer):
loss = model.train_batch([data], [label])
loss = model.train_batch([data], [label])
print(loss)
print(loss)
"""
"""
return
self
.
_adapter
.
train_batch
(
*
args
,
**
kwarg
s
)
return
self
.
_adapter
.
train_batch
(
inputs
,
label
s
)
def
eval_batch
(
self
,
inputs
,
labels
=
None
):
def
eval_batch
(
self
,
inputs
,
labels
=
None
):
"""
"""
...
@@ -773,9 +775,9 @@ class Model(fluid.dygraph.Layer):
...
@@ -773,9 +775,9 @@ class Model(fluid.dygraph.Layer):
import numpy as np
import numpy as np
import paddle.fluid as fluid
import paddle.fluid as fluid
import paddle.incubate.hapi as hapi
from hapi import Model, Input, set_device
class MyModel(
hapi.model.
Model):
class MyModel(Model):
def __init__(self):
def __init__(self):
super(MyModel, self).__init__()
super(MyModel, self).__init__()
self._fc = fluid.dygraph.Linear(784, 1, act='softmax')
self._fc = fluid.dygraph.Linear(784, 1, act='softmax')
...
@@ -783,17 +785,17 @@ class Model(fluid.dygraph.Layer):
...
@@ -783,17 +785,17 @@ class Model(fluid.dygraph.Layer):
y = self._fc(x)
y = self._fc(x)
return y
return y
device =
hapi.model.
set_device('gpu')
device = set_device('gpu')
fluid.enable_dygraph(device)
fluid.enable_dygraph(device)
model = MyModel()
model = MyModel()
optim = fluid.optimizer.SGD(learning_rate=1e-3,
optim = fluid.optimizer.SGD(learning_rate=1e-3,
parameter_list=model.parameters())
parameter_list=model.parameters())
inputs = [
hapi.model.
Input([None, 784], 'float32', name='x')]
inputs = [Input([None, 784], 'float32', name='x')]
labels = [
hapi.model.
Input([None, 1], 'int64', name='label')]
labels = [Input([None, 1], 'int64', name='label')]
model.prepare(optim,
model.prepare(optim,
hapi.model.CrossEntropy(
),
CrossEntropy(average=True
),
inputs=inputs,
inputs=inputs,
labels=labels,
labels=labels,
device=device)
device=device)
...
@@ -802,7 +804,7 @@ class Model(fluid.dygraph.Layer):
...
@@ -802,7 +804,7 @@ class Model(fluid.dygraph.Layer):
loss = model.eval_batch([data], [label])
loss = model.eval_batch([data], [label])
print(loss)
print(loss)
"""
"""
return
self
.
_adapter
.
eval_batch
(
*
args
,
**
kwarg
s
)
return
self
.
_adapter
.
eval_batch
(
inputs
,
label
s
)
def
test_batch
(
self
,
inputs
):
def
test_batch
(
self
,
inputs
):
"""
"""
...
@@ -822,9 +824,9 @@ class Model(fluid.dygraph.Layer):
...
@@ -822,9 +824,9 @@ class Model(fluid.dygraph.Layer):
import numpy as np
import numpy as np
import paddle.fluid as fluid
import paddle.fluid as fluid
import paddle.incubate.hapi as hapi
from hapi import Model, Input, set_device
class MyModel(
hapi.model.
Model):
class MyModel(Model):
def __init__(self):
def __init__(self):
super(MyModel, self).__init__()
super(MyModel, self).__init__()
self._fc = fluid.dygraph.Linear(784, 1, act='softmax')
self._fc = fluid.dygraph.Linear(784, 1, act='softmax')
...
@@ -832,18 +834,18 @@ class Model(fluid.dygraph.Layer):
...
@@ -832,18 +834,18 @@ class Model(fluid.dygraph.Layer):
y = self._fc(x)
y = self._fc(x)
return y
return y
device =
hapi.model.
set_device('gpu')
device = set_device('gpu')
fluid.enable_dygraph(device)
fluid.enable_dygraph(device)
model = MyModel()
model = MyModel()
inputs = [
hapi.model.
Input([None, 784], 'float32', name='x')]
inputs = [Input([None, 784], 'float32', name='x')]
model.prepare(inputs=inputs,
model.prepare(inputs=inputs,
device=device)
device=device)
data = np.random.random(size=(4,784)).astype(np.float32)
data = np.random.random(size=(4,784)).astype(np.float32)
out = model.eval_batch([data])
out = model.eval_batch([data])
print(out)
print(out)
"""
"""
return
self
.
_adapter
.
test_batch
(
*
args
,
**
kwarg
s
)
return
self
.
_adapter
.
test_batch
(
input
s
)
def
save
(
self
,
path
):
def
save
(
self
,
path
):
"""
"""
...
@@ -872,9 +874,9 @@ class Model(fluid.dygraph.Layer):
...
@@ -872,9 +874,9 @@ class Model(fluid.dygraph.Layer):
.. code-block:: python
.. code-block:: python
import paddle.fluid as fluid
import paddle.fluid as fluid
import hapi as hapi
from hapi import Model, set_device
class MyModel(
hapi.model.
Model):
class MyModel(Model):
def __init__(self):
def __init__(self):
super(MyModel, self).__init__()
super(MyModel, self).__init__()
self._fc = fluid.dygraph.Linear(784, 1, act='softmax')
self._fc = fluid.dygraph.Linear(784, 1, act='softmax')
...
@@ -882,13 +884,13 @@ class Model(fluid.dygraph.Layer):
...
@@ -882,13 +884,13 @@ class Model(fluid.dygraph.Layer):
y = self._fc(x)
y = self._fc(x)
return y
return y
device =
hapi.model.
set_device('cpu')
device = set_device('cpu')
fluid.enable_dygraph(device)
fluid.enable_dygraph(device)
model = MyModel()
model = MyModel()
model.save('checkpoint/test')
model.save('checkpoint/test')
"""
"""
if
ParallelEnv
().
local_rank
==
0
:
if
ParallelEnv
().
local_rank
==
0
:
return
self
.
_adapter
.
save
(
path
)
self
.
_adapter
.
save
(
path
)
def
load
(
self
,
path
,
skip_mismatch
=
False
,
reset_optimizer
=
False
):
def
load
(
self
,
path
,
skip_mismatch
=
False
,
reset_optimizer
=
False
):
"""
"""
...
@@ -924,9 +926,9 @@ class Model(fluid.dygraph.Layer):
...
@@ -924,9 +926,9 @@ class Model(fluid.dygraph.Layer):
.. code-block:: python
.. code-block:: python
import paddle.fluid as fluid
import paddle.fluid as fluid
import hapi as hapi
from hapi import Model, set_device
class MyModel(
hapi.model.
Model):
class MyModel(Model):
def __init__(self):
def __init__(self):
super(MyModel, self).__init__()
super(MyModel, self).__init__()
self._fc = fluid.dygraph.Linear(784, 1, act='softmax')
self._fc = fluid.dygraph.Linear(784, 1, act='softmax')
...
@@ -934,7 +936,7 @@ class Model(fluid.dygraph.Layer):
...
@@ -934,7 +936,7 @@ class Model(fluid.dygraph.Layer):
y = self._fc(x)
y = self._fc(x)
return y
return y
device =
hapi.model.
set_device('cpu')
device = set_device('cpu')
fluid.enable_dygraph(device)
fluid.enable_dygraph(device)
model = MyModel()
model = MyModel()
model.load('checkpoint/test')
model.load('checkpoint/test')
...
@@ -987,7 +989,14 @@ class Model(fluid.dygraph.Layer):
...
@@ -987,7 +989,14 @@ class Model(fluid.dygraph.Layer):
return
self
.
_adapter
.
load
(
matched_param_state
,
optim_state
)
return
self
.
_adapter
.
load
(
matched_param_state
,
optim_state
)
def
parameters
(
self
,
*
args
,
**
kwargs
):
def
parameters
(
self
,
*
args
,
**
kwargs
):
return
self
.
_adapter
.
parameters
(
*
args
,
**
kwargs
)
"""
Returns a list of parameters of the model.
Returns:
list of :ref:`api_guide_Variable_en` : a list of parameters.
"""
return
self
.
_adapter
.
parameters
()
def
prepare
(
self
,
def
prepare
(
self
,
optimizer
=
None
,
optimizer
=
None
,
...
...
hapi/tests/test_model.py
浏览文件 @
3dd26cff
...
@@ -17,34 +17,25 @@ from __future__ import print_function
...
@@ -17,34 +17,25 @@ from __future__ import print_function
import
unittest
import
unittest
import
os
import
cv2
import
numpy
as
np
import
numpy
as
np
import
shutil
import
tempfile
import
paddle
import
paddle
from
paddle
import
fluid
from
paddle
import
fluid
from
paddle.fluid.dygraph.nn
import
Conv2D
,
Pool2D
,
Linear
from
paddle.fluid.dygraph.nn
import
Conv2D
,
Pool2D
,
Linear
from
paddle.fluid.dygraph.container
import
Sequential
from
paddle.fluid.dygraph.container
import
Sequential
from
paddle.io
import
BatchSampler
,
DataLoader
from
paddle.io
import
DataLoader
from
paddle.fluid.dygraph.base
import
to_variable
from
hapi.model
import
Model
,
Input
,
set_device
from
hapi.model
import
Model
,
Input
,
set_device
from
hapi.loss
import
Loss
from
hapi.loss
import
CrossEntropy
from
hapi.metrics
import
Accuracy
from
hapi.metrics
import
Accuracy
from
hapi.datasets
import
MNIST
from
hapi.datasets
import
MNIST
from
hapi.vision.models
import
LeNet
from
hapi.vision.models
import
LeNet
from
hapi.download
import
get_weights_path_from_url
class
LeNetDygraph
(
fluid
.
dygraph
.
Layer
):
class
LeNetDygraph
(
fluid
.
dygraph
.
Layer
):
"""LeNet model from
`"LeCun Y, Bottou L, Bengio Y, et al. Gradient-based learning applied to document recognition[J]. Proceedings of the IEEE, 1998, 86(11): 2278-2324.`_
Args:
num_classes (int): output dim of last fc layer. If num_classes <=0, last fc layer
will not be defined. Default: 10.
classifier_activation (str): activation for the last fc layer. Default: 'softmax'.
"""
def
__init__
(
self
,
num_classes
=
10
,
classifier_activation
=
'softmax'
):
def
__init__
(
self
,
num_classes
=
10
,
classifier_activation
=
'softmax'
):
super
(
LeNetDygraph
,
self
).
__init__
()
super
(
LeNetDygraph
,
self
).
__init__
()
self
.
num_classes
=
num_classes
self
.
num_classes
=
num_classes
...
@@ -73,9 +64,12 @@ class LeNetDygraph(fluid.dygraph.Layer):
...
@@ -73,9 +64,12 @@ class LeNetDygraph(fluid.dygraph.Layer):
class
MnistDataset
(
MNIST
):
class
MnistDataset
(
MNIST
):
def
__init__
(
self
,
mode
,
return_label
=
True
):
def
__init__
(
self
,
mode
,
return_label
=
True
,
sample_num
=
None
):
super
(
MnistDataset
,
self
).
__init__
(
mode
=
mode
)
super
(
MnistDataset
,
self
).
__init__
(
mode
=
mode
)
self
.
return_label
=
return_label
self
.
return_label
=
return_label
if
sample_num
:
self
.
images
=
self
.
images
[:
sample_num
]
self
.
labels
=
self
.
labels
[:
sample_num
]
def
__getitem__
(
self
,
idx
):
def
__getitem__
(
self
,
idx
):
img
=
np
.
reshape
(
self
.
images
[
idx
],
[
1
,
28
,
28
])
img
=
np
.
reshape
(
self
.
images
[
idx
],
[
1
,
28
,
28
])
...
@@ -87,15 +81,14 @@ class MnistDataset(MNIST):
...
@@ -87,15 +81,14 @@ class MnistDataset(MNIST):
return
len
(
self
.
images
)
return
len
(
self
.
images
)
def
get_predict_accuracy
(
pred
,
gt
):
def
compute_acc
(
pred
,
label
):
pred
=
np
.
argmax
(
pred
,
-
1
)
pred
=
np
.
argmax
(
pred
,
-
1
)
gt
=
np
.
array
(
gt
)
label
=
np
.
array
(
label
)
correct
=
pred
[:,
np
.
newaxis
]
==
label
correct
=
pred
[:,
np
.
newaxis
]
==
gt
return
np
.
sum
(
correct
)
/
correct
.
shape
[
0
]
return
np
.
sum
(
correct
)
/
correct
.
shape
[
0
]
def
low_level_lenet_dygraph
_train
(
model
,
dataloader
):
def
dynamic
_train
(
model
,
dataloader
):
optim
=
fluid
.
optimizer
.
Adam
(
optim
=
fluid
.
optimizer
.
Adam
(
learning_rate
=
0.001
,
parameter_list
=
model
.
parameters
())
learning_rate
=
0.001
,
parameter_list
=
model
.
parameters
())
model
.
train
()
model
.
train
()
...
@@ -108,7 +101,7 @@ def low_level_lenet_dygraph_train(model, dataloader):
...
@@ -108,7 +101,7 @@ def low_level_lenet_dygraph_train(model, dataloader):
model
.
clear_gradients
()
model
.
clear_gradients
()
def
low_level_
dynamic_evaluate
(
model
,
dataloader
):
def
dynamic_evaluate
(
model
,
dataloader
):
with
fluid
.
dygraph
.
no_grad
():
with
fluid
.
dygraph
.
no_grad
():
model
.
eval
()
model
.
eval
()
cnt
=
0
cnt
=
0
...
@@ -121,108 +114,210 @@ def low_level_dynamic_evaluate(model, dataloader):
...
@@ -121,108 +114,210 @@ def low_level_dynamic_evaluate(model, dataloader):
return
cnt
/
len
(
dataloader
.
dataset
)
return
cnt
/
len
(
dataloader
.
dataset
)
class
TestEvaluatePredict
(
unittest
.
TestCase
):
class
TestModel
(
unittest
.
TestCase
):
def
setUp
(
self
):
@
classmethod
self
.
device
=
set_device
(
'gpu'
)
def
setUpClass
(
cls
):
self
.
train_dataset
=
MnistDataset
(
mode
=
'train'
)
cls
.
device
=
set_device
(
'gpu'
)
self
.
val_dataset
=
MnistDataset
(
mode
=
'test'
)
fluid
.
enable_dygraph
(
cls
.
device
)
self
.
test_dataset
=
MnistDataset
(
mode
=
'test'
,
return_label
=
False
)
fluid
.
enable_dygraph
(
self
.
device
)
sp_num
=
1280
train_dataloader
=
fluid
.
io
.
DataLoader
(
cls
.
train_dataset
=
MnistDataset
(
mode
=
'train'
,
sample_num
=
sp_num
)
self
.
train_dataset
,
places
=
self
.
device
,
batch_size
=
64
)
cls
.
val_dataset
=
MnistDataset
(
mode
=
'test'
,
sample_num
=
sp_num
)
val_dataloader
=
fluid
.
io
.
DataLoader
(
cls
.
test_dataset
=
MnistDataset
(
self
.
val_dataset
,
places
=
self
.
device
,
batch_size
=
64
)
mode
=
'test'
,
return_label
=
False
,
sample_num
=
sp_num
)
self
.
lenet_dygraph
=
LeNetDygraph
()
low_level_lenet_dygraph_train
(
self
.
lenet_dygraph
,
train_dataloader
)
self
.
acc1
=
low_level_dynamic_evaluate
(
self
.
lenet_dygraph
,
val_dataloader
)
def
evaluate
(
self
,
dynamic
):
cls
.
train_loader
=
fluid
.
io
.
DataLoader
(
fluid
.
enable_dygraph
(
self
.
device
)
if
dynamic
else
None
cls
.
train_dataset
,
places
=
cls
.
device
,
batch_size
=
64
)
cls
.
val_loader
=
fluid
.
io
.
DataLoader
(
cls
.
val_dataset
,
places
=
cls
.
device
,
batch_size
=
64
)
cls
.
test_loader
=
fluid
.
io
.
DataLoader
(
cls
.
test_dataset
,
places
=
cls
.
device
,
batch_size
=
64
)
inputs
=
[
Input
([
-
1
,
1
,
28
,
28
],
'float32'
,
name
=
'image'
)]
seed
=
333
labels
=
[
Input
([
None
,
1
],
'int64'
,
name
=
'label'
)]
fluid
.
default_startup_program
().
random_seed
=
seed
fluid
.
default_main_program
().
random_seed
=
seed
if
fluid
.
in_dygraph_mode
():
feed_list
=
None
else
:
feed_list
=
[
x
.
forward
()
for
x
in
inputs
+
labels
]
self
.
train_dataloader
=
fluid
.
io
.
DataLoader
(
self
.
train_dataset
,
places
=
self
.
device
,
batch_size
=
64
,
feed_list
=
feed_list
)
self
.
val_dataloader
=
fluid
.
io
.
DataLoader
(
self
.
val_dataset
,
places
=
self
.
device
,
batch_size
=
64
,
feed_list
=
feed_list
)
self
.
test_dataloader
=
fluid
.
io
.
DataLoader
(
self
.
test_dataset
,
places
=
self
.
device
,
batch_size
=
64
,
feed_list
=
feed_list
)
model
=
LeNet
()
dy_lenet
=
LeNetDygraph
()
model
.
load_dict
(
self
.
lenet_dygraph
.
state_dict
()
)
cls
.
init_param
=
dy_lenet
.
state_dict
(
)
model
.
prepare
(
metrics
=
Accuracy
(),
inputs
=
inputs
,
labels
=
labels
)
dynamic_train
(
dy_lenet
,
cls
.
train_loader
)
result
=
model
.
evaluate
(
self
.
val_dataloader
)
cls
.
trained_param
=
dy_lenet
.
state_dict
(
)
np
.
testing
.
assert_allclose
(
result
[
'acc'
],
self
.
acc1
)
cls
.
acc1
=
dynamic_evaluate
(
dy_lenet
,
cls
.
val_loader
)
cls
.
inputs
=
[
Input
([
-
1
,
1
,
28
,
28
],
'float32'
,
name
=
'image'
)]
cls
.
labels
=
[
Input
([
None
,
1
],
'int64'
,
name
=
'label'
)]
fluid
.
disable_dygraph
()
def
predict
(
self
,
dynamic
):
def
test_fit_dygraph
(
self
):
fluid
.
enable_dygraph
(
self
.
device
)
if
dynamic
else
None
self
.
fit
(
True
)
inputs
=
[
Input
([
-
1
,
1
,
28
,
28
],
'float32'
,
name
=
'image'
)]
def
test_fit_static
(
self
):
labels
=
[
Input
([
None
,
1
],
'int64'
,
name
=
'label'
)]
self
.
fit
(
False
)
if
fluid
.
in_dygraph_mode
():
feed_list
=
None
else
:
feed_list
=
[
x
.
forward
()
for
x
in
inputs
+
labels
]
self
.
train_dataloader
=
fluid
.
io
.
DataLoader
(
self
.
train_dataset
,
places
=
self
.
device
,
batch_size
=
64
,
feed_list
=
feed_list
)
self
.
val_dataloader
=
fluid
.
io
.
DataLoader
(
self
.
val_dataset
,
places
=
self
.
device
,
batch_size
=
64
,
feed_list
=
feed_list
)
self
.
test_dataloader
=
fluid
.
io
.
DataLoader
(
self
.
test_dataset
,
places
=
self
.
device
,
batch_size
=
64
,
feed_list
=
feed_list
)
model
=
LeNet
()
def
not_test_evaluate_dygraph
(
self
):
model
.
load_dict
(
self
.
lenet_dygraph
.
state_dict
())
self
.
evaluate
(
True
)
model
.
prepare
(
metrics
=
Accuracy
(),
inputs
=
inputs
,
labels
=
labels
)
output
=
model
.
predict
(
self
.
test_dataloader
,
stack_outputs
=
True
)
def
not_test_evaluate_static
(
self
):
self
.
evaluate
(
False
)
np
.
testing
.
assert_equal
(
output
[
0
].
shape
[
0
],
len
(
self
.
test_dataset
))
def
not_test_predict_dygraph
(
self
):
self
.
predict
(
True
)
acc
=
get_predict_accuracy
(
output
[
0
],
self
.
val_dataset
.
labels
)
def
not_test_predict_static
(
self
):
self
.
predict
(
False
)
np
.
testing
.
assert_allclose
(
acc
,
self
.
acc1
)
def
fit
(
self
,
dynamic
):
fluid
.
enable_dygraph
(
self
.
device
)
if
dynamic
else
None
def
test_evaluate_dygraph
(
self
):
seed
=
333
self
.
evaluate
(
True
)
fluid
.
default_startup_program
().
random_seed
=
seed
fluid
.
default_main_program
().
random_seed
=
seed
def
test_evaluate_static
(
self
):
model
=
LeNet
()
self
.
evaluate
(
False
)
optim_new
=
fluid
.
optimizer
.
Adam
(
learning_rate
=
0.001
,
parameter_list
=
model
.
parameters
())
model
.
prepare
(
optim_new
,
loss_function
=
CrossEntropy
(
average
=
False
),
metrics
=
Accuracy
(),
inputs
=
self
.
inputs
,
labels
=
self
.
labels
)
model
.
fit
(
self
.
train_dataset
,
batch_size
=
64
,
shuffle
=
False
)
result
=
model
.
evaluate
(
self
.
val_dataset
,
batch_size
=
64
)
np
.
testing
.
assert_allclose
(
result
[
'acc'
],
self
.
acc1
)
fluid
.
disable_dygraph
()
if
dynamic
else
None
def
test_predict_dygraph
(
self
):
def
evaluate
(
self
,
dynamic
):
self
.
predict
(
True
)
fluid
.
enable_dygraph
(
self
.
device
)
if
dynamic
else
None
model
=
LeNet
()
model
.
prepare
(
metrics
=
Accuracy
(),
inputs
=
self
.
inputs
,
labels
=
self
.
labels
)
model
.
load_dict
(
self
.
trained_param
)
result
=
model
.
evaluate
(
self
.
val_dataset
,
batch_size
=
64
)
np
.
testing
.
assert_allclose
(
result
[
'acc'
],
self
.
acc1
)
fluid
.
disable_dygraph
()
if
dynamic
else
None
def
test_predict_static
(
self
):
def
predict
(
self
,
dynamic
):
self
.
predict
(
False
)
fluid
.
enable_dygraph
(
self
.
device
)
if
dynamic
else
None
model
=
LeNet
()
model
.
prepare
(
inputs
=
self
.
inputs
)
model
.
load_dict
(
self
.
trained_param
)
output
=
model
.
predict
(
self
.
test_dataset
,
batch_size
=
64
,
stack_outputs
=
True
)
np
.
testing
.
assert_equal
(
output
[
0
].
shape
[
0
],
len
(
self
.
test_dataset
))
acc
=
compute_acc
(
output
[
0
],
self
.
val_dataset
.
labels
)
np
.
testing
.
assert_allclose
(
acc
,
self
.
acc1
)
fluid
.
disable_dygraph
()
if
dynamic
else
None
class
MyModel
(
Model
):
def
__init__
(
self
):
super
(
MyModel
,
self
).
__init__
()
self
.
_fc
=
Linear
(
20
,
10
,
act
=
'softmax'
)
def
forward
(
self
,
x
):
y
=
self
.
_fc
(
x
)
return
y
class
TestModelFunction
(
unittest
.
TestCase
):
def
set_seed
(
self
,
seed
=
1024
):
fluid
.
default_startup_program
().
random_seed
=
seed
fluid
.
default_main_program
().
random_seed
=
seed
def
test_train_batch
(
self
,
dynamic
=
True
):
dim
=
20
data
=
np
.
random
.
random
(
size
=
(
4
,
dim
)).
astype
(
np
.
float32
)
label
=
np
.
random
.
randint
(
0
,
10
,
size
=
(
4
,
1
)).
astype
(
np
.
int64
)
def
get_expect
():
fluid
.
enable_dygraph
(
fluid
.
CPUPlace
())
self
.
set_seed
()
m
=
MyModel
()
optim
=
fluid
.
optimizer
.
SGD
(
learning_rate
=
0.001
,
parameter_list
=
m
.
parameters
())
m
.
train
()
output
=
m
(
to_variable
(
data
))
l
=
to_variable
(
label
)
loss
=
fluid
.
layers
.
cross_entropy
(
output
,
l
)
avg_loss
=
fluid
.
layers
.
reduce_sum
(
loss
)
avg_loss
.
backward
()
optim
.
minimize
(
avg_loss
)
m
.
clear_gradients
()
fluid
.
disable_dygraph
()
return
avg_loss
.
numpy
()
ref
=
get_expect
()
for
dynamic
in
[
True
,
False
]:
device
=
set_device
(
'cpu'
)
fluid
.
enable_dygraph
(
device
)
if
dynamic
else
None
self
.
set_seed
()
model
=
MyModel
()
optim2
=
fluid
.
optimizer
.
SGD
(
learning_rate
=
0.001
,
parameter_list
=
model
.
parameters
())
inputs
=
[
Input
([
None
,
dim
],
'float32'
,
name
=
'x'
)]
labels
=
[
Input
([
None
,
1
],
'int64'
,
name
=
'label'
)]
model
.
prepare
(
optim2
,
loss_function
=
CrossEntropy
(
average
=
False
),
inputs
=
inputs
,
labels
=
labels
,
device
=
device
)
loss
,
=
model
.
train_batch
([
data
],
[
label
])
print
(
loss
,
ref
)
np
.
testing
.
assert_allclose
(
loss
.
flatten
(),
ref
.
flatten
())
fluid
.
disable_dygraph
()
if
dynamic
else
None
def
not_test_test_batch
(
self
,
dynamic
=
True
):
dim
=
20
data
=
np
.
random
.
random
(
size
=
(
4
,
dim
)).
astype
(
np
.
float32
)
def
get_expect
():
fluid
.
enable_dygraph
(
fluid
.
CPUPlace
())
self
.
set_seed
()
m
=
MyModel
()
m
.
eval
()
output
=
m
(
to_variable
(
data
))
fluid
.
disable_dygraph
()
return
output
.
numpy
()
ref
=
get_expect
()
for
dynamic
in
[
True
,
False
]:
self
.
set_seed
()
device
=
set_device
(
'cpu'
)
fluid
.
enable_dygraph
(
device
)
if
dynamic
else
None
model
=
MyModel
()
inputs
=
[
Input
([
None
,
dim
],
'float32'
,
name
=
'x'
)]
model
.
prepare
(
inputs
=
inputs
,
device
=
device
)
out
,
=
model
.
test_batch
([
data
])
np
.
testing
.
assert_allclose
(
out
,
ref
)
fluid
.
disable_dygraph
()
if
dynamic
else
None
def
not_test_save_load
(
self
):
path
=
tempfile
.
mkdtemp
()
for
dynamic
in
[
True
,
False
]:
device
=
set_device
(
'cpu'
)
fluid
.
enable_dygraph
(
device
)
if
dynamic
else
None
model
=
MyModel
()
model
.
save
(
path
+
'/test'
)
model
.
load
(
path
+
'/test'
)
shutil
.
rmtree
(
path
)
fluid
.
disable_dygraph
()
if
dynamic
else
None
def
not_test_parameters
(
self
):
for
dynamic
in
[
True
,
False
]:
device
=
set_device
(
'cpu'
)
fluid
.
enable_dygraph
(
device
)
if
dynamic
else
None
model
=
MyModel
()
params
=
model
.
parameters
()
self
.
assertTrue
(
params
[
0
].
shape
==
[
20
,
10
])
fluid
.
disable_dygraph
()
if
dynamic
else
None
if
__name__
==
'__main__'
:
if
__name__
==
'__main__'
:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录