FixedLenSequenceFeature意外行为

时间:2017-02-24 04:00:00

标签: python tensorflow protocol-buffers

试图更好地理解最流行的顺序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: []

1 个答案:

答案 0 :(得分:1)

假设guard let variable = something as? NSArray else { // your variable is nil. Do something if needed } // your variable is available in this scope. Do something when variable contains Array ex,我会收到与你不同的错误:

tf.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) 功能列表包含22个标量值:

token

请注意,您为for token, label in zip(sequence, labels): fl_tokens.feature.add().int64_list.value.append(token) 的每个元素调用feature.add()一次。相比之下,在基于sequence的版本中,您正在创建一个示例,其extend()要素列表是单个值,即22个元素的向量。

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