Как сериализовать вектор кортежа (строки, тензоры) в libtorch? - PullRequest
0 голосов
/ 02 августа 2020

Я хотел сериализовать vector<std::tuple<std::string, torch::Tensor>> в libtorch. Я заметил поддержку libtorch, сериализацию тензора и вектора тензоров. Я попытался сохранить свой файл, используя OutputArchive, например:

template <typename... SaveToArgs>
void save(const std::vector<std::tuple<std::string, torch::Tensor>>& tensor_vec, SaveToArgs&&... args) 
{
    torch::serialize::OutputArchive archive(std::make_shared<torch::jit::CompilationUnit>());
    for (size_t i = 0; i < tensor_vec.size(); i+=2) 
    {
        auto& key_value = tensor_vec[i];
        auto key_name= std::get<0>(key_value);
        auto value_tensor = std::get<1>(key_value);

        archive.write(c10::to_string(i), key_name);
        archive.write(c10::to_string(i+1), value_tensor);
    }
    archive.save_to(std::forward<SaveToArgs>(args)...);

}

, и он был сохранен. Однако реальная проблема, похоже, связана с загрузкой, поскольку InputArchive не поддерживает строки. так как простая попытка:

template <typename... LoadFromArgs>
void load(std::vector<std::tuple<std::string, torch::Tensor>>& tensor_vec, LoadFromArgs&&... args)
{
    torch::serialize::InputArchive archive;
    archive.load_from(std::forward<LoadFromArgs>(args)...);

    // NOTE: The number of elements in the serialized `std::vector<torch::Tensor>`
    // is not known ahead of time, so we need a while-loop to increment the index,
    // and use `archive.try_read(...)` to check whether we have reached the end of
    // the serialized `std::vector<torch::Tensor>`.
    size_t index = 0;
    torch::Tensor value;
    std::string key_value;
    while (archive.try_read(c10::to_string(index), key_value))
    {
        archive.try_read(c10::to_string(index+1), value);
        tensor_vec.push_back(std::make_tuple(key_value, std::move(value)));
        value = torch::Tensor();
        key_value = "";
        index+=2;
    }
}

терпит неудачу. InputArchive является окончательным, поэтому я не могу его продлить. Я думал о добавлении нового try_read, где он будет принимать строку. но опять же, я заметил, что модуль нужно загрузить заранее, поэтому теперь мне нужно знать, как загрузить файл, а затем выполнить read_try.

Я застрял здесь; как мне go об этом?

...