将scipy稀疏矩阵编码为TFRecords

Tho*_*aud 6 scipy tensorflow

我正在构建一个张量流模型,其中输入数据是一个大的scipy稀疏矩阵,每行是一个> 50k的样本,其中只有几百个值不为零.

目前,我将此矩阵存储为pickle,然后将其完全加载到内存中,批量处理并将批处理中的样本转换为我输入模型的密集numpy数组.一旦整个数据适合内存就可以正常工作,但是当我想使用更多数据时,这种方法是不易处理的.

我已经研究过TFRecords作为一种序列化我的数据的方法,并使用tensorflow更有效地读取它,但我找不到任何稀疏数据的例子.

我找到了一个mnist的例子:

writer = tf.python_io.TFRecordWriter("mnist.tfrecords")
# construct the Example protob oject
example = tf.train.Example(
    # Example contains a Features proto object
    features=tf.train.Features(
      # Features contains a map of string to Feature proto objects
      feature={
        # A Feature contains one of either a int64_list,
        # float_list, or bytes_list
        'label': tf.train.Feature(
            int64_list=tf.train.Int64List(value=[label])),
        'image': tf.train.Feature(
            int64_list=tf.train.Int64List(value=features.astype("int64"))),
}))
# use the proto object to serialize the example to a string
serialized = example.SerializeToString()
# write the serialized object to disk
writer.write(serialized)
Run Code Online (Sandbox Code Playgroud)

其中labela int和feature np.array的长度为784,表示图像的每个像素为浮点数.我理解这种方法,但我不能真正重现它,因为将我的稀疏矩阵的每一行转换为密集np.array也是难以处理的.

我想我需要为每个功能(列)创建一个键,并为每个示例仅指定非零值,但我不确定是否可以为"缺失"功能指定默认值(在我的情况下为0).

最好的方法是什么?