从TFRecord保存和读取可变大小列表

时间:2016-05-17 08:17:23

标签: tensorflow

将稀疏矢量存储到TFRecord的最佳方法是什么?我的稀疏向量只包含1和0所以我决定只保存索引,其中'ones'的位置如下:

example = tf.train.Example(
        features=tf.train.Features(
            feature={
                'label': self._int64_feature(label),
                'features' : self._int64_feature_list(values)
            }
        )
    )

此处,values是包含'ones'索引的列表。这个values数组有时包含数百个元素,有时甚至根本没有。之后,我只是将序列化示例保存到tfrecord。后来,我正在读这样的tfrecord:

features = tf.parse_single_example(
    serialized_example,
    features={
        # We know the length of both fields. If not the
        # tf.VarLenFeature could be used
        'label': tf.FixedLenFeature([], dtype=tf.int64),
        'features': tf.VarLenFeature(dtype=tf.int64)
    }
)

label = features['label']
values = features['features']

这不起作用,因为values数组被识别为稀疏数组,并且我没有得到我保存的数据。什么是在tfrecords中存储稀疏张量以及如何读取它的最佳方法?

1 个答案:

答案 0 :(得分:1)

如果你只是序列化1的位置,你应该能够通过一点点诡计来获得正确的稀疏张量:

解析后的稀疏张量{{ $view_name }}看起来像这样:

features['features']

features['features'].indices: [[batch_id, position]...]是无用的枚举。

但您确实希望position看起来像feature['features']

其中[[batch_id, one_position], ...]是您在稀疏张量中指定的实际值。

所以:

one_position

瞧! indices = features['features'].indices indices = tf.transpose(indices) # Now looks like [[batch_id, batch_id, ...], [position, position, ...]] indices = tf.stack([indices[0], features['features'].values]) # Now looks like [[batch_id, batch_id, ...], [one_position, one_position, ...]] indices = tf.transpose(indices) # Now looks like [[batch_id, one_position], [batch_id, one_position], ...]] features['features'] = tf.SparseTensor( indices=indices, values=tf.ones(shape=tf.shape(indices)[:1]) dense_shape=1 + tf.reduce_max(indices, axis=[0]) ) 现在代表一个矩阵,它是你的一批稀疏向量连接。

注意:如果你想把它当作一个密集的张量,你必须做features['features']并且密集张量将具有形状tf.sparse_to_dense(这使得它很难处理]如果您知道可能的最大矢量长度,则可能需要对其进行硬编码:[None, None]