2016-07-06 29 views
0

我有一个Tensorflow模型在Python中训练并且使用freeze_graph脚本进行冻结。我已经用C++成功加载了模型,并对单个图像进行了推理。但是,似乎freeze_graph一次只将批量设置为单个图像,因为我无法将模型张量传递给多个图像。当使用Tensorflows时,使用大于1的批处理大小C++ API

有没有人知道改变这种方式?我一直无法找到脚本实际发生的位置。

谢谢!

编辑:

好了,所以我报废Keras只是为了消除任何黑色魔力,可能会做的,我定义与Tensorflow网络时设置16的批量大小。

如果我DEF打印图形,占位符的形状:

node { 
    name: "inputs" 
    op: "Placeholder" 
    attr { 
    key: "dtype" 
    value { 
     type: DT_FLOAT 
    } 
    } 
    attr { 
    key: "shape" 
    value { 
     shape { 
     dim { 
      size: 16 
     } 
     dim { 
      size: 50 
     } 
     dim { 
      size: 50 
     } 
     dim { 
      size: 3 
     } 
     } 
    } 
    } 
} 

然而,当我试图加载并与形状16×50×50×3的张量运行在C++模型,我得到这个错误:

tensorflow/core/framework/tensor.cc:433] Check failed: 1 == NumElements() (1 vs. 16)Must have a one element tensor 

当我冻结图表时,某处必须发生什么?

+0

'freeze_graph'不会'设置'模型的批量大小。您如何在原始模型中输入输入信息? – keveman

+0

我已经使用Keras构建了模型,我相信它使用默认的可变批量。这让我假设'freeze_graph'必须在尺寸可变的占位符的情况下做一些事情,但我可能是错的。有没有一种方法可以检查占位符的形状实际上是什么? – ppries

+0

您可以尝试使用'graph.as_graph_def()'以文本形式打印图形,并查看占位符是否设置了形状属性。 – keveman

回答

0

原来,这是我的一个愚蠢的错误。当获得图表的输出时,我在它上面调用了.scalar<float>()。当我只有一个输入图像,因此只有一个输出,但是显然我不能将一个矢量转换为标量时,这种工作非常好。将其更改为.flat<float>()解决了我的问题。