当使用Tensorflows时,使用大于1的批处理大小C++ API
问题描述:
我有一个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
当我冻结图表时,某处必须发生什么?
答
原来,这是我的一个愚蠢的错误。当获得图表的输出时,我在它上面调用了.scalar<float>()
。当我只有一个输入图像,因此只有一个输出,但是显然我不能将一个矢量转换为标量时,这种工作非常好。将其更改为.flat<float>()
解决了我的问题。
'freeze_graph'不会'设置'模型的批量大小。您如何在原始模型中输入输入信息? – keveman
我已经使用Keras构建了模型,我相信它使用默认的可变批量。这让我假设'freeze_graph'必须在尺寸可变的占位符的情况下做一些事情,但我可能是错的。有没有一种方法可以检查占位符的形状实际上是什么? – ppries
您可以尝试使用'graph.as_graph_def()'以文本形式打印图形,并查看占位符是否设置了形状属性。 – keveman