c++ - 存储对象以供将来使用(在重新启动程序时)

标签 c++ vector std

我正在用 C++ 实现类似于神经网络的东西。学习后,我留下了一个具有特定权重和 int 节点之间相互连接的网络。有什么方法可以存储这个学到的网络以供将来使用吗?

我能想到的唯一方法是创建一个遍历每个节点的程序,将权重和连接存储到一个文件中,然后在我想使用它时重新创建网络。我打算这样做,但我想知道是否有更好的解决方案?

我的意思是在堆上创建一个网络,“学习”,然后将其存储为一个文件。这样我以后就可以不用经过学习过程就可以使用这个我后来学的网络。

我要存储的类有一个 std::vector of std::tuple,其中包含指针和一个 float 。 我要存储的这个类也是由其他类组成的。

最佳答案

听起来您可以将它存储在 boost 属性树中(它可以将自身写入 xml 或 json)。

下面的示例假设您首先将指针转换为索引。那是;我假设每个节点都有一个数字,然后一个指针 只是指向该节点的另一个索引。

我同意许多评论者建议检查升压序列化(特别是关于指针),但对于您描述的问题和小数据,这会很有效。 目前,它写入大约 25000 个节点/秒(仅),1e4 个节点的文件大小约为 15MB。

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <tuple>
#include <vector>

int main() {

    using boost::property_tree::ptree;

    using Node = std::tuple<double, size_t, size_t>;
    std::vector<Node> nodes;

    // example filling
    nodes.emplace_back(0.1, 1, 1);
    nodes.emplace_back(1.1, 2, 1);
    nodes.emplace_back(2.1, 1, 3);
    nodes.emplace_back(3.1, 0, 2);

    ptree pt_nodes;

    for (auto i = size_t(0); i < nodes.size() ; ++i) {
        const auto& node = nodes[i];
        ptree pt_node;
        pt_node.put("id", i);
        pt_node.put("w0", std::get<0>(node));
        pt_node.put("ptrA", std::get<1>(node));
        pt_node.put("ptrB", std::get<2>(node));
        pt_nodes.push_back(std::make_pair("node"+std::to_string(i), pt_node));
    }

    ptree pt_all;
    pt_all.add_child("nodes", pt_nodes);
    write_json("test1.json", pt_all);

结果是这样的:

 {
    "nodes":
    {
        "node0":
        {
            "id": "0",
            "w0": "0.1",
            "ptrA": "1",
            "ptrB": "1"
        },
        "node1":
        {
            "id": "1",
            "w0": "1.1",
            "ptrA": "2",
            "ptrB": "1"
        },
        "node2":
        {
            "id": "2",
            "w0": "2.1",
            "ptrA": "1",
            "ptrB": "3"
        },
        "node3":
        {
            "id": "3",
            "w0": "3.1",
            "ptrA": "0",
            "ptrB": "2"
        }
    }
}

将其读回 vector :

ptree pt_in;
read_json("test1.json", pt_in);
const auto pt_in_nodes = pt_in.get_child("nodes");
std::vector<Node> in_nodes(pt_in_nodes.size(), {});

for (const auto iter : pt_in_nodes)
{
    const auto ind = iter.second.get<size_t>("id");
    const auto w0 = iter.second.get<double>("w0");
    const auto ptrA= iter.second.get<size_t>("ptrA");
    const auto ptrB= iter.second.get<size_t>("ptrB");
    //std::cout << "id: " << ind << std::endl;
    //std::cout << "w0: " << w0 << std::endl;
    //std::cout << "ptrA: " << w1<< std::endl;
    //std::cout << "ptrB: " << ptr << std::endl;
    in_nodes.at(ind) = std::make_tuple(w0,ptrA,ptrB);
}

关于c++ - 存储对象以供将来使用(在重新启动程序时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33699516/

相关文章:

c++ - 如何检查 std::string 是否确实是整数?

c++ - 警告 C4190 C 联动指定

java - 使用 vector 计算日期之间的天数差异

c++ - 当我的代码在函数范围之外时,为什么会出现编译器错误 "does not name a type"?

c++ - std::experimental::filesystem::recursive_directory_iterator 跳过文件夹及其子文件夹

c++ - 元素如何在 vector 中找到自己的索引?

c++ - 在 Intel Iris Graphics 6100 (MBP 2015) 上实现 OpenCL 的 OSX vector 宽度

c++ - c++中 vector 和列表的setter和getter

c++ - cstdlib 和 stdlib.h 有什么区别?

c++ - 动态分配的对象是否默认初始化?