Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplify fluid api for fit a line #10301

Merged
merged 39 commits into from
May 15, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
fd36e61
use the style here to refactor code:
daming-lu Apr 30, 2018
5484022
Merge branch 'develop' into simplify_fluid_api
daming-lu Apr 30, 2018
a065d11
add notest_fit_a_line following the new pattern here:
daming-lu Apr 30, 2018
527c1c7
newline
daming-lu Apr 30, 2018
80eada2
Merge develop
daming-lu May 4, 2018
ea754d1
Merge remote-tracking branch 'upstream/develop' into simplify_fluid_api
daming-lu May 4, 2018
d6c8f4c
use new trainer.train() and old infer, but not working
daming-lu May 5, 2018
00f68c7
fix code style
daming-lu May 7, 2018
67584c6
some fixes
JiayiFeng May 8, 2018
2d1341e
some fixes
JiayiFeng May 8, 2018
3c4a2e9
Merge pull request #1 from JiayiFeng/for_daming
daming-lu May 8, 2018
b11cd59
fix
daming-lu May 8, 2018
11b58e0
Merge branch 'simplify_fluid_api' of https://github.com/daming-lu/Pad…
daming-lu May 8, 2018
26860b4
remove notest_ prefix
daming-lu May 8, 2018
8bdea24
add prefix as removing it will make TeamCity fail
daming-lu May 8, 2018
8b07b01
Merge remote-tracking branch 'upstream/develop' into simplify_fluid_api
daming-lu May 8, 2018
791765a
remove notest_ prefix. In this case, the test should pass.
daming-lu May 8, 2018
78bbf31
using both train() and test()
daming-lu May 11, 2018
7f47ecd
Merge branch 'develop' into simplify_fluid_api
daming-lu May 11, 2018
89ed947
Merge branch 'develop' into simplify_fluid_api
daming-lu May 11, 2018
3e6510a
follow new pattern
daming-lu May 12, 2018
e229d81
fix style
daming-lu May 12, 2018
d6b32c5
add inference_program
daming-lu May 12, 2018
0beac7c
Merge branch 'develop' into simplify_fluid_api
daming-lu May 12, 2018
835b5d9
rm comment
daming-lu May 12, 2018
0c89ca7
style
daming-lu May 13, 2018
19bd2b8
fluid data
daming-lu May 13, 2018
305f482
paddle -> fluid
daming-lu May 13, 2018
841e256
layers
daming-lu May 13, 2018
2c073b4
act=None
daming-lu May 13, 2018
54e1274
add inferencer.infer()
daming-lu May 14, 2018
8ac261e
style
daming-lu May 14, 2018
2e22982
Merge branch 'develop' into simplify_fluid_api
daming-lu May 14, 2018
4b8537b
save inference model in the new way
daming-lu May 14, 2018
757952b
style
daming-lu May 14, 2018
4c221c9
add PR link in comment for ref
daming-lu May 14, 2018
fab651c
remove unused is_local
daming-lu May 14, 2018
410ec9a
added tony-yang's fix
daming-lu May 15, 2018
35c78af
no need to change old book test
daming-lu May 15, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ foreach(src ${TEST_OPS})
py_test(${src} SRCS ${src}.py)
endforeach()

add_subdirectory(fit_a_line)
add_subdirectory(recognize_digits)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
file(GLOB TEST_OPS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "test_*.py")
string(REPLACE ".py" "" TEST_OPS "${TEST_OPS}")

# default test
foreach(src ${TEST_OPS})
py_test(${src} SRCS ${src}.py)
endforeach()
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
# Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# 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.

import paddle
import paddle.fluid as fluid
import contextlib
import numpy
import unittest

# train reader
BATCH_SIZE = 20

train_reader = paddle.batch(
paddle.reader.shuffle(
paddle.dataset.uci_housing.train(), buf_size=500),
batch_size=BATCH_SIZE)

test_reader = paddle.batch(
paddle.reader.shuffle(
paddle.dataset.uci_housing.test(), buf_size=500),
batch_size=BATCH_SIZE)


def inference_program():
x = fluid.layers.data(name='x', shape=[13], dtype='float32')
y_predict = fluid.layers.fc(input=x, size=1, act=None)
return y_predict


def linear():
y = fluid.layers.data(name='y', shape=[1], dtype='float32')
y_predict = inference_program()

loss = fluid.layers.square_error_cost(input=y_predict, label=y)
avg_loss = fluid.layers.mean(loss)

return avg_loss


def train(use_cuda, save_dirname):
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()

trainer = fluid.Trainer(
train_func=linear,
infer_func=inference_program,
place=place,
optimizer=fluid.optimizer.SGD(learning_rate=0.001))

def event_handler(event):
if isinstance(event, fluid.EndEpochEvent):
test_metrics = trainer.test(
reader=test_reader, feed_order=['x', 'y'])
print test_metrics
'''
...
['25.768919467926025']
['15.343549569447836']
...
'''
if float(test_metrics[0]) < 20.0:
if save_dirname is not None:
# NOT clear yet
# fluid.io.save_inference_model(save_dirname, ['x'], [y_predict])
# trainer.save_params(save_dirname)
# https://github.com/PaddlePaddle/Paddle/pull/10445
trainer.save_inference_model(save_dirname)
return

trainer.train(
reader=train_reader,
num_epochs=100,
event_handler=event_handler,
feed_order=['x', 'y'])


# infer
def infer(use_cuda, save_dirname=None):
if save_dirname is None:
return

place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
inferencer = fluid.Inferencer(param_path=save_dirname, place=place)

batch_size = 10
tensor_x = numpy.random.uniform(0, 10, [batch_size, 13]).astype("float32")

results = inferencer.infer({'x': tensor_x})
print("infer results: ", results[0])


def main(use_cuda):
if use_cuda and not fluid.core.is_compiled_with_cuda():
return

# Directory for saving the trained model
save_dirname = "fit_a_line.inference.model"

train(use_cuda, save_dirname)
infer(use_cuda, save_dirname)


class TestFitALine(unittest.TestCase):
def test_cpu(self):
with self.program_scope_guard():
with fluid.unique_name.guard():
main(use_cuda=False)

def test_cuda(self):
with self.program_scope_guard():
with fluid.unique_name.guard():
main(use_cuda=True)

@contextlib.contextmanager
def program_scope_guard(self):
prog = fluid.Program()
startup_prog = fluid.Program()
scope = fluid.core.Scope()
with fluid.scope_guard(scope):
with fluid.program_guard(prog, startup_prog):
yield


if __name__ == '__main__':
unittest.main()