Я хотел сериализовать 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 об этом?