试图更好地理解最流行的顺序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: []
答案 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
参数中的各种要素时传递显式形状,并且如果它们不存在则会引发您看到的错误匹配。