我有同样的问题。我认为这是完全可以解决的,但是你必须决定输出格式,然后弄清楚你将如何使用它。
First 你的错误是什么?
该错误消息告诉您,您尝试读取的内容不适合您指定的特征尺寸。那么你在哪里指定的呢?就在这儿:
sequence_features = {
"input_characters": tf.FixedLenSequenceFeature([], dtype=tf.int64),
"output_characters": tf.FixedLenSequenceFeature([], dtype=tf.int64)
}
这表示“我的 input_characters 是单个值的序列”,但事实并非如此;你所拥有的是一系列单个值的序列,因此是一个错误。
Second 你能做什么?
如果您改为使用:
a = [[1,2,3], [2,3,1], [3,2,1]]
sequence_features = {
"input_characters": tf.FixedLenSequenceFeature([3], dtype=tf.int64),
"output_characters": tf.FixedLenSequenceFeature([3], dtype=tf.int64)
}
您的代码不会出现错误,因为您已指定顶级序列的每个元素的长度为 3 个元素。
或者,如果您没有固定长度的序列,那么您将不得不使用不同类型的功能。
sequence_features = {
"input_characters": tf.VarLenFeature(tf.int64),
"output_characters": tf.VarLenFeature(tf.int64)
}
VarLenFeature 告诉它在读取之前长度是未知的。不幸的是,这意味着您的 input_characters 无法再一步读取为密集向量。相反,它将是一个稀疏张量 https://www.tensorflow.org/api_docs/python/tf/SparseTensor默认情况下。你可以把它变成一个稠密张量tf.sparse_tensor_to_dense https://www.tensorflow.org/api_docs/python/tf/sparse_tensor_to_dense eg:
input_densified = tf.sparse_tensor_to_dense(sequence_parsed['input_characters'])
正如中提到的文章 http://www.wildml.com/2016/08/rnns-in-tensorflow-a-practical-guide-and-undocumented-features/您一直在查看的数据,如果您的数据并不总是具有相同的长度,您的词汇表中必须有一个“not_really_a_word”单词,您可以将其用作默认索引。例如假设您有索引 0 映射到“not_really_a_word”单词,然后使用您的
a = [[1,2,3], [2,3], [3,2,1]]
python 列表最终将成为
array((1,2,3), (2,3,0), (3,2,1))
tensor.
被警告;我不确定反向传播对于稀疏张量“是否有效”,就像对于密集张量一样。这野生ML文章 http://www.wildml.com/2016/08/rnns-in-tensorflow-a-practical-guide-and-undocumented-features/讨论了每个序列填充 0 来掩盖“not_actually_a_word”单词的损失(请参阅他们的文章中的“旁注:小心您的词汇/类中的 0”)。这似乎表明第一种方法会更容易实现。
请注意,这与此处描述的情况不同,其中每个示例都是序列的序列。据我了解,这种方法之所以得不到很好的支持,是因为它滥用了本应支持的案例;直接加载固定大小的嵌入。
我假设您接下来要做的就是将这些数字转换为词嵌入。您可以将索引列表转换为嵌入列表tf.nn.embedding_lookup