如何计算Tensorflow c+中的梯度+;基于保存的图形的API 我想用TysFooS+C++ API计算梯度。我在Python API中使用了tf.gradients: import tensorflow as tf with tf.Session() as sess: a = tf.Variable([[5.0,1.0,2.0]], name='a') b = tf.Variable([[9.0,2.0,0.0]], name='b') c = tf.matmul(a, tf.transpose(b), name="c") deriv = tf.gradients(c,a, name="deriv") #\partial c/\partial a sess.run(tf.global_variables_initializer()) print(sess.run(deriv)) #### get the tensor by name #### tmp = tf.get_default_graph().get_tensor_by_name("deriv/c_grad/MatMul:0") print(sess.run(tmp)) #### save graph #### tf.train.write_graph(sess.graph_def, './', 'graph.pb', as_text=False) tf.train.write_graph(sess.graph_def, './', 'graph.pbtxt', as_text=True) saver = tf.train.Saver() saver.save(sess, "variable", global_step=0)

如何计算Tensorflow c+中的梯度+;基于保存的图形的API 我想用TysFooS+C++ API计算梯度。我在Python API中使用了tf.gradients: import tensorflow as tf with tf.Session() as sess: a = tf.Variable([[5.0,1.0,2.0]], name='a') b = tf.Variable([[9.0,2.0,0.0]], name='b') c = tf.matmul(a, tf.transpose(b), name="c") deriv = tf.gradients(c,a, name="deriv") #\partial c/\partial a sess.run(tf.global_variables_initializer()) print(sess.run(deriv)) #### get the tensor by name #### tmp = tf.get_default_graph().get_tensor_by_name("deriv/c_grad/MatMul:0") print(sess.run(tmp)) #### save graph #### tf.train.write_graph(sess.graph_def, './', 'graph.pb', as_text=False) tf.train.write_graph(sess.graph_def, './', 'graph.pbtxt', as_text=True) saver = tf.train.Saver() saver.save(sess, "variable", global_step=0),tensorflow,deep-learning,Tensorflow,Deep Learning,我从print(sess.run(deriv))和print(sess.run(tmp))中得到了正确答案,并生成了graph.pb。然后我尝试使用下面的C++代码加载图表,并以与Python中类似的方式进行梯度计算。 #include "tensorflow/core/public/session.h" #include "tensorflow/core/platform/env.h" #include "tensorflow/cc/framework/ops.h" void checkSt

我从
print(sess.run(deriv))
print(sess.run(tmp))
中得到了正确答案,并生成了graph.pb。然后我尝试使用下面的C++代码加载图表,并以与Python中类似的方式进行梯度计算。
#include "tensorflow/core/public/session.h"
#include "tensorflow/core/platform/env.h"
#include "tensorflow/cc/framework/ops.h"

void checkStatus(const tensorflow::Status& status) {
  if (!status.ok()) {
    std::cout << status.ToString() << std::endl;
    exit(1);
  }
}

int main(int argc, char** argv) {
    namespace tf = tensorflow;

    tf::Session* session;
    tf::Status status = tf::NewSession(tf::SessionOptions(), &session);
    checkStatus(status);

    tf::GraphDef graph_def;
    status = ReadBinaryProto(tf::Env::Default(), "graph.pb", &graph_def);
    checkStatus(status);

    status = session->Create(graph_def);
    checkStatus(status);

    tf::Input::Initializer xi({1.0,2.0,-6.0});
    tf::Input::Initializer yi({9.0,2.0,0.0});
    std::vector<std::pair<tf::string, tf::Tensor>> input_tensors = {{"a", xi.tensor}, {"b", yi.tensor}};
    std::vector<tf::Tensor> output_tensors;
    status = session->Run(input_tensors, {"deriv/c_grad/MatMul"}, {},  &output_tensors);
    checkStatus(status);

    tf::Tensor output = output_tensors[0];
    auto out = output.vec<float>();
    std::cout << out(0) << " " << out(1) << " " << out(2) <<  std::endl;
    session->Close();
    return 0;
}
#包括“tensorflow/core/public/session.h”
#包括“tensorflow/core/platform/env.h”
#包括“tensorflow/cc/framework/ops.h”
无效检查状态(常量tensorflow::状态和状态){
如果(!status.ok()){
std::cout Run(输入张量,{“deriv/c_grad/MatMul”},{},&输出张量);
检查状态(状态);
tf::张量输出=输出_张量[0];
auto out=output.vec();

std::cout看起来您没有正确初始化yi输入张量

Internal: Output 0 of type double does not match declared output type float
for node _recv_b_0 = _Recvclient_terminated=true,
recv_device="/job:localhost/replica:0/task:0/cpu:0",
send_device="/job:localhost/replica:0/task:0/cpu:0",
send_device_incarnation=-3399984051910545345, 
tensor_name="b",tensor_type=DT_FLOAT,
_device="/job:localhost/replica:0/task:0/cpu:0"
在示例中,您将yi初始化为双倍:

tf::Input::Initializer yi({9.0,2.0,0.0});
您可能应该尝试一下(注意添加了f):

tf::Input::Initializer yi({9.0f, 2.0f, 0.0f});