【问题标题】:Pickled scipy sparse matrix as input data?腌制的 scipy 稀疏矩阵作为输入数据?
【发布时间】:2016-10-19 23:27:07
【问题描述】:

我正在研究一个包含对简历进行分类的多类分类问题。

我使用 sklearn 及其 TfIdfVectorizer 获得了一个大的 scipy 稀疏矩阵,我在酸洗后将其输入到 Tensorflow 模型中。在我的本地机器上,我加载它,将小批量转换为密集的 numpy 数组并填充一个提要字典。一切都很好。

现在我想在机器学习云上做同样的事情。我的泡菜存储在gs://my-bucket/path/to/pickle,但是当我运行我的训练器时,在这个URI (IOError: [Errno 2] No such file or directory) 上找不到泡菜文件。我正在使用pickle.load(open('gs://my-bucket/path/to/pickle), 'rb') 来提取我的数据。我怀疑这不是在 GCS 上打开文件的好方法,但我对 Google Cloud 完全陌生,找不到合适的方法。

另外,我读到必须使用 TFRecords 或 CSV 格式输入数据,但我不明白为什么我的方法不起作用。 CSV 被排除在外,因为矩阵的密集表示太大而无法放入内存。 TFRecords 可以像这样有效地编码稀疏数据吗?是否可以从 pickle 文件中读取数据?

【问题讨论】:

    标签: google-cloud-ml


    【解决方案1】:

    您说得对,Python 的“open”不能与 GCS 一起使用。鉴于您使用的是 TensorFlow,您可以改用 file_io 库,它既适用于本地文件,也适用于 GCS 上的文件。

    from tensorflow.python.lib.io import file_io
    pickle.loads(file_io.read_file_to_string('gs://my-bucket/path/to/pickle'))
    

    注意:pickle.load(file_io.FileIO('gs://..', 'r')) 似乎不起作用。

    欢迎您使用适合您的任何数据格式,不限于 CSV 或 TFRecord(您介意指出文档中提出该声明的位置吗?)。如果数据适合内存,那么您的方法是明智的。

    如果数据不适合内存,您可能需要使用 TensorFlow 的 reader framework,其中最方便的往往是 CSV 或 TFRecords。 TFRecord 只是一个字节字符串的容器。最常见的是,它包含支持稀疏数据的序列化tf.Example 数据(它本质上是一个地图)。有关解析 tf.Example 数据的更多信息,请参阅tf.parse_example。

    【讨论】:

    • 感谢您的详细回答,尽快尝试您的解决方案!我调查了 TFRecords,但我不确定如何将它用于稀疏数据。我知道对于像 mnist 这样的密集数组,您可以将 784 维数组编码为每个示例的一个特征。我想对于稀疏数据,我需要分别对每个特征进行编码,并在数据丢失时设置一个默认值(0)。我说的对吗?
    • 对稀疏数据进行编码有多种方式。你想编码什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2017-03-26
    相关资源
    最近更新 更多