首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查失败:1 == NumElements() (1 vs. 2)必须有一个元素张量

检查失败:1 == NumElements() (1 vs. 2)必须有一个元素张量
EN

Stack Overflow用户
提问于 2018-08-13 05:29:58
回答 1查看 417关注 0票数 2

我想通过使用tensorflow C++ API进行预测,但是出现了一个错误:

检查失败:1 == NumElements() (1 vs. 2)必须有一个元素张量

这是准备输入的代码:

代码语言:javascript
运行
复制
tensorflow::Tensor loadImage(tensorflow::string fname){
    tensorflow::int32 width = 224;
    tensorflow::int32 height = 224;
    tensorflow::int32 nData = 1;
    tensorflow::int32 nVec = width*height;
    tensorflow::int32 channels = 3;
    auto tensor = tensorflow::Tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({1, height, width, channels}));
    auto mat = tensor.tensor<float, 4>();
    std::ifstream fin(fname, std::ios_base::in | std::ios_base::binary);
    assert(!fin.fail());
    boost::iostreams::filtering_istream s;
    s.push(fin);
    char c;
    for(int i=0;i<nData;i++){
        for(int j=0;j<channels;j++){
            for(int h=0;h<height;h++){
                for(int w=0;w<width;w++){
                    s.get(c);
                    mat(i, j, h, w) = static_cast<float>(static_cast<uint8_t>(c)) / 255.0;
                }
            }
        }
    }std::cout << "Image Loaded" << std::endl;
    return tensor;
}

执行此代码后,我得到了以下错误:

代码语言:javascript
运行
复制
status = session->Run(inputs, {"output_node0"}, {}, &outputs);
auto output_c = outputs[0].scalar<float>(); // an error occurred

我在这里发现了类似的问题。根据此页的说法,看起来我可以通过修改下面的代码来解决问题。

从…

代码语言:javascript
运行
复制
auto output_c = outputs[0].scalar<float>();

代码语言:javascript
运行
复制
auto output_c = outputs[0].flat<float>();

但是,我遇到了构建错误。想了解更多信息..。

代码语言:javascript
运行
复制
error: static assertion failed: YOU_MADE_A_PROGRAMMING_MISTAKE
 #define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);/tmp/tensorflow/include/unsupported/Eigen/CXX11/src/Tensor/TensorMap.h:224:7: note: in expansion of macro 'EIGEN_STATIC_ASSERT'
       EIGEN_STATIC_ASSERT(NumIndices == 0, YOU_MADE_A_PROGRAMMING_MISTAKE)

错误的原因是什么?

EN

回答 1

Stack Overflow用户

发布于 2018-08-13 09:36:00

错误的原因是什么?

哪个?你有好几个。当只显示几行不相关的代码时,这两个问题都无法得到回答。

loadImage看起来很好。但是这个会议运行的电话看起来很奇怪。它应该是

代码语言:javascript
运行
复制
std::vector<tensorflow::Tensor> outputs;
tensorflow::ClientSession session(root);
TF_CHECK_OK(session.Run({some_operation}, &outputs));
float *result_float_data = outputs[0].flat<float>().data();

但这些取决于您使用的实际图表。

不管怎样,您的实现有点麻烦。我想你只是想把一个图像输入到一个图表中。在C++和TensorFlow中读取图像有两种简单得多的解决方案。

纯TensorFlow版本只是

代码语言:javascript
运行
复制
tensorflow::Scope root = tensorflow::Scope::NewRootScope();

std::string fn = "Grace_Hopper.png";

auto net1 = tensorflow::ops::ReadFile(root, fn);
auto net2 = tensorflow::ops::DecodePng(root, net1);
auto net3 = tensorflow::ops::Cast(root, net2, tensorflow::DT_FLOAT);
auto net4 = tensorflow::ops::ExpandDims(root, net3, 0);
// do something here
auto net5 = tensorflow::ops::ResizeBilinear(root, net4, tensorflow::ops::Const(root, {2 * 606, 2 * 517}));
auto net6 = tensorflow::ops::Reshape(root, net5, tensorflow::ops::Const(root, {2 * 606, 2 * 517, 3}));
// convert back
auto net7 = tensorflow::ops::Cast(root, net6, tensorflow::DT_UINT8);
auto net8 = tensorflow::ops::EncodeJpeg(root, net7);

std::vector<tensorflow::Tensor> outputs;
tensorflow::ClientSession session(root);

// Run and fetch v
TF_CHECK_OK(session.Run({net8}, &outputs));
std::ofstream("output.jpg", std::ios::binary) << outputs[0].scalar<std::string>()();

TensorFlow+OpenCV版本有一个再多几行

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51815701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档