【问题标题】:How to serialize a libtorch vector of tuple(std::string, torch::Tensor) using protobuf?如何使用protobuf序列化元组(std :: string,torch :: Tensor)的libtorch向量?
【发布时间】:2020-08-02 08:29:46
【问题描述】:

我应该如何定义 ProtoBuf 架构,以便我可以序列化这个形状向量?

std::vector<std::tuple(std::string, torch::Tensor)>

我能找到的只是简单的琐碎示例。我不知道应该如何在 ProtoBuf 架构中定义 torch::Tensor 或 tuple!

【问题讨论】:

  • 看这个帖子:github.com/pytorch/pytorch/issues/19025#issuecomment-482308272。一种解决方案是使用std::stringstream (torch::save()) 转换为std::string,将其序列化为字符串,然后从其中加载并转换回torch::Tensor (torch::load())。
  • @Azeem 非常感谢。但我需要将它们序列化为一个元组而不是单独!
  • 嗯,在 ProroBuf 中,您会将它们组合在一起作为一条消息,对吧?请使用您的 .proto 定义更新您的问题,这将有助于了解您如何将其可视化。
  • 消息中的key 似乎您需要map。示例:map&lt;string, string&gt; lookup = 1; 其中键是字符串,值 torch::Tensor 也是由 torch::save() 生成的字符串。
  • 对。您可以只使用torch::Tensor 的字符串表示形式。 map 类似于 std::unordered_map。这是一个自定义实现。请参阅其 API here。对于重复的键,您可以使用如下内容:godbolt.org/z/qqd6d5.

标签: c++ protocol-buffers tensor libtorch


【解决方案1】:

您可以在 ProtoBuf 架构中使用 string 来表示 torch::Tensor。

例子:

syntax = "proto3";

package tensor;

message Lookup {
    message Tuple {
        string key = 1;
        string tensor = 2;
    }

    repeated Tuple tuples = 1;
}

使用torch::save() 和torch::load() API 通过std::stringstream 与std::string 进行转换,如here 所述。

【讨论】:

  • 嗨,我应该如何添加到 Lookup?它似乎没有任何设置或添加方法!
  • 它提供的唯一添加方法,不带任何参数!及其add_tuples!
  • 好的,知道了。我首先必须从元组创建一个新的元组对象,然后更新元组!:tensor::Tuple vec; auto record = vec.add_tuples(); record.set_key("key"); record.set_tensor("tensor");,这样,vec 就被填满了!如果你问我,那就太不直观了!
  • @Rika:嗨。是的,一开始是这样的。您可能想查看repeated 字段的相关API,请参阅here。方法add_tupes() 将返回一个指向新添加元素的指针,因此它将是record-&gt;set_key("key"); 和record-&gt;set_tensor("tensor");。
  • 是的,我已经解决了这个问题,非常感谢您的慷慨帮助,非常感谢兄弟;)
猜你喜欢
  • 2020-12-07
  • 2015-01-18
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 2012-01-06
相关资源
最近更新 更多