尝试使用以下工具加载我的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,并且无法转换我的模型。