我一直在研究用Python编写的Tensorflow API。我有两个问题。
1。当预期元组时,我们是否可以始终使用列表类型作为函数参数?
如果我们查看有关tf.placeholder
及其示例(https://www.tensorflow.org/api_docs/python/tf/placeholder)的官方API定义,我们会看到此函数的第二个参数是" shape"。在示例代码中,我们可以看到元组用于提供形状信息作为参数,如下所示。
x = tf.placeholder(tf.float32, shape=(1024, 1024))
但是,在官方教程页面(https://www.tensorflow.org/get_started/mnist/beginners)中,该示例使用列表作为形状,而不是使用如下所示的元组。
y_ = tf.placeholder(tf.float32, [None, 10])
我知道列表和元组之间存在一些差异,例如不可变和可变。
如果列表支持元组的所有功能,那么我们是否可以总是安全地使用列表而不是元组作为函数参数?是推荐吗?
2。上面示例代码中[None,10]的含义是什么?
在上面的示例代码中,使用了[None,10]。通常使用这种表达方式吗?如果是这样,那么"无"还算是一种数字?
答案 0 :(得分:4)
您可以在tuple
上执行的所有操作也可以在列表中执行。但反之亦然,因为tuple
是不可变的,而list
是可变的。
但有例外。因为元组是不可变的:
set
。列表旨在是同构序列,而元组是异构数据结构。此外,tuple
在性能方面略胜一筹。
来自Python's Tuples and Sequences文件:
尽管元组看起来与列表类似,但它们通常用于不同的情况并用于不同的目的。元组是不可变的,并且通常包含异构的元素序列,这些元素可以通过解包(参见本节后面部分)或索引(或者甚至是在namedtuples的情况下通过属性)来访问。
所以问题的答案是:
当需要元组时,我们是否可以始终使用列表类型作为函数参数?
在大多数情况下,您可以使用list
代替tuple
,但并非总是如此。但您不必担心这一点,因为Python会提醒您当您使用list
时可能出错。以下是您在执行此操作时收到的错误:
TypeError: unhashable type: 'list'
例如:
>>> set([1, [1, 2]])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> {[1, 2]: 1}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
答案 1 :(得分:1)
正如MoinuddinQuadri在https://stackoverflow.com/a/48038899/7505395中注意到此用法,您可以为list
交换2个元素tuple
。
回答第二次问题:
根据您关联的文档,在[None,784]
的上下文中shape
表示一个维度无限制,一个维度固定为784:
https://www.tensorflow.org/get_started/mnist/beginners#implementing_the_regression
x = tf.placeholder(tf.float32, [None, 784])
x
不是特定值。它是placeholder
,当我们要求TensorFlow运行计算时,我们将输入一个值。我们希望能够输入任意数量的MNIST图像,每个图像被平铺成784维向量。我们将其表示为浮点数的二维张量,shape [None, 784]
。(此处
None
表示维度可以是任意长度。)
答案 2 :(得分:1)
&#34;当预期元组时,我们是否可以始终使用列表类型作为函数参数?&#34;
没有。除了其他原因,该功能可以检查类型。
>>> issubclass(ZeroDivisionError, (Exception,))
True
>>> issubclass(ZeroDivisionError, [Exception,])
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
issubclass(ZeroDivisionError, [Exception,])
TypeError: issubclass() arg 2 must be a class or tuple of classes
还有一些Python语法需要元组的地方,如except子句。
>>> try: 1/0
except (Exception,) as e: print(e)
division by zero
>>> try: 1/0
except [Exception] as e: print(e)
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
try: 1/0
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<pyshell#2>", line 2, in <module>
except [Exception] as e: print(e)
TypeError: catching classes that do not inherit from BaseException is not allowed