train.py 4.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#   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.

15
from __future__ import print_function
16 17
import paddle
import paddle.fluid as fluid
Y
yuyang 已提交
18 19 20 21 22 23 24 25 26 27 28 29
import sys

try:
    from paddle.fluid.contrib.trainer import *
    from paddle.fluid.contrib.inferencer import *
except ImportError:
    print(
        "In the fluid 1.0, the trainer and inferencer are moving to paddle.fluid.contrib",
        file=sys.stderr)
    from paddle.fluid.trainer import *
    from paddle.fluid.inferencer import *

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
import numpy

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 train_program():
    y = fluid.layers.data(name='y', shape=[1], dtype='float32')

    # feature vector of length 13
    x = fluid.layers.data(name='x', shape=[13], dtype='float32')
    y_predict = fluid.layers.fc(input=x, size=1, act=None)

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

    return avg_loss


D
daminglu 已提交
56 57 58 59
def optimizer_program():
    return fluid.optimizer.SGD(learning_rate=0.001)


60 61 62 63
# can use CPU or GPU
use_cuda = False
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()

Y
yuyang 已提交
64
trainer = Trainer(
65
    train_func=train_program, place=place, optimizer_func=optimizer_program)
66 67 68

feed_order = ['x', 'y']

69
# Specify the directory to save the parameters
D
daminglu 已提交
70
params_dirname = "fit_a_line.inference.model"
71 72 73

train_title = "Train cost"
test_title = "Test cost"
D
daminglu 已提交
74

75 76 77
step = 0


Y
Yan Xu 已提交
78
# event_handler prints training and testing info
79
def event_handler(event):
80
    global step
Y
yuyang 已提交
81
    if isinstance(event, EndStepEvent):
Y
Yan Xu 已提交
82
        if step % 10 == 0:  # record a train cost every 10 batches
83 84
            print("%s, Step %d, Cost %f" %
                  (train_title, step, event.metrics[0]))
Y
Yan Xu 已提交
85
        if step % 100 == 0:  # record a test cost every 100 batches
86 87
            test_metrics = trainer.test(
                reader=test_reader, feed_order=feed_order)
88
            print("%s, Step %d, Cost %f" % (test_title, step, test_metrics[0]))
89 90 91 92 93 94
            if test_metrics[0] < 10.0:
                # If the accuracy is good enough, we can stop the training.
                print('loss is less than 10.0, stop')
                trainer.stop()
        step += 1

Y
yuyang 已提交
95
    if isinstance(event, EndEpochEvent):
Y
Yan Xu 已提交
96 97 98 99 100
        if event.epoch % 10 == 0:
            # We can save the trained parameters for the inferences later
            if params_dirname is not None:
                trainer.save_params(params_dirname)

101 102 103 104 105

# The training could take up to a few minutes.
trainer.train(
    reader=train_reader,
    num_epochs=100,
106
    event_handler=event_handler,
107 108 109 110 111 112 113 114 115
    feed_order=feed_order)


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


Y
yuyang 已提交
116
inferencer = Inferencer(
D
daminglu 已提交
117
    infer_func=inference_program, param_path=params_dirname, place=place)
118 119

batch_size = 10
120 121
test_reader = paddle.batch(
    paddle.dataset.uci_housing.test(), batch_size=batch_size)
122
test_data = next(test_reader())
Y
Yan Xu 已提交
123 124
test_x = numpy.array([data[0] for data in test_data]).astype("float32")
test_y = numpy.array([data[1] for data in test_data]).astype("float32")
125

R
root 已提交
126
results = inferencer.infer({'x': test_x})
127 128

print("infer results: (House Price)")
Y
Yan Xu 已提交
129 130
for idx, val in enumerate(results[0]):
    print("%d: %.2f" % (idx, val))
131

132
print("\nground truth:")
Y
Yan Xu 已提交
133 134
for idx, val in enumerate(test_y):
    print("%d: %.2f" % (idx, val))