【问题标题】:Tensorflow 1.10 TFRecordDataset - recovering TFRecordsTensorflow 1.10 TFRecordDataset - 恢复 TFRecords
【发布时间】:2019-02-03 12:00:24
【问题描述】:

注意事项:

  1. 这个问题延伸到之前的question of mine。在那个问题中,我询问将一些虚拟数据存储为ExampleSequenceExample 的最佳方法,以了解哪种方法更适合提供的虚拟数据。我提供了 ExampleSequenceExample 构造的显式表述,以及在答案中的编程方式。

  2. 因为这仍然是很多代码,我提供了一个Colab(由谷歌托管的交互式 jupyter 笔记本)文件,您可以在其中尝试代码以提供帮助。所有必要的代码都在那里,并且被慷慨地注释了。

我正在尝试学习如何将我的数据转换为 TF 记录,因为声称的好处对我的数据来说是值得的。但是,文档还有很多不足之处,而尝试更深入的教程/博客(我已经看到)实际上只是触及表面或重新散列存在的稀疏文档。

对于我的previous question 中考虑的演示数据 - 以及这里 - 我编写了一个体面的类:

  • 具有 n 个通道的序列(在此示例中,它是基于整数的,具有固定长度并具有 n 个通道)
  • 软标签类概率(在本例中,有 n 个类,基于浮点数)
  • 一些元数据(在这个例子中是一个字符串和两个浮点数)

并且可以将数据编码为 6 种形式中的一种:

  1. 例如,序列通道/类以数字类型(在本例中为int64)分隔,并附加元数据
  2. 示例,序列通道/类作为字节字符串(通过numpy.ndarray.tostring())分开,并附加元数据
  3. 示例,序列/类作为字节字符串转储并附加元数据

  4. SequenceExample,序列通道/类以数字类型分隔,元数据作为上下文

  5. SequenceExample,序列通道作为字节字符串分开,元数据作为上下文分开
  6. SequenceExample,序列和类转储为字节字符串,元数据转储为上下文

这很好用。

Colab 中,我展示了如何将虚拟数据全部写入同一个文件以及单独的文件中。

我的问题是如何恢复这些数据?

我在链接文件中尝试了 4 次尝试这样做。

为什么 TFReader 和 TFWriter 在不同的子包下?

【问题讨论】:

    标签: python tensorflow python-3.6 tensorflow-datasets tensorflow-estimator


    【解决方案1】:

    通过更新特征以包含形状信息并记住 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多