没有注册任何OPKernel支持这些属性的Op'Equal'

时间:2018-11-29 10:18:23

标签: c++ ios objective-c tensorflow

尝试使用以下工具加载我的TensorFlow模型时出现以下错误:

Xcode(最新)

TensorFlow实验版V1.1.1(使用Pod安装)

C ++

我能够毫无问题地创建TensorFlow会话,并且能够将TensorFlow模型读入GraphDef,但是当我尝试使用活动的TensorFlow会话创建模型时,出现以下问题。

  

无效的参数:没有注册任何OpKernel支持这些属性的Op'Equal'。

     

已注册的设备:

     

[CPU]

     

注册内核:

     

device ='CPU'; [DT_FLOAT]中的T [[节点:等于=等于[T = DT_INT32,_output_shapes = [[]]](等级,等于)]]

这是我当前代码的外观

tensorflow::Session* sessionPointer = nullptr;
const tensorflow::SessionOptions options;

tensorflow::Status newSessionStatus = tensorflow::NewSession(options, &sessionPointer);

[MachineLearning checkTensorflowStatus:newSessionStatus];

std::unique_ptr<tensorflow::Session> session(sessionPointer);

// Create a point to the tensorflow graph
tensorflow::GraphDef tensorflowGraph;

// Get the model file path
NSString* filePath = FilePathForResourceName(@"frozen_inference_graph", @"pb");

// Read the data into the TensorflowGraph
auto fileConverteredToProto = PortableReadFileToProto([filePath UTF8String], &tensorflowGraph);

// Create the tensorflow graph
tensorflow::Status createGraphStatus = session->Create(tensorflowGraph);

// Check the status of the tensorflow graph
[MachineLearning checkTensorflowStatus:createGraphStatus];

我检查了它获取的文件路径是否正确,并且将模型数据加载到GraphDef中似乎还不错。这就是我的方法

// Finds the file path for the given file name
NSString* FilePathForResourceName(NSString* name, NSString* extension)
{
    NSString* filePath = [[NSBundle mainBundle] pathForResource:name ofType:extension];
    if (filePath == NULL)
    {
        LOG(ERROR) << "Could not find the TensorFlow model";
    }
    return filePath;
}

// Reads the file into the protobuf. This was taken from the TensorFlow example code
bool PortableReadFileToProto(const std::string& fileName, ::google::protobuf::MessageLite* proto)
{
    // Create the input stream with the given file name
    ::google::protobuf::io::CopyingInputStreamAdaptor stream(new IfstreamInputStream(fileName));

    // Set that this object owns the copying stream
    stream.SetOwnsCopyingStream(true);

    // Create a coded input stream
    ::google::protobuf::io::CodedInputStream codedStream(&stream);

    // Set the byte limit, aparently having protos too big can causes issues, so we limit it.
    codedStream.SetTotalBytesLimit(1024LL << 20, 512LL << 20);

    // Parse the coded stream
    return proto->ParseFromCodedStream(&codedStream);
}

我做了一些有关其他文章不支持OP的文章,但是Equal已经受支持,但是它不能以我的TensorFlow模型所需的方式工作。

我还在阅读本指南,了解如何添加新的OP。 Tensorflow how to add a new OP

但是我不太了解它是如何工作的,因此我很难使我的模型运行。

我本来希望将TensorFlow模型转换为CoreML并使用Swift CoreML工具,但是这种转换存在问题,无法完全支持Slice OP,并且无法转换我的模型。

0 个答案:

没有答案