train.py 3.8 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 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
import paddle
import paddle.fluid as fluid
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 已提交
44 45 46 47
def optimizer_program():
    return fluid.optimizer.SGD(learning_rate=0.001)


48 49 50 51 52
# can use CPU or GPU
use_cuda = False
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()

trainer = fluid.Trainer(
53
    train_func=train_program, place=place, optimizer_func=optimizer_program)
54 55 56

feed_order = ['x', 'y']

57
# Specify the directory to save the parameters
D
daminglu 已提交
58
params_dirname = "fit_a_line.inference.model"
59 60 61 62 63 64

# Plot data
from paddle.v2.plot import Ploter
train_title = "Train cost"
test_title = "Test cost"
plot_cost = Ploter(train_title, test_title)
D
daminglu 已提交
65

66 67 68
step = 0


Y
Yan Xu 已提交
69
# event_handler prints training and testing info
D
daminglu 已提交
70
def event_handler_plot(event):
71 72
    global step
    if isinstance(event, fluid.EndStepEvent):
Y
Yan Xu 已提交
73 74 75 76
        if step % 10 == 0:  # record a train cost every 10 batches
            plot_cost.append(train_title, step, event.metrics[0])

        if step % 100 == 0:  # record a test cost every 100 batches
77 78 79 80 81 82 83 84 85 86 87
            test_metrics = trainer.test(
                reader=test_reader, feed_order=feed_order)
            plot_cost.append(test_title, step, test_metrics[0])
            plot_cost.plot()

            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
Yan Xu 已提交
88 89 90 91 92 93
    if isinstance(event, fluid.EndEpochEvent):
        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)

94 95 96 97 98

# The training could take up to a few minutes.
trainer.train(
    reader=train_reader,
    num_epochs=100,
D
daminglu 已提交
99
    event_handler=event_handler_plot,
100 101 102 103 104 105 106 107 108 109
    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


inferencer = fluid.Inferencer(
D
daminglu 已提交
110
    infer_func=inference_program, param_path=params_dirname, place=place)
111 112

batch_size = 10
113 114 115
test_reader = paddle.batch(
    paddle.dataset.uci_housing.test(), batch_size=batch_size)
test_data = test_reader().next()
Y
Yan Xu 已提交
116 117
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")
118

R
root 已提交
119
results = inferencer.infer({'x': test_x})
120 121

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

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