我在阅读TensorFlow官方示例关于cifar10的代码,位于https://github.com/tensorflow/models/blob/master/official/resnet/cifar10_main.py,并有一些问题:
- 在函数
input_fn
中,
num_images = is_training and _NUM_IMAGES[‘train’] or _NUM_IMAGES[‘validation’]
…这是什么意思?我们如何通过这个函数在训练和验证时获得正确的数据大小?
- 在函数
main
中,有一个类似的表达式
input_function = FLAGS.use_synthetic_data and get_synth_input_fn() or input_fn
同样,我不知道它是如何工作的。
回答:
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)
中,只有当A
为真时才会评估B
。
这意味着在:
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