FixedLenSequenceFeature 意外行为

FixedLenSequenceFeature unexpected behaviour

试图更好地理解最流行的顺序 TFRecord 教程: http://www.wildml.com/2016/08/rnns-in-tensorflow-a-practical-guide-and-undocumented-features/

这在序列化部分出现的地方:

fl_tokens = ex.feature_lists.feature_list["tokens"]
fl_labels = ex.feature_lists.feature_list["labels"]

for token, label in zip(sequence, labels):
  fl_tokens.feature.add().int64_list.value.append(token)
  fl_labels.feature.add().int64_list.value.append(label)

return ex

为什么我们不能使用它?

ex.feature_lists.feature_list["tokens"].int64_list.value.extend(sequence)
ex.feature_lists.feature_list["tokens"].int64_list.value.extend(labels)

使用后一种方法会出现如下错误(我很难理解)

InvalidArgumentError: Name: , Key: tokens, Index: 0.  
Number of int64 values != expected.  values size: 22 but output shape: []

假设 extf.SequenceExample,我从你那里得到一个不同的错误:

>>> ex = tf.SequenceExample()
>>> sequence = [1, 2, 3]
>>> ex.feature_lists.feature_list["tokens"].int64_list.value.extend(sequence)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'FeatureList' object has no attribute 'int64_list'

但是,以下代码至少在语法上看起来是正确的,因此我假设您的意思如下:

>>> ex.feature_lists.feature_list["tokens"].feature.add().int64_list.value.extend(sequence)

为什么这样创建示例会产生错误?简短的回答是数据略有不同。当您执行以下操作时,您正在创建一个示例,其 token 特征列表具有 22 个标量值:

for token, label in zip(sequence, labels):
  fl_tokens.feature.add().int64_list.value.append(token)

请注意,您正在为 sequence 的每个元素调用一次 feature.add()。相比之下,在基于 extend() 的版本中,您正在创建一个示例,其 token 特征列表是单个值,它是一个包含 22 个元素的向量。

虽然这些在数学上可能是等效的,但 TensorFlow 的 tf.parse_single_sequence_example() 函数希望您在 sequence_features 参数中定义各种特征时传递显式形状,并且如果它们会引发您看到的错误不匹配。