Skip to content

Commit d73f2bd

Browse files
committed
fix data_feeder lod bug
1 parent 5c58eee commit d73f2bd

File tree

2 files changed

+56
-9
lines changed

2 files changed

+56
-9
lines changed

python/paddle/fluid/data_feeder.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@ def _feed_impl_(self, data, lod, lod_level):
5454
self.data.append(data)
5555
else:
5656
cur_lod_len = len(data)
57-
lod[-1].append(lod[-1][-1] + cur_lod_len)
57+
lod[0].append(lod[0][-1] + cur_lod_len)
5858
for each_data in data:
59-
self._feed_impl_(each_data, lod[:-1], lod_level - 1)
59+
self._feed_impl_(each_data, lod[1:], lod_level - 1)
6060

6161
def done(self):
6262
arr = numpy.array(self.data, dtype=self.dtype).reshape(self.shape)

python/paddle/fluid/tests/test_data_feeder.py

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,62 @@
1313
# limitations under the License.
1414

1515
import paddle.fluid as fluid
16+
import unittest
1617

1718

18-
def test_converter():
19-
img = fluid.layers.data(name='image', shape=[1, 28, 28])
20-
label = fluid.layers.data(name='label', shape=[1], dtype='int64')
21-
feeder = fluid.DataFeeder([img, label], fluid.CPUPlace())
22-
result = feeder.feed([[[0] * 784, [9]], [[1] * 784, [1]]])
23-
print(result)
19+
class TestDataFeeder(unittest.TestCase):
20+
def test_lod_level_0_converter(self):
21+
img = fluid.layers.data(name='image', shape=[1, 28, 28])
22+
label = fluid.layers.data(name='label', shape=[1], dtype='int64')
23+
feeder = fluid.DataFeeder([img, label], fluid.CPUPlace())
24+
result = feeder.feed([([0] * 784, [9]), ([1] * 784, [1])])
25+
print(result)
26+
27+
self.assertEqual(result['image'].shape(), [2, 1, 28, 28])
28+
self.assertEqual(result['label'].shape(), [2, 1])
29+
self.assertEqual(result['image'].lod(), [])
30+
self.assertEqual(result['label'].lod(), [])
31+
32+
def test_lod_level_1_converter(self):
33+
# lod_level = 1
34+
# each sentence has a different number of words
35+
sentences = fluid.layers.data(
36+
name='sentences', shape=[1], dtype='int64', lod_level=1)
37+
label = fluid.layers.data(name='label', shape=[1], dtype='int64')
38+
feeder = fluid.DataFeeder([sentences, label], fluid.CPUPlace())
39+
40+
# lod = [[0, 3, 5, 9]]
41+
# data = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
42+
# label = [1] * len(data)
43+
result = feeder.feed(
44+
[([1, 2, 3], [1]), ([4, 5], [1]), ([6, 7, 8, 9], [1])])
45+
print(result)
46+
47+
self.assertEqual(result['sentences'].shape(), [9, 1])
48+
self.assertEqual(result['label'].shape(), [3, 1])
49+
self.assertEqual(result['sentences'].lod(), [[0, 3, 5, 9]])
50+
self.assertEqual(result['label'].lod(), [])
51+
52+
def test_lod_level_2_converter(self):
53+
# lod_level = 2
54+
# paragraphs -> sentences -> words
55+
paragraphs = fluid.layers.data(
56+
name='paragraphs', shape=[1], dtype='int64', lod_level=2)
57+
label = fluid.layers.data(name='label', shape=[1], dtype='int64')
58+
feeder = fluid.DataFeeder([paragraphs, label], fluid.CPUPlace())
59+
60+
# lod = [[0, 2, 3], [0, 3, 5, 9]]
61+
# data = [[[1, 2, 3], [4, 5]], [[6, 7, 8, 9]]]
62+
# label = [1] * len(data)
63+
result = feeder.feed(
64+
[([[1, 2, 3], [4, 5]], [1]), ([[6, 7, 8, 9]], [1])])
65+
print(result)
66+
67+
self.assertEqual(result['paragraphs'].shape(), [9, 1])
68+
self.assertEqual(result['label'].shape(), [2, 1])
69+
self.assertEqual(result['paragraphs'].lod(), [[0, 2, 3], [0, 3, 5, 9]])
70+
self.assertEqual(result['label'].lod(), [])
2471

2572

2673
if __name__ == '__main__':
27-
test_converter()
74+
unittest.main()

0 commit comments

Comments
 (0)