使用 Tensorflows c++ API 时使用大于 1 的批处理大小

Using a batchsize greater than 1 when using Tensorflows c++ API

本文关键字:批处理 大于 c++ Tensorflows API 使用      更新时间:2023-10-16

我有一个用Python训练的Tensorflow模型,并用freeze_graph脚本冻结。我已经成功地用 c++ 加载了模型,并对单个图像进行了推理。但是,似乎freeze_graph一次只能将 batchsize 设置为单个图像,因为我无法向模型传递具有多个图像的张量。

有谁知道改变这种情况的方法?我无法找到它在脚本中实际发生的位置。

谢谢!

编辑:

好的,所以我废弃了 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 x 50 x 50 x 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>()解决了我的问题。