我在C ++中有tensorflow::Tensor batch
形状[2,720,1280,3](#images x height x width x #channels)。
我想得到另一个只有第一张图像的张量,因此我会有一个形状张量[1,720,1280,3]。换句话说,我想:
tensorflow::Tensor first = batch[0]
实现它的最有效方法是什么?
我知道如何在python中执行此操作,但C ++ api和文档不如python的那么好。
答案 0 :(得分:2)
在花了一些时间尝试通过副本实现后,我意识到API中支持此操作为Slice
:
tensorflow::Tensor first = batch.Slice(0, 1);
请注意,如文档所述,返回的张量与内容缓冲区共享内部缓冲区,如果与您相关,则两个张量的对齐方式可能不同。
编辑:
因为我已经完成了,所以这是我尝试再现相同的功能,基于复制。我认为它应该有用(它与我在其他环境中使用的非常相似)。
#include <cstdlib>
#include <cassert>
#include <tensorflow/core/framework/tensor.h>
#include <tensorflow/core/framework/tensor_shape.h>
tensorflow::Tensor get_element(const tensorflow::Tensor data, unsigned int index, bool keepDim)
{
using namespace std;
using namespace tensorflow;
typedef typename tensorflow::DataTypeToEnum<T> DataType;
auto dtype = DataType::v();
assert(dtype == data.dtype());
auto dtype = data.dtype();
auto dataShape = data.shape();
TensorShape elementShape;
if (keepDim)
{
elementShape.addDim(1);
}
for (int iDim = 1; iDim < dataShape.dims(); iDim++) {
elementShape.AddDim(dataShape.dim_size(iDim));
}
Tensor element(dtype, elementShape);
auto elementBytes = elementShape.num_elements() * DataTypeSize(dtype);
memcpy(element.flat<void>().data(),
batch.flat<void>().data() + elementBytes * index,
elementBytes);
return element;
}
int main()
{
Tensor batch = ...;
Tensor first = get_element(batch, 0);
return 0;
}
如果您只想将数据提取到例如矢量或其他内容,也可以更改代码。
答案 1 :(得分:0)
这很好
#include "tensorflow/core/framework/tensor_slice.h"
Tensor t2 = t1.Slice(0,1);