【问题标题】:Why does this TensorFlow code behave differently when inside a test case?为什么这个 TensorFlow 代码在测试用例中表现不同?
【发布时间】:2017-11-16 00:04:09
【问题描述】:

我有一个函数(下面的foo),当它直接运行时与在tf.test.TestCase 内运行时表现不同。

该代码应该使用 elems [1..5] 创建一个数据集并对其进行洗牌。然后重复 3 次:从数据中创建一个迭代器并使用它来打印 5 个元素。

当它自己运行时,它会给出所有列表都被打乱的输出,例如:

[4, 0, 3, 2, 1]
[0, 2, 1, 3, 4]
[2, 3, 4, 0, 1]

但在测试用例中运行时,它们总是相同的,即使在运行之间也是如此:

[0, 4, 2, 3, 1]
[0, 4, 2, 3, 1]
[0, 4, 2, 3, 1]

我想这与测试用例如何处理随机种子有关,但我在 TensorFlow 文档中看不到任何相关内容。感谢您的帮助!


代码:

import tensorflow as tf

def foo():
    sess = tf.Session()
    dataset = tf.data.Dataset.range(5)
    dataset = dataset.shuffle(5, reshuffle_each_iteration=False)

    for _ in range(3):
        data_iter = dataset.make_one_shot_iterator()
        next_item = data_iter.get_next()
        with sess.as_default():
            data_new = [next_item.eval() for _ in range(5)]
        print(data_new)


class DatasetTest(tf.test.TestCase):
    def testDataset(self):
        foo()

if __name__ == '__main__':
    foo()
    tf.test.main()

我使用 Python 3.6 和 TensorFlow 1.4 运行它。不需要其他模块。

【问题讨论】:

    标签: python unit-testing testing tensorflow


    【解决方案1】:

    我认为你是对的; tf.test.TestCasesetup 使用固定种子。

    class TensorFlowTestCase(googletest.TestCase):
    # ...
    def setUp(self):
      self._ClearCachedSession()
      random.seed(random_seed.DEFAULT_GRAPH_SEED)
      np.random.seed(random_seed.DEFAULT_GRAPH_SEED)
      ops.reset_default_graph()
      ops.get_default_graph().seed = random_seed.DEFAULT_GRAPH_SEED
    

    DEFAULT_GRAPH_SEED = 87654321this 行中的tensorflow/tensorflow/python/framework/random_seed.py

    【讨论】:

    • 谢谢!如果我覆盖setUp,看起来行为是一致的。感觉不是很干净,但我认为通常不鼓励单元测试中的不确定性?
    • 我相信我们期望在单元测试中得到确定性的结果。见martinfowler.com/articles/nonDeterminism.html
    • 那篇文章说得很好。我仍然想知道是否有有效的案例?例如。我想测试我的训练/测试数据在不同时期之间洗牌时是否保持分离。在拆分之前使用tf.data.Dataset.shuffle 的幼稚方法(我曾经使用过)可能会导致它们很容易混合(例如,如果像上面的foo 那样创建新的迭代器)。
    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 2020-07-23
    • 2019-11-29
    • 2017-11-18
    • 1970-01-01
    • 2014-05-24
    • 2013-02-23
    • 1970-01-01
    相关资源
    最近更新 更多