Tensorflow C应用编程接口:SessionRun批处理大小(如何正确设置)

tyg4sfes  于 2022-10-29  发布在  其他
关注(0)|答案(9)|浏览(118)

系统信息

*我是否编写了自定义代码(而不是使用TensorFlow中提供的常用示例脚本):是的
*操作系统平台和分发(例如Linux Ubuntu 16.04):Ubuntu 18.04版
*移动的设备(例如iPhone 8、Pixel 2、Samsung Galaxy)(如果问题发生在移动设备上):不可以
*TensorFlow安装自(源代码或二进制):来源
*TensorFlow版本(使用下面的命令):1.10
*Python版本:3.6
*Bazel版本(如果从源代码编译):0.16.1
*GCC/编译器版本(如果从源代码编译):7.3.0
*CUDA/cuDNN版本:9.2 / 7.3版本
*GPU型号和内存:英伟达GTX 1070 ti

尊敬的先生们:
我正在努力寻找正确的方法来为CAPI中的SessionRun调用设置批处理大小。
我试图做的是在一个单一的SessionRun中将多个图像传递给CNN(VGG 16)。
我想知道哪种方法是正确的,并检索适当的相关输出值。
我也开始相信,一个SessionRun调用只能接受一个图像作为输入,所以一个正确的批处理输入只能通过多个SessionRun调用(例如在“for”循环中)来实现,每个调用都有一个图像。我说的对吗?对于一个单输入CNN,有没有一种方法可以在一个SessionRun调用中批处理多个图像?
我已经彻底搜索了你的文件,但我找不到任何证据,一个适当的指示如何做到这一点。
顺祝商祺

hwazgwia

hwazgwia1#

session.run执行一个图形。一个图形可以有任意数量的输入图像作为其输入管道的一部分。通常,您将使用tf.data.Dataset API来定义数据输入层,并为您的模型确定适当的批处理大小。
人们可能会要求你把这个贴在stackoverflow之类的东西上,因为这可能不是最好的要求:)

k2arahey

k2arahey2#

就我个人而言,我也认为文档缺少关于如何正确执行批处理推理步骤的指示。
@sabhiram,您指出模型必须有一个允许多个输入的输入管道,但我使用的是单个图像输入层(因为我在Keras上使用的是完全相同的模型),我相信我应该能够在该网络上执行批处理推理。
如果我在循环中使用SessionRun(在同一个图形上),我是否会引入一个开销,这是因为每次在gpu上加载一个图像和一个图形所需的开销时间造成的?
谢谢大家的关注。
由于我个人认为文档缺少一些信息,这个地方应该是要求答案的正确地方:)

8cdiaqws

8cdiaqws3#

我真的需要这个问题的帮助,因为它阻碍了我的工作(我在文档中没有找到任何建议)。
我试过这些伪代码:(调用这些代码SISO =单输入单输出,而MIMO =多输入多输出,输入是batch_size * 50 * 50 * 3,在SISO中batch_size = 1,在MIMO中batch_size = 3;请记住,我使用的是VGG 16图表)
SISO:

loadGraph()
TF_NewSession()
TF_AllocateTensor( 1 * 50 * 50 * 3)
// copy data into tensor
num_bytes = rows() * cols() * channels() * sizeof(float);
memcpy(tensor_data, img_data, num_bytes)
TF_SessionRun()
data = static_cast<float*>(TF_TensorData(output_tensor));
// data[0] = frame number
// data[1] = probabily of prediction
out = (data[1] > 0.5f) ? true : false;

对于SISO,我总是有正确的输出。
多输入多输出:

loadGraph()
TF_NewSession()
TF_AllocateTensor( 3 * 50 * 50 * 3)
// copy data into tensor
num_bytes = rows() * cols() * channels() * sizeof(float);
offset = 0;
for(size_t i = 0; i < 3; ++i)
{
   memcpy(tensor_data + offset, imgs_data[i], num_bytes);
   offset += num_bytes;
}
TF_SessionRun()
data = static_cast<float*>(TF_TensorData(output_tensor));
offset = 0;
num_bytes = 2 * sizeof(float);
// data[i] = frame number
// data[i+1] = probabily of prediction
for(size_t i = 0; i < 3; ++i)
    {
        out[i] = (*(data + offset + 1) > 0.5f) ? true : false;
        offset += num_bytes;
    }

对于MIMO,只有第一个分类输出值是正确的,其它都是随机数。
这段代码有什么问题?

nwwlzxa7

nwwlzxa74#

@EnricoGiordano1992您不应该在此行中使用data[i+1]

out[i] = (*(data + offset + 1) > 0.5f) ? true : false;
ybzsozfc

ybzsozfc5#

@wt-huang好像有什么东西变了,但是我的输出不对。
输入Tensor设置怎么样?有什么问题吗?

uint8_t * tensor_data = static_cast<uint8_t *>(TF_TensorData(input_tensor));
    const size_t num_bytes = rows() * cols() * channels() * sizeof(float); // 50 * 50 * 3 * 4
    size_t offset = 0;
    for(size_t i = 0; i < batch_sz; ++i)
    {
        std::memcpy((tensor_data + offset), actual_in.at(i).data, num_bytes);
        offset += num_bytes;
    }
km0tfn4u

km0tfn4u6#

有什么建议吗?

wtlkbnrh

wtlkbnrh7#

有什么建议吗?

iyfamqjs

iyfamqjs8#

有什么进展吗?

qojgxg4l

qojgxg4l9#

这方面有什么新进展吗?2我工作也是如此

相关问题