【问题标题】:Boolean expression in Tensorflow CIFAR-10 tutorialTensorflow CIFAR-10 教程中的布尔表达式
【发布时间】:2018-08-31 22:48:24
【问题描述】:

我正在阅读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() 或 输入_fn

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

【问题讨论】:

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


    【解决方案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 为假,则永远不会评估B,结果为C

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

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

    【讨论】:

    • @KM/ 如果您喜欢我的回答,如果您通过接受它来验证它会很好:) 我将不胜感激。如果缺少某些内容:请随时指出。
    【解决方案2】:

    这是在 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 )。

    【讨论】:

      【解决方案3】:

      在这种情况下,您是 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”而捍卫它为 OK,你几乎可以停止相信他们的建议。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-04
        • 2016-06-24
        • 2017-02-12
        • 2016-04-07
        • 2016-04-16
        • 2019-05-11
        • 2010-09-21
        相关资源
        最近更新 更多