train.py 5.1 KB
Newer Older
J
JiabinYang 已提交
1
from __future__ import print_function
L
liaogang 已提交
2
import os
L
liaogang 已提交
3 4
from PIL import Image
import numpy as np
W
Wang,Jeff 已提交
5 6
import paddle
import paddle.fluid as fluid
L
Luo Tao 已提交
7 8


W
Wang,Jeff 已提交
9 10
def softmax_regression():
    img = fluid.layers.data(name='img', shape=[1, 28, 28], dtype='float32')
W
Wang,Jeff 已提交
11
    predict = fluid.layers.fc(input=img, size=10, act='softmax')
L
Luo Tao 已提交
12 13 14
    return predict


W
Wang,Jeff 已提交
15 16 17 18 19 20
def multilayer_perceptron():
    img = fluid.layers.data(name='img', shape=[1, 28, 28], dtype='float32')
    # first fully-connected layer, using ReLu as its activation function
    hidden = fluid.layers.fc(input=img, size=128, act='relu')
    # second fully-connected layer, using ReLu as its activation function
    hidden = fluid.layers.fc(input=hidden, size=64, act='relu')
L
Luo Tao 已提交
21 22
    # The thrid fully-connected layer, note that the hidden size should be 10,
    # which is the number of unique digits
W
Wang,Jeff 已提交
23 24
    prediction = fluid.layers.fc(input=hidden, size=10, act='softmax')
    return prediction
L
Luo Tao 已提交
25 26


W
Wang,Jeff 已提交
27 28 29 30
def convolutional_neural_network():
    img = fluid.layers.data(name='img', shape=[1, 28, 28], dtype='float32')
    # first conv pool
    conv_pool_1 = fluid.nets.simple_img_conv_pool(
L
Luo Tao 已提交
31 32 33 34 35
        input=img,
        filter_size=5,
        num_filters=20,
        pool_size=2,
        pool_stride=2,
W
Wang,Jeff 已提交
36 37 38 39
        act="relu")
    conv_pool_1 = fluid.layers.batch_norm(conv_pool_1)
    # second conv pool
    conv_pool_2 = fluid.nets.simple_img_conv_pool(
L
Luo Tao 已提交
40 41 42 43 44
        input=conv_pool_1,
        filter_size=5,
        num_filters=50,
        pool_size=2,
        pool_stride=2,
W
Wang,Jeff 已提交
45 46 47 48
        act="relu")
    # output layer with softmax activation function. size = 10 since there are only 10 possible digits.
    prediction = fluid.layers.fc(input=conv_pool_2, size=10, act='softmax')
    return prediction
L
Luo Tao 已提交
49

Q
qijun 已提交
50

W
Wang,Jeff 已提交
51 52
def train_program():
    label = fluid.layers.data(name='label', shape=[1], dtype='int64')
Q
qijun 已提交
53 54

    # Here we can build the prediction network in different ways. Please
W
Wang,Jeff 已提交
55
    # predict = softmax_regression() # uncomment for Softmax
W
Wang,Jeff 已提交
56 57
    # predict = multilayer_perceptron() # uncomment for MLP
    predict = convolutional_neural_network()  # uncomment for LeNet5
Q
qijun 已提交
58

W
Wang,Jeff 已提交
59 60 61 62 63
    # Calculate the cost from the prediction and label.
    cost = fluid.layers.cross_entropy(input=predict, label=label)
    avg_cost = fluid.layers.mean(cost)
    acc = fluid.layers.accuracy(input=predict, label=label)
    return [avg_cost, acc]
Q
qijun 已提交
64 65


W
Wang,Jeff 已提交
66 67 68 69
def optimizer_program():
    return fluid.optimizer.Adam(learning_rate=0.001)


W
Wang,Jeff 已提交
70 71 72 73
def main():
    train_reader = paddle.batch(
        paddle.reader.shuffle(paddle.dataset.mnist.train(), buf_size=500),
        batch_size=64)
Q
qijun 已提交
74

W
Wang,Jeff 已提交
75 76
    test_reader = paddle.batch(paddle.dataset.mnist.test(), batch_size=64)

W
Wang,Jeff 已提交
77
    use_cuda = False  # set to True if training with GPU
W
Wang,Jeff 已提交
78 79 80
    place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()

    trainer = fluid.Trainer(
W
Wang,Jeff 已提交
81
        train_func=train_program, place=place, optimizer_func=optimizer_program)
W
Wang,Jeff 已提交
82 83 84

    # Save the parameter into a directory. The Inferencer can load the parameters from it to do infer
    params_dirname = "recognize_digits_network.inference.model"
Q
qijun 已提交
85 86 87 88

    lists = []

    def event_handler(event):
W
Wang,Jeff 已提交
89 90 91 92
        if isinstance(event, fluid.EndStepEvent):
            if event.step % 100 == 0:
                # event.metrics maps with train program return arguments.
                # event.metrics[0] will yeild avg_cost and event.metrics[1] will yeild acc in this example.
J
JiabinYang 已提交
93 94
                print("Pass %d, Batch %d, Cost %f" % (event.step, event.epoch,
                                                      event.metrics[0]))
W
Wang,Jeff 已提交
95

W
Wang,Jeff 已提交
96 97 98
        if isinstance(event, fluid.EndEpochEvent):
            avg_cost, acc = trainer.test(
                reader=test_reader, feed_order=['img', 'label'])
L
liaogang 已提交
99

W
Wang,Jeff 已提交
100 101
            print("Test with Epoch %d, avg_cost: %s, acc: %s" %
                  (event.epoch, avg_cost, acc))
Q
qijun 已提交
102

W
Wang,Jeff 已提交
103 104 105 106 107
            # save parameters
            trainer.save_params(params_dirname)
            lists.append((event.epoch, avg_cost, acc))

    # Train the model now
Q
qijun 已提交
108
    trainer.train(
W
Wang,Jeff 已提交
109
        num_epochs=5,
Q
qijun 已提交
110
        event_handler=event_handler,
W
Wang,Jeff 已提交
111 112
        reader=train_reader,
        feed_order=['img', 'label'])
Q
qijun 已提交
113 114 115

    # find the best pass
    best = sorted(lists, key=lambda list: float(list[1]))[0]
J
JiabinYang 已提交
116 117
    print('Best pass is %s, testing Avgcost is %s' % (best[0], best[1]))
    print('The classification accuracy is %.2f%%' % (float(best[2]) * 100))
Q
qijun 已提交
118

L
liaogang 已提交
119 120 121
    def load_image(file):
        im = Image.open(file).convert('L')
        im = im.resize((28, 28), Image.ANTIALIAS)
W
Wang,Jeff 已提交
122
        im = np.array(im).reshape(1, 1, 28, 28).astype(np.float32)
A
alexqdh 已提交
123
        im = im / 255.0 * 2.0 - 1.0
L
liaogang 已提交
124 125
        return im

L
liaogang 已提交
126
    cur_dir = os.path.dirname(os.path.realpath(__file__))
W
Wang,Jeff 已提交
127 128 129 130 131 132 133 134 135 136
    img = load_image(cur_dir + '/image/infer_3.png')
    inferencer = fluid.Inferencer(
        # infer_func=softmax_regression, # uncomment for softmax regression
        # infer_func=multilayer_perceptron, # uncomment for MLP
        infer_func=convolutional_neural_network,  # uncomment for LeNet5
        param_path=params_dirname,
        place=place)

    results = inferencer.infer({'img': img})
    lab = np.argsort(results)  # probs and lab are the results of one batch data
J
JiabinYang 已提交
137
    print("Inference result of image/infer_3.png is: %d" % lab[0][0][-1])
L
liaogang 已提交
138

Q
qijun 已提交
139

Q
qijun 已提交
140
if __name__ == '__main__':
Q
qijun 已提交
141
    main()