Tensorflow 1.10 TFRecordDataset - 恢复 TFRecord
Tensorflow 1.10 TFRecordDataset - recovering TFRecords
备注:
这个问题延伸到之前的 question of mine。在那个问题中,我询问了将一些虚拟数据存储为 Example
和 SequenceExample
的最佳方法,试图了解哪种方法更适合与所提供的虚拟数据类似的数据。我提供了 Example
和 SequenceExample
构造的明确表述,并在答案中提供了一种编程方式。
因为这仍然是很多代码,所以我提供了一个 Colab(由 google 托管的交互式 jupyter 笔记本)文件,您可以在其中自己尝试代码助攻。所有必要的代码都在那里,并且有慷慨的评论。
我正在尝试学习如何将我的数据转换为 TF 记录,因为声称的好处对我的数据来说是值得的。然而,文档还有很多不足之处,而试图更深入的教程/博客(我所看到的)实际上只是触及表面或重新散列现有的稀疏文档。
对于在我的 previous question 以及此处考虑的演示数据,我写了一个不错的 class 需要:
- 具有 n 个通道的序列(在此示例中,它是基于整数的,具有固定长度和 n 个通道)
- 软标签 class 概率(在此示例中有 n classes 和基于浮点数)
- 一些元数据(在这个例子中是一个字符串和两个浮点数)
并且可以将数据编码为 6 种形式中的一种:
- 示例,序列通道/classes 以数字类型分开(在本例中为
int64
)并添加了元数据
- 示例,带有序列通道/classes 分离为字节字符串(通过
numpy.ndarray.tostring()
)并添加了元数据
示例,序列 / classes 转储为字节字符串,并添加了元数据
SequenceExample,序列通道/classes在数字类型和元数据中分开作为上下文
- SequenceExample,序列通道作为字节字符串和元数据作为上下文分开
- SequenceExample,序列和 classes 转储为字节字符串,元数据转储为上下文
这很好用。
在 Colab 中,我展示了如何在同一个文件和单独的文件中写入虚拟数据。
我的问题是如何恢复这些数据?
我在链接文件中进行了 4 次尝试。
为什么TFReader和TFWriter在不同的子包下?
通过更新特征以包含形状信息并记住 SequenceExample
是 未命名 FeatureLists
来解决。
context_features = {
'Name' : tf.FixedLenFeature([], dtype=tf.string),
'Val_1': tf.FixedLenFeature([], dtype=tf.float32),
'Val_2': tf.FixedLenFeature([], dtype=tf.float32)
}
sequence_features = {
'sequence': tf.FixedLenSequenceFeature((3,), dtype=tf.int64),
'pclasses' : tf.FixedLenSequenceFeature((3,), dtype=tf.float32),
}
def parse(record):
parsed = tf.parse_single_sequence_example(
record,
context_features=context_features,
sequence_features=sequence_features
)
return parsed
filenames = [os.path.join(os.getcwd(),f"dummy_sequences_{i}.tfrecords") for i in range(3)]
dataset = tf.data.TFRecordDataset(filenames).map(lambda r: parse(r))
iterator = tf.data.Iterator.from_structure(dataset.output_types,
dataset.output_shapes)
next_element = iterator.get_next()
training_init_op = iterator.make_initializer(dataset)
for _ in range(2):
# Initialize an iterator over the training dataset.
sess.run(training_init_op)
for _ in range(3):
ne = sess.run(next_element)
print(ne)
备注:
这个问题延伸到之前的 question of mine。在那个问题中,我询问了将一些虚拟数据存储为
Example
和SequenceExample
的最佳方法,试图了解哪种方法更适合与所提供的虚拟数据类似的数据。我提供了Example
和SequenceExample
构造的明确表述,并在答案中提供了一种编程方式。因为这仍然是很多代码,所以我提供了一个 Colab(由 google 托管的交互式 jupyter 笔记本)文件,您可以在其中自己尝试代码助攻。所有必要的代码都在那里,并且有慷慨的评论。
我正在尝试学习如何将我的数据转换为 TF 记录,因为声称的好处对我的数据来说是值得的。然而,文档还有很多不足之处,而试图更深入的教程/博客(我所看到的)实际上只是触及表面或重新散列现有的稀疏文档。
对于在我的 previous question 以及此处考虑的演示数据,我写了一个不错的 class 需要:
- 具有 n 个通道的序列(在此示例中,它是基于整数的,具有固定长度和 n 个通道)
- 软标签 class 概率(在此示例中有 n classes 和基于浮点数)
- 一些元数据(在这个例子中是一个字符串和两个浮点数)
并且可以将数据编码为 6 种形式中的一种:
- 示例,序列通道/classes 以数字类型分开(在本例中为
int64
)并添加了元数据 - 示例,带有序列通道/classes 分离为字节字符串(通过
numpy.ndarray.tostring()
)并添加了元数据 示例,序列 / classes 转储为字节字符串,并添加了元数据
SequenceExample,序列通道/classes在数字类型和元数据中分开作为上下文
- SequenceExample,序列通道作为字节字符串和元数据作为上下文分开
- SequenceExample,序列和 classes 转储为字节字符串,元数据转储为上下文
这很好用。
在 Colab 中,我展示了如何在同一个文件和单独的文件中写入虚拟数据。
我的问题是如何恢复这些数据?
我在链接文件中进行了 4 次尝试。
为什么TFReader和TFWriter在不同的子包下?
通过更新特征以包含形状信息并记住 SequenceExample
是 未命名 FeatureLists
来解决。
context_features = {
'Name' : tf.FixedLenFeature([], dtype=tf.string),
'Val_1': tf.FixedLenFeature([], dtype=tf.float32),
'Val_2': tf.FixedLenFeature([], dtype=tf.float32)
}
sequence_features = {
'sequence': tf.FixedLenSequenceFeature((3,), dtype=tf.int64),
'pclasses' : tf.FixedLenSequenceFeature((3,), dtype=tf.float32),
}
def parse(record):
parsed = tf.parse_single_sequence_example(
record,
context_features=context_features,
sequence_features=sequence_features
)
return parsed
filenames = [os.path.join(os.getcwd(),f"dummy_sequences_{i}.tfrecords") for i in range(3)]
dataset = tf.data.TFRecordDataset(filenames).map(lambda r: parse(r))
iterator = tf.data.Iterator.from_structure(dataset.output_types,
dataset.output_shapes)
next_element = iterator.get_next()
training_init_op = iterator.make_initializer(dataset)
for _ in range(2):
# Initialize an iterator over the training dataset.
sess.run(training_init_op)
for _ in range(3):
ne = sess.run(next_element)
print(ne)