Python TensorFlow:在从TFRecord文件解析TF示例时,为什么需要重新塑造非稀疏元素一次?

Python TensorFlow:在从TFRecord文件解析TF示例时,为什么需要重新塑造非稀疏元素一次?,python,machine-learning,tensorflow,computer-vision,deep-learning,Python,Machine Learning,Tensorflow,Computer Vision,Deep Learning,在的TensorFlow文档中,有以下代码: # Reshape non-sparse elements just once: for k in self._keys_to_features: v = self._keys_to_features[k] if isinstance(v, parsing_ops.FixedLenFeature): example[k] = array_ops.reshape(example[k], v.shape) 我想知道为什么在从TFReco

在的TensorFlow文档中,有以下代码:

# Reshape non-sparse elements just once:
for k in self._keys_to_features:
  v = self._keys_to_features[k]
  if isinstance(v, parsing_ops.FixedLenFeature):
    example[k] = array_ops.reshape(example[k], v.shape)
我想知道为什么在从TFRecord文件解析FixedLenFeature张量之后需要重新塑造它


事实上,定长特征和变长特征之间的区别是什么?它们与张量的相关性是什么?在这种情况下,我正在加载图像,那么为什么所有图像都会被归类为FixedLenFeature呢?VarLenFeature的示例是什么?

张量存储在磁盘上,没有形状信息(TFRecord文件是示例的集合)。
.proto
文件中的文档描述得相当好,但基本点是,张量条目按行大顺序存储,没有形状信息,因此必须在读取张量时提供。请注意,在内存中存储张量的情况类似:形状信息是单独保存的,仅重塑张量只会更改元数据(另一方面,转置之类的事情可能会很昂贵)


VarLenFeatures是像句子这样的序列,它们很难作为规则张量组合在一起,因为生成的形状会参差不齐。这本书有一些很好的例子。图像的长度是固定的,如果加载一批图像,它们都会有相同的形状(例如,它们都是32x32像素,所以一批10个图像可以有10x32x32的形状)。

意思是说,当我创建TFRecord文件时,我的图像都没有相同的形状是可以的,因为在我将它们加载到批中之前,我已经对它们进行了重塑?对于图像,我们不能使用VarLenFeatures,因为它会给我们一个稀疏张量(这不适用于图像),这是正确的吗?问题是在批处理图像时。您可以自由地从磁盘读取可变长度数组,但训练映像模型的唯一有效方法是将它们转换为密集的批处理格式,这意味着调整所有数组的大小。因此,读取稀疏张量,调整其大小,使其密集,然后对其进行批处理将是一个完美的输入管道。如果我已将所有图像调整为相同大小(例如500x500),即使我稍后必须通过预处理将其调整为更小的大小(例如299x299),这是否正确,阅读这些图片更有效,因为我在阅读TF示例时会将内容声明为FixedLenFeature?此外,由于TF示例一个接一个地读取,如果机器不知道其先前读取的其他示例的形状(这只是一个假设),那么FixedLenFeature与VarLenFeature如何区分?调整大小/重塑是否在TensorFlow中进行并不重要,假设有足够的并行处理,IO不是瓶颈。在TensorFlow中执行此操作的优点是,您可以轻松地进行切换,而且由于它更像是一个端到端的管道,因此可能更易于重复。关于第二个问题,输入阅读器不知道您的输入是否为固定长度,它只知道元素的数量是否与传递给FixedLenFeature的整数匹配。