【问题标题】:Initialize variables in Tensorflow C++ API在 Tensorflow C++ API 中初始化变量
【发布时间】:2017-11-30 04:56:45
【问题描述】:

我无法找到在 Tensorflow 的 C++ API 中初始化变量的有效方法。我正在尝试为 MNIST 数据集制作一个基本的全连接单层神经网络。

目前,我发现正确的做法是这样的:

TF_CHECK_OK(session->Run({}, {}, {"init_all_vars_op"}, nullptr));

但是,使用它会返回以下错误:

tensorflow/cc/example/example.cc:178:71: error: no matching function for call to 'tensorflow::ClientSession::Run(<brace-enclosed initializer list>, <brace-enclosed initializer list>, <brace-enclosed initializer list>, std::nullptr_t)'.

有没有人遇到过这种情况?如果有,您是如何解决的?

编辑:我应该补充一点,如果我删除了初始化我使用的变量的任何尝试,并且只运行它会编译的会话,但它会返回:

2017-06-27 11:31:12.861244: W tensorflow/core/platform/cpu_feature_guard.cc:45] TensorFlow 库未编译为使用 SSE4.1 指令,但这些在您的计算机上可用并且可以加快 CPU 计算速度。

2017-06-27 11:31:12.862007: W tensorflow/core/platform/cpu_feature_guard.cc:45] TensorFlow 库未编译为使用 SSE4.2 指令,但这些指令在您的计算机上可用并且可以加快 CPU 计算速度。

2017-06-27 11:31:12.862433: W tensorflow/core/platform/cpu_feature_guard.cc:45] TensorFlow 库未编译为使用 AVX 指令,但这些在您的计算机上可用并且可以加快速度CPU 计算。

2017-06-27 11:31:12.866282:F tensorflow/cc/example/example.cc:180] 非 OK 状态:session->Run(feed ,{y_pred} ,&outputs) 状态:前置条件失败: 尝试使用未初始化的值权重

[[节点:MatMul = MatMul[T=DT_FLOAT, transpose_a=false, transpose_b=false, _device="/job:localhost/replica:0/task:0/cpu:0"](_arg_x_0_0, weights)] ]

/usr/bin/bazel 以代码 8 退出

【问题讨论】:

    标签: c++ tensorflow


    【解决方案1】:

    看起来代码没有通过对 session.run 的调用进行编译。这可能是由于有问题的类型推断,因为 tensorflow::ClientSession::Run 被许多不同的签名重载。尝试用显式类型名称替换 {} 初始化器。

    【讨论】:

    • 感谢您的建议,但我已经尝试过了,问题在于该特定 tensorflow::ClientSession::Run 签名中的第三个参数 ({"init_all_vars_op"})应该是 tensorflow::core::Operation 类型,但 Operation 没有接收字符串作为参数或使用字符串的方法的构造函数。但是,我发现的示例用例以这种方式使用它。我假设 API 已更新,但没有替换全局变量初始化器。
    • ClientSession 不能接受字符串,但原始 tensorflow 会话可以,这就是您所看到的示例。要使用 clientsession,您需要在构建图形时保留您已构建的张量对象的句柄并将其传入。
    • 是的,但是这里的问题不是我不能将字符串字面量传递给ClientSession,而是C++中没有明显的方法来全局初始化变量。
    【解决方案2】:

    我设法找到了一种解决方案,该解决方案仅适用于变量的初始状态不重要的上下文。您可以使用 Assign 方法最初为变量分配值 0,因为 Assign 不需要事先初始化变量。这个初始化应该在训练循环之前完成:

    auto init_value = Const(root, 0);
    
    auto assign = Assign(root.WithOpName("assign"), var, init_value);
    

    我尚未对此代码 sn-p 运行测试,但它可以在我当前的源代码中编译。

    【讨论】:

    • 我设法运行了这段代码,这个解决方案有效,因为 Assign 类为你初始化了变量,据我所见,C++ 中没有全局变量初始化器时刻。
    猜你喜欢
    • 2017-06-16
    • 2019-01-23
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    相关资源
    最近更新 更多