Tensorflow CIFAR-10教程中的布尔表达式

时间:2018-03-22 13:14:01

标签: python tensorflow machine-learning conditional-operator boolean-expression

我正在阅读关于https://github.com/tensorflow/models/blob/master/official/resnet/cifar10_main.py上关于cifar10的TF官方示例的代码 我有一些问题:

  • 在功能 input_fn 中,
  • 是什么
  

num_images = is_training和_NUM_IMAGES ['train']或   _NUM_IMAGES [ '验证']

......是什么意思?在通过此功能进行培训和验证时,我们如何才能获得正确的数据大小?

  • 在功能 main 中,有类似的
  

input_function = FLAGS.use_synthetic_data和get_synth_input_fn()或   input_fn

同样,我不知道它是如何运作的。

3 个答案:

答案 0 :(得分:1)

num_images = is_training and _NUM_IMAGES['train'] or _NUM_IMAGES['validation']

相当于

if is_training:
    num_images = _NUM_IMAGES['train']
else:
    num_images = _NUM_IMAGES['validation']

以同样的方式:

input_function = FLAGS.use_synthetic_data and get_synth_input_fn() or input_fn

相当于:

if FLAGS.use_synthetic_data:
   input_function = get_synth_input_fn()
else:
    input_function = input_fn()

虽然我给出的更详细的变体可能更具可读性,但原始的tensorflow版本更紧凑。

and运算符短路,例如

(A and B)
仅当B为真时,才会评估

A

这意味着:

A and B or C

如果A为真,则对B进行评估,or永远不会评估C, 所以结果是B。如果A为false,则永远不会评估B,结果为C

有关更多信息,请参阅文档:

https://docs.python.org/2/library/stdtypes.html#boolean-operations-and-or-not

答案 1 :(得分:0)

这是在python中使用整数(或实际上任何对象)的布尔操作的巧妙应用(有关详细信息,请参阅this question)。例如:

>>> True and 10 or 20
Out[11]: 10
>>> False and 10 or 20
Out[12]: 20

>>> a = False and (lambda x: x) or (lambda x: 2*x)
>>> a(1)
Out[14]: 2

因此num_images的结果是一个整数(第一个或第二个取决于is_training),input_function的结果是一个函数(同样,第一个或第二个依赖于在国旗use_synthetic_data)上。

答案 2 :(得分:0)

在这种情况下,你是TensorFlow糟糕代码风格的受害者。本教程是使用特定的Python反技巧编写的,您可以使用and选择在布尔上下文中评估为True的两个对象的最终对象,并使用or在第一个对象求值为False的情况下选择最终对象。

您可以通过一些更简单的示例更轻松地看到它:

In [9]: 3 and "hello"
Out[9]: 'hello'

In [10]: 3 and False or "foobar"
Out[10]: 'foobar'

因此,这些行通过将这两个反诡计链接在一起来选择必要的函数或数据大小。

这会造成不必要的混淆和不可读的代码,只要因为语言支持它或“它是Pythonic”而有人将其保护为正常,你几乎可以停止信任他们的建议。