Tensorflow C API占位符/输入变量设置

时间:2018-01-05 13:46:58

标签: tensorflow

我正在尝试使用TensorFlow C-API来运行从Keras / TF模型中保存的LeNet实现,但是我在设置输入时遇到了一致的问题。相关的代码是:

  // Load the image with openCV
  CvMat * img = cvLoadImageM(argv[1], CV_LOAD_IMAGE_COLOR );

  // Create an Tensor from the image
  int64_t dims4[]={1,1,28,28};
  TF_Tensor * imgTensor = TF_NewTensor(TF_FLOAT,dims4,4,img,28*28*sizeof(float),NULL,NULL);


  TF_Operation* init_op2 = TF_GraphOperationByName(graph, "conv2d_1_input");
  TF_Operation* targets[] = {init_op2};

  // Build up the inputs
  TF_Output inp = {
          init_op2,
          0
  };
  TF_Output * inputs[] = {&inp};
  TF_Tensor * input_values[] = {imgTensor};

  printf("\nBefore\n");
  TF_SessionRun(session, NULL,
                &inp, inputvalues, 1,  // inputs
               NULL, NULL, 0,  // outputs
                &init_op2, 1,    // targets
                NULL,
                status);
  printf("After\n");
  printf("Status %d %s\n", TF_GetCode(status), TF_Message(status));

然而,无论如何我尝试建立输入张量,我得到错误状态和消息:

Status 3 You must feed a value for placeholder tensor 'conv2d_1_input' with dtype float and shape [?,1,28,28]
     [[Node: conv2d_1_input = Placeholder[_output_shapes=[[?,1,28,28]], dtype=DT_FLOAT, shape=[?,1,28,28], _device=...]()]]

有关我做错的任何建议吗?

1 个答案:

答案 0 :(得分:1)

在致电TF_SessionRun时,您还提供conv2d_1_input操作作为"目标"。错误信息可以改进,但它基本上抱怨你要求会话执行占位符操作,这是不可能的 - 这是不可能的(参见下面的说明) tf.placeholder

的文档

你不应该要求targetoutput来自TF_SessionRun的呼叫,而不是:{/ p>

TF_Output out = { TF_GraphOperationByName(graph, "<name_of_output_tensor>"), 0 };

TF_Tensor* outputvalues = NULL;
TF_SessionRun(session, NULL,
              &inp, inputvalues, 1,  // inputs
              &out, &outputvalues, 1,  // outputs
              NULL, 0,  // targets
              NULL, status);

希望有所帮助。