Skip to content

Paddle V4 API - Recognize Digits #10215

@cs2be

Description

@cs2be
class RecognizeDigits(fluid.Program):
    def _conv_net(img):
        conv_pool_1 = fluid.nets.simple_img_conv_pool(
            input=img,
            filter_size=5,
            num_filters=20,
            pool_size=2,
            pool_stride=2,
            act="relu")
        conv_pool_1 = fluid.layers.batch_norm(conv_pool_1)
        conv_pool_2 = fluid.nets.simple_img_conv_pool(
            input=conv_pool_1,
            filter_size=5,
            num_filters=50,
            pool_size=2,
            pool_stride=2,
            act="relu")
        prediction = fluid.layers.fc(input=conv_pool, size=10, act='softmax')
        return prediction

    @network('img', 'label')
    def train_step():
        img = fluid.layers.data(name='img', shape=[1, 28, 28], dtype='float32')
        label = fluid.layers.data(name='label', shape=[1], dtype='int64')

        with fluid.var_scope('prediction'):
            prediction = _conv_net(img)

        loss = fluid.layers.cross_entropy(input=prediction, label=label)
        avg_loss = fluid.layers.mean(loss)
        acc = fluid.layers.accuracy(input=prediction, label=label)
        optimizer = fluid.optimizer.Adam(learning_rate=0.001)
        optimizer.minimize(avg_loss)
        return acc, avg_loss

    @network('img', 'label')
    def test_step():
        img = fluid.layers.data(name='img', shape=[1, 28, 28], dtype='float32')
        label = fluid.layers.data(name='label', shape=[1], dtype='int64')

        with fluid.var_scope('prediction'):
            prediction = _conv_net(img)

        loss = fluid.layers.cross_entropy(input=prediction, label=label)
        avg_loss = fluid.layers.mean(loss)
        acc = fluid.layers.accuracy(input=prediction, label=label)
        return acc, avg_loss

    @network('img')
    def infer():
        img = fluid.layers.data(name='img', shape=[1, 28, 28], dtype='float32')

        with fluid.var_scope('prediction'):
            prediction = _conv_net(img)
            return prediction

recognize_digits = RecognizeDigits().Compile()
train_reader = paddle.batch(paddle.reader.shuffle(paddle.dataset.mnist.train(), buf_size=500),
    batch_size=BATCH_SIZE)
test_reader = paddle.batch(paddle.dataset.mnist.test(), batch_size=BATCH_SIZE)

NUM_EPOCHS = 100
for pass_id in range(NUM_EPOCHS):
    for batch_id, data in enumerate(train_reader()):
        recognize_digits.train_step(data[0], data[1])

        if (batch_id + 1) % 10 == 0:
            acc_set = []
            avg_loss_set = []
            for test_data in test_reader():
                acc_np, avg_loss_np = recognize_digits.test_step(test_data[0], test_data[1])
                acc_set.append(float(acc_np))
                avg_loss_set.append(float(avg_loss_np))

            # get test acc and loss
            acc_val = numpy.array(acc_set).mean()
            if float(acc_val) > 0.2:
                fluid.save_parameters(recognize_digits.infer, "./inference_parameter")
                break

tensor_img = numpy.random.uniform(-1.0, 1.0, [1, 1, 28, 28]).astype("float32")
prediction = recognize_digits.infer(tensor_img)
print prediction

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions