예제 #1
0
    def testNestedInputtersWithFlatDataFiles(self):
        inputters = inputter.ParallelInputter(
            [
                record_inputter.SequenceRecordInputter(10),
                record_inputter.SequenceRecordInputter(10),
            ],
            reducer=reducer.SumReducer(),
        )
        inputters = inputter.ParallelInputter(
            [
                record_inputter.SequenceRecordInputter(10),
                inputters,
            ],
            reducer=reducer.ConcatReducer(),
        )

        self.assertListEqual(inputters._structure(), [None, [None, None]])

        empty_file = os.path.join(self.get_temp_dir(), "test.txt")
        with open(empty_file, "w"):
            pass

        with self.assertRaises(ValueError):
            inputters.make_inference_dataset([empty_file, empty_file],
                                             batch_size=2)
        inputters.make_inference_dataset([empty_file, empty_file, empty_file],
                                         batch_size=2)
예제 #2
0
class ReducerTest(tf.test.TestCase):
    def testAlignInTimeSame(self):
        a = [[[1], [0], [0]], [[1], [2], [3]]]
        length = 3
        b = reducer.align_in_time(tf.constant(a, dtype=tf.float32),
                                  tf.constant(length))
        self.assertEqual(1, b.shape[-1])
        self.assertAllEqual(a, self.evaluate(b))

    def testAlignInTimeLarger(self):
        a = [[[1], [0], [0]], [[1], [2], [3]]]
        length = 4
        b = [[[1], [0], [0], [0]], [[1], [2], [3], [0]]]
        c = reducer.align_in_time(tf.constant(a, dtype=tf.float32),
                                  tf.constant(length))
        self.assertEqual(1, c.shape[-1])
        self.assertAllEqual(b, self.evaluate(c))

    def testAlignInTimeSmaller(self):
        a = [[[1], [0], [0]], [[1], [2], [0]]]
        length = 2
        b = [[[1], [0]], [[1], [2]]]
        c = reducer.align_in_time(tf.constant(a, dtype=tf.float32),
                                  tf.constant(length))
        self.assertEqual(1, c.shape[-1])
        self.assertAllEqual(b, self.evaluate(c))

    def testPadWithIdentity(self):
        tensor = [[[1], [-1], [-1]], [[1], [2], [3]], [[1], [2], [-1]]]
        expected = [
            [[1], [1], [1], [1], [0]],
            [[1], [2], [3], [1], [1]],
            [[1], [2], [0], [0], [0]],
        ]
        lengths = [1, 3, 2]
        max_lengths = [4, 5, 2]

        padded = reducer.pad_with_identity(
            tf.constant(tensor, dtype=tf.float32),
            tf.constant(lengths),
            tf.constant(max_lengths),
            identity_values=1,
        )

        self.assertEqual(1, padded.shape[-1])
        self.assertAllEqual(expected, self.evaluate(padded))

    def testPadWithIdentityWithMaxTime(self):
        tensor = [
            [[1], [-1], [-1], [-1]],
            [[1], [2], [3], [-1]],
            [[1], [2], [-1], [-1]],
        ]
        expected = [
            [[1], [1], [1], [1], [0], [0]],
            [[1], [2], [3], [1], [1], [0]],
            [[1], [2], [0], [0], [0], [0]],
        ]
        lengths = [1, 3, 2]
        max_lengths = [4, 5, 2]
        maxlen = 6

        padded = reducer.pad_with_identity(
            tf.constant(tensor, dtype=tf.float32),
            tf.constant(lengths),
            tf.constant(max_lengths),
            identity_values=1,
            maxlen=maxlen,
        )

        self.assertEqual(1, padded.shape[-1])
        self.assertAllEqual(expected, self.evaluate(padded))

    def testPadNWithIdentity(self):
        a = [[[1], [-1], [-1]], [[1], [2], [3]], [[1], [2], [-1]]]
        b = [[[1], [2], [3], [4]], [[1], [2], [-1], [-1]],
             [[1], [2], [-1], [-1]]]
        expected_a = [[[1], [1], [1], [1]], [[1], [2], [3], [0]],
                      [[1], [2], [0], [0]]]
        expected_b = [[[1], [2], [3], [4]], [[1], [2], [1], [0]],
                      [[1], [2], [0], [0]]]
        length_a = [1, 3, 2]
        length_b = [4, 2, 2]

        (padded_a, padded_b), length = reducer.pad_n_with_identity(
            [
                tf.constant(a, dtype=tf.float32),
                tf.constant(b, dtype=tf.float32)
            ],
            [tf.constant(length_a),
             tf.constant(length_b)],
            identity_values=1,
        )

        padded_a, padded_b, length = self.evaluate(
            [padded_a, padded_b, length])
        self.assertAllEqual([4, 3, 2], length)
        self.assertAllEqual(expected_a, padded_a)
        self.assertAllEqual(expected_b, padded_b)

    def testPadNWithIdentityWithMaxTime(self):
        a = [[[1], [-1], [-1]], [[1], [2], [3]], [[1], [2], [-1]]]
        b = [
            [[1], [2], [3], [4], [-1]],
            [[1], [2], [-1], [-1], [-1]],
            [[1], [2], [-1], [-1], [-1]],
        ]
        expected_a = [
            [[1], [1], [1], [1], [0]],
            [[1], [2], [3], [0], [0]],
            [[1], [2], [0], [0], [0]],
        ]
        expected_b = [
            [[1], [2], [3], [4], [0]],
            [[1], [2], [1], [0], [0]],
            [[1], [2], [0], [0], [0]],
        ]
        length_a = [1, 3, 2]
        length_b = [4, 2, 2]

        (padded_a, padded_b), length = reducer.pad_n_with_identity(
            [
                tf.constant(a, dtype=tf.float32),
                tf.constant(b, dtype=tf.float32)
            ],
            [tf.constant(length_a),
             tf.constant(length_b)],
            identity_values=1,
        )

        padded_a, padded_b, length = self.evaluate(
            [padded_a, padded_b, length])
        self.assertAllEqual([4, 3, 2], length)
        self.assertAllEqual(expected_a, padded_a)
        self.assertAllEqual(expected_b, padded_b)

    def testMultiplyReducerWithSequence(self):
        a = [[[1], [-1], [-1]], [[1], [2], [3]], [[1], [2], [-1]]]
        b = [[[1], [2], [3], [4]], [[1], [2], [-1], [-1]],
             [[1], [2], [-1], [-1]]]
        expected = [[[1], [2], [3], [4]], [[1], [4], [3], [0]],
                    [[1], [4], [0], [0]]]
        length_a = [1, 3, 2]
        length_b = [4, 2, 2]

        reduced, length = reducer.MultiplyReducer()(
            [
                tf.constant(a, dtype=tf.float32),
                tf.constant(b, dtype=tf.float32)
            ],
            [tf.constant(length_a),
             tf.constant(length_b)],
        )

        reduced, length = self.evaluate([reduced, length])
        self.assertAllEqual(expected, reduced)
        self.assertAllEqual([4, 3, 2], length)

    def testMultiplyReducerWithSequenceAndMaxTime(self):
        a = [[[1], [-1], [-1]], [[1], [2], [3]], [[1], [2], [-1]]]
        b = [
            [[1], [2], [3], [4], [-1]],
            [[1], [2], [-1], [-1], [-1]],
            [[1], [2], [-1], [-1], [-1]],
        ]
        expected = [
            [[1], [2], [3], [4], [0]],
            [[1], [4], [3], [0], [0]],
            [[1], [4], [0], [0], [0]],
        ]
        length_a = [1, 3, 2]
        length_b = [4, 2, 2]

        reduced, length = reducer.MultiplyReducer()(
            [
                tf.constant(a, dtype=tf.float32),
                tf.constant(b, dtype=tf.float32)
            ],
            [tf.constant(length_a),
             tf.constant(length_b)],
        )

        reduced, length = self.evaluate([reduced, length])
        self.assertAllEqual(expected, reduced)
        self.assertAllEqual([4, 3, 2], length)

    def testConcatInDepthWithSequence(self):
        a = [[[1], [-1], [-1]], [[1], [2], [3]], [[1], [2], [-1]]]
        b = [[[1], [2], [3], [4]], [[1], [2], [-1], [-1]],
             [[1], [2], [-1], [-1]]]
        expected = [
            [[1, 1], [0, 2], [0, 3], [0, 4]],
            [[1, 1], [2, 2], [3, 0], [0, 0]],
            [[1, 1], [2, 2], [0, 0], [0, 0]],
        ]
        length_a = [1, 3, 2]
        length_b = [4, 2, 2]

        reduced, length = reducer.ConcatReducer()(
            [
                tf.constant(a, dtype=tf.float32),
                tf.constant(b, dtype=tf.float32)
            ],
            [tf.constant(length_a),
             tf.constant(length_b)],
        )

        self.assertEqual(2, reduced.shape[-1])
        reduced, length = self.evaluate([reduced, length])
        self.assertAllEqual(expected, reduced)
        self.assertAllEqual([4, 3, 2], length)

    def testConcatInTimeWithSequence(self):
        a = [[[1], [-1], [-1]], [[1], [2], [3]], [[1], [2], [-1]]]
        b = [[[1], [2], [3], [4]], [[1], [2], [-1], [-1]],
             [[1], [2], [-1], [-1]]]
        expected = [
            [[1], [1], [2], [3], [4]],
            [[1], [2], [3], [1], [2]],
            [[1], [2], [1], [2], [0]],
        ]
        length_a = [1, 3, 2]
        length_b = [4, 2, 2]

        reduced, length = reducer.ConcatReducer(axis=1)(
            [
                tf.constant(a, dtype=tf.float32),
                tf.constant(b, dtype=tf.float32)
            ],
            [tf.constant(length_a),
             tf.constant(length_b)],
        )

        self.assertEqual(1, reduced.shape[-1])
        reduced, length = self.evaluate([reduced, length])
        self.assertAllEqual(expected, reduced)
        self.assertAllEqual([5, 5, 4], length)

    def testConcatInTimeWithSequenceAndMaxTimeMismatch(self):
        a = [[[1], [-1], [-1]], [[1], [2], [3]], [[1], [2], [-1]]]
        b = [
            [[1], [2], [3], [4], [-1], [-1]],
            [[1], [2], [-1], [-1], [-1], [-1]],
            [[1], [2], [-1], [-1], [-1], [-1]],
        ]
        expected = [
            [[1], [1], [2], [3], [4]],
            [[1], [2], [3], [1], [2]],
            [[1], [2], [1], [2], [0]],
        ]
        length_a = [1, 3, 2]
        length_b = [4, 2, 2]

        reduced, length = reducer.ConcatReducer(axis=1)(
            [
                tf.constant(a, dtype=tf.float32),
                tf.constant(b, dtype=tf.float32)
            ],
            [tf.constant(length_a),
             tf.constant(length_b)],
        )

        self.assertEqual(1, reduced.shape[-1])
        reduced, length = self.evaluate([reduced, length])
        self.assertAllEqual(expected, reduced)
        self.assertAllEqual([5, 5, 4], length)

    def testJoinReducer(self):
        self.assertTupleEqual((1, 2, 3), reducer.JoinReducer()([1, 2, 3]))
        self.assertTupleEqual((1, 2, 3),
                              reducer.JoinReducer()([(1, ), (2, ), (3, )]))
        self.assertTupleEqual((1, 2, 3), reducer.JoinReducer()([1, (2, 3)]))

        # Named tuples should not be unpacked.
        State = collections.namedtuple("State", ["h", "c"])
        self.assertTupleEqual(
            (State(h=1, c=2), State(h=3, c=4), State(h=5, c=6)),
            reducer.JoinReducer()(
                [State(h=1, c=2), (State(h=3, c=4), State(h=5, c=6))]),
        )

    @parameterized.expand([
        [reducer.SumReducer(), [1, 2, 3], [4, 5, 6], [5, 7, 9]],
        [reducer.SumReducer(), (1, 2, 3), (4, 5, 6), (5, 7, 9)],
        [reducer.SumReducer(), 1, 2, 3],
    ])
    def testZipAndReduce(self, reducer, x, y, expected_z):
        z = reducer.zip_and_reduce(x, y)
        z = self.evaluate(z)
        self.assertAllEqual(z, expected_z)

    def testDenseReducer(self):
        inputs = [
            tf.random.uniform([3, 4]),
            tf.random.uniform([3, 12]),
            tf.random.uniform([3, 6]),
        ]
        dense_reducer = reducer.DenseReducer(10, activation=tf.nn.relu)
        output = dense_reducer(inputs)
        self.assertTrue(dense_reducer.built)
        self.assertNotEmpty(dense_reducer.variables)
        self.assertListEqual(output.shape.as_list(), [3, 10])
        self.assertAllGreaterEqual(output, 0)