test_recordio_reader.py 3.5 KB
Newer Older
Y
Yu Yang 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#   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 unittest
Y
Yu Yang 已提交
16

Y
Yu Yang 已提交
17
import paddle.fluid as fluid
F
fengjiayi 已提交
18 19
import paddle.v2 as paddle
import paddle.v2.dataset.mnist as mnist
Y
Yu Yang 已提交
20 21 22 23


class TestRecordIO(unittest.TestCase):
    def setUp(self):
Y
Yu Yang 已提交
24
        # Convert mnist to recordio file
Y
Yu Yang 已提交
25
        with fluid.program_guard(fluid.Program(), fluid.Program()):
Y
Yu Yang 已提交
26 27
            reader = paddle.batch(mnist.train(), batch_size=32)
            feeder = fluid.DataFeeder(
Y
Yu Yang 已提交
28
                feed_list=[  # order is image and label
Y
Yu Yang 已提交
29
                    fluid.layers.data(
Y
Yu Yang 已提交
30 31 32
                        name='image', shape=[784]),
                    fluid.layers.data(
                        name='label', shape=[1], dtype='int64'),
Y
Yu Yang 已提交
33 34
                ],
                place=fluid.CPUPlace())
Y
Yu Yang 已提交
35
            self.num_batches = fluid.recordio_writer.convert_reader_to_recordio_file(
Y
Yu Yang 已提交
36
                './mnist.recordio', reader, feeder)
Y
Yu Yang 已提交
37

Y
Yu Yang 已提交
38
    def test_main(self, decorator_callback=None):
Y
Yu Yang 已提交
39 40 41 42 43 44 45
        # use new program
        with fluid.program_guard(fluid.Program(), fluid.Program()):
            data_file = fluid.layers.open_recordio_file(
                './mnist.recordio',
                shapes=[[-1, 784], [-1, 1]],
                lod_levels=[0, 0],
                dtypes=['float32', 'int64'])
Y
Yu Yang 已提交
46 47
            if decorator_callback is not None:
                data_file = decorator_callback(data_file)
Y
Yu Yang 已提交
48
            img, label = fluid.layers.read_file(data_file)
Y
Yu Yang 已提交
49

Y
Yu Yang 已提交
50 51 52 53
            hidden = fluid.layers.fc(input=img, size=100, act='tanh')
            prediction = fluid.layers.fc(input=hidden, size=10, act='softmax')
            loss = fluid.layers.cross_entropy(input=prediction, label=label)
            avg_loss = fluid.layers.mean(loss)
Y
Yu Yang 已提交
54

Y
Yu Yang 已提交
55
            fluid.optimizer.Adam(learning_rate=1e-3).minimize(avg_loss)
Y
Yu Yang 已提交
56

Y
Yu Yang 已提交
57 58 59 60 61 62
            if fluid.core.is_compiled_with_cuda():
                place = fluid.CUDAPlace(0)
            else:
                place = fluid.CPUPlace()

            exe = fluid.Executor(place)
Y
Yu Yang 已提交
63 64
            exe.run(fluid.default_startup_program())
            avg_loss_np = []
Y
Refine  
Yu Yang 已提交
65

Y
Yu Yang 已提交
66
            # train a pass
Y
Yu Yang 已提交
67
            batch_id = 0
J
JiayiFeng 已提交
68 69 70 71 72 73 74
            while True:
                try:
                    tmp, = exe.run(fetch_list=[avg_loss])
                except fluid.core.EnforceNotMet as ex:
                    self.assertIn("There is no next data.", ex.message)
                    break

Y
Yu Yang 已提交
75
                avg_loss_np.append(tmp)
Y
Yu Yang 已提交
76 77
                batch_id += 1
            self.assertEqual(batch_id, self.num_batches)
Y
Yu Yang 已提交
78
            self.assertLess(avg_loss_np[-1], avg_loss_np[0])
Y
Yu Yang 已提交
79 80

    def test_shuffle_reader(self):
F
fengjiayi 已提交
81 82
        self.test_main(decorator_callback=lambda reader: fluid.layers.io.shuffle(
            reader, buffer_size=200))
Y
Yu Yang 已提交
83 84

    def test_double_buffer_reader(self):
J
JiayiFeng 已提交
85
        self.test_main(decorator_callback=lambda reader: fluid.layers.io.double_buffer(reader,
F
fengjiayi 已提交
86
                                                                                       place='cuda:0' if fluid.core.is_compiled_with_cuda() else 'cpu'))