Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow冻结图protobuf不能使用c api进行预测_Python_C_Tensorflow_Keras - Fatal编程技术网

Python Tensorflow冻结图protobuf不能使用c api进行预测

Python Tensorflow冻结图protobuf不能使用c api进行预测,python,c,tensorflow,keras,Python,C,Tensorflow,Keras,我使用tensorflow c API编写了一个小型库,并尝试使用该网络来训练语义切分模型,取得了良好的效果。我使用以下代码将keras模型转换为protobuf文件并运行会话: typedef结构模型{ TF_图*图; 工作队会议*会议; TF_状态*状态; TF_输出输入、目标、输出; TF操作*初始操作,*训练操作,*保存操作,*恢复操作; TF_输出检查点_文件; }模型t; typedef结构NetProperties{ 整数宽度; 内部高度; 国际边界; int类; int输入大小;

我使用tensorflow c API编写了一个小型库,并尝试使用该网络来训练语义切分模型,取得了良好的效果。我使用以下代码将keras模型转换为protobuf文件并运行会话:

typedef结构模型{
TF_图*图;
工作队会议*会议;
TF_状态*状态;
TF_输出输入、目标、输出;
TF操作*初始操作,*训练操作,*保存操作,*恢复操作;
TF_输出检查点_文件;
}模型t;
typedef结构NetProperties{
整数宽度;
内部高度;
国际边界;
int类;
int输入大小;
}网络财产;
静态模型_t*模型;
静态NetProperties*属性;
外部“C”导出int模型创建(常量字符*nnFilename,常量字符*inputName,常量字符*outputName,int pictureWidth,int picturewheight,int边框,int类){
ModelDestroy();
model=(model_t*)malloc(sizeof(model_t));;
模型->状态=TF_NewStatus();
model->graph=TF_NewGraph();
properties=(NetProperties*)malloc(sizeof(NetProperties));
属性->宽度=图片宽度;
属性->高度=图片高度;
属性->边框=边框;
属性->类=类;
属性->输入大小=(图片宽度+边框*2)*(图片高度+边框*2)*3;
{
//创建会话。
TF_SessionOptions*opts=TF_NewSessionOptions();
model->session=TF_NewSession(model->graph,opts,model->status);
TF_删除会话选项(opts);
如果(!OK(型号->状态))返回0;
}
TF_图*g=模型->图;
{
//导入图形。
TF_Buffer*graph_def=读取文件(nnFilename);
if(graph_def==NULL)返回0;
printf(“读取%zu字节的图形定义”,图形定义->长度);
TF_ImportGraphDefOptions*opts=TF_NewImportGraphDefOptions();
TF_GraphImportGraphDef(g,graph_def,opts,model->status);
TF_DeleteImportGraphDefOptions(opts);
TF_DeleteBuffer(图形_def);
如果(!OK(型号->状态))返回0;
}
//图中有趣操作的句柄。
model->input.oper=TF_graphhoperationbyname(g,inputName);
模型->输入.index=0;
model->target.oper=TF_GraphOperationByName(g,“target”);
模型->目标.index=0;
model->output.oper=TF_graphhoperationbyname(g,outputName);
模型->输出.index=0;
model->init_op=TF_graphhoperationbyname(g,“init”);
模型->列车运行=TF\U图形运行名称(g,“列车”);
model->save_op=TF_graphhoperationbyname(g,“保存/控制依赖项”);
model->restore_op=TF_graphhoperationbyname(g,“保存/恢复全部”);
model->checkpoint_file.oper=TF_GraphOperationByName(g,“save/Const”);
model->checkpoint_file.index=0;
//第一个预测很慢
unsigned char*randomData=(unsigned char*)malloc(properties->inputSize*sizeof(unsigned char));
对于(inti=0;iinputSize;i++){
随机数据[i]=(无符号字符)100;
}
模型预测(随机数据);
免费(随机数据);
返回1;
}
外部“C”导出无效模型销毁(){
if(model==nullptr)返回;
TF_删除会话(模型->会话,模型->状态);
好(型号->状态);
TF_DeleteGraph(模型->图形);
TF_删除状态(型号->状态);
免费(模型);
}
外部“C”导出无符号字符*模型预测(无符号字符*批处理1){
if(model==NULL)返回NULL;
const int64_t dims[4]={1,属性->高度+属性->边框*2,属性->宽度+属性->边框*2,3};
大小字节=属性->输入大小;
//可以更快
float*arrayOfFloats=(float*)malloc(n字节*sizeof(float));
//浮点数总和=0;
对于(inti=0;iinputSize;i++){
arrayOfFloats[i]=batch1[i]*(1.f/255.f);
//总和+=阵列浮点数[i];
}
//std::cout output.oper;
TF_Output_opout={Output_op,0};
输出。推回(输出输出);
//创建TF_张量*向量
//std::vector output_值(outputs.size(),nullptr);
//类似于创建输入张量,但是这里我们还没有
//输出值,因此我们使用TF_allocateSensor()
TF_张量*输出值=TF_分配器传感器(TF_浮点,out_dims,4,outputSize*sizeof(浮点));
//输出值。推回(输出值);
////与输入一样,检查输出操作和输出张量的值
//std::coutinputsize/3*属性->类);
无符号字符*charPrediction=新的无符号字符[outputSize*sizeof(无符号字符)];
总和=0;
对于(int i=0;i//std::cout我认为您没有正确设置输入数据。让我们看看

float * arrayOfFloats1 = (float*)malloc(nbytes * sizeof(float));
float sumUp = 0;
在这里,您可以创建
arrayOfFloats1
来保存所有图像数据

for (int i = 0; i < properties->inputSize; i++) {
    arrayOfFloats1[i] = batch1[i] * (1.f / 255.f);
    sumUp += arrayOfFloats1[i];
}
std::cout << sumUp << std::endl;
这里有
inputFloats
,它为
nbytes
浮点指针分配空间。首先,您可能希望为浮点值分配空间,而不是浮点指针(可能大小不同)。然后:

inputFloats[0] = arrayOfFloats1;
在这里,您将第一个
nbytes
指针设置为指向指针
arrayOfFloats1
。然后
inputFloats
被用作模型的输入。但是剩余的
nbytes-1
指针尚未设置为任何值。虽然不是必需的,但它们可能都设置为零

如果您只想使用
arrayOfFloats1
创建一个“浮动数组数组”,则无需分配任何内存,只需执行以下操作:

float ** inputFloats = &arrayOfFloats1;
但实际上,您使用的是
inputfloat
,如下所示:

TF_Tensor* input = TF_NewTensor(
    TF_FLOAT, dims, 4, (void*)inputFloats, nbytes * sizeof(float), &Deallocator, NULL);
所以这里您是说,
input
inputFloats
中的数据组成,它将是指向
arrayOfFloats1
的指针,然后是未初始化的内存。可能您实际上想要的是:

TF_Tensor* input = TF_NewTensor(
    TF_FLOAT, dims, 4, (void*)arrayOfFloats1, nbytes * sizeof(float), &Deallocator, NULL);
这意味着
inputTF_Tensor* input = TF_NewTensor(
    TF_FLOAT, dims, 4, (void*)inputFloats, nbytes * sizeof(float), &Deallocator, NULL);
TF_Tensor* input = TF_NewTensor(
    TF_FLOAT, dims, 4, (void*)arrayOfFloats1, nbytes * sizeof(float), &Deallocator, NULL);