如何在 Tensorflow C api 中释放内存

问题描述 投票:0回答:0

我正在学习如何使用 Tensorflow C api,但在释放内存时遇到了问题。根据 Valgrind,我在 1 个块中丢失了 112 个字节。我不知道我错过了什么。我相信这是一个类型转换问题,但我可能是错的。

谁能告诉我我未能释放什么以及我应该如何释放它?另外,如果有不必要的类型转换,请告诉我

typedef struct train *Model;
struct train 
{
    const char *modelDirectory;
    const char *tags;
    
    TF_Graph *graph;
    TF_Status *status;
    TF_SessionOptions *sessionOptions; 
    TF_Buffer *runOptions;
    TF_Session *session; 
    
    TF_Output *input;
    TF_Output *output;
    
    int numberOfInputs;
    int numberOfOutputs;
    
    TF_Tensor **inputValues;
    TF_Tensor **outputValues;
    
    float *data;
    int dataLength;
};

Model CreateModel(const char *modelDirectory, const char *tags, char *inputLayerName, char *outputLayerName, int dataLength)
{
    Model model = malloc(sizeof(*model));
    int numberOfTags = 1;
    model->numberOfInputs = 1;
    model->numberOfOutputs = 1;
    model->modelDirectory = modelDirectory;
    model->tags = tags;
    
    model->graph = TF_NewGraph();
    model->status = TF_NewStatus();
    model->sessionOptions = TF_NewSessionOptions();
    model->runOptions = NULL;
    model->session = TF_LoadSessionFromSavedModel(model->sessionOptions, model->runOptions, model->modelDirectory, &model->tags, numberOfTags, model->graph, NULL, model->status);
    
    assert(TF_GetCode(model->status) == TF_OK);
    
    model->input  = (TF_Output*)malloc(sizeof(TF_Output) * model->numberOfInputs);
    model->output = (TF_Output*)malloc(sizeof(TF_Output) * model->numberOfOutputs);
    
    TF_Output inputLayer  = {TF_GraphOperationByName(model->graph, inputLayerName), 0};
    TF_Output outputLayer = {TF_GraphOperationByName(model->graph, outputLayerName), 0};
    
    assert(outputLayer.oper != NULL);
    assert(inputLayer.oper  != NULL);
    
    model->input[0]  = inputLayer;
    model->output[0] = outputLayer;
    
    model->inputValues  = (TF_Tensor**)malloc(sizeof(TF_Tensor*)*model->numberOfInputs);
    model->outputValues = (TF_Tensor**)malloc(sizeof(TF_Tensor*)*model->numberOfOutputs);
    
    model->data = calloc(dataLength, sizeof(float));
    model->dataLength = dataLength;
    return model;
}

//Destroy Model
void DestroyModel(Model model)
{
    TF_DeleteSessionOptions(model->sessionOptions);
    TF_DeleteSession(model->session, model->status);
    TF_DeleteStatus(model->status);
    TF_DeleteGraph(model->graph);
    TF_DeleteBuffer(model->runOptions);
    free(model->input);
    free(model->output);
    free(model->inputValues);
    free(model->outputValues);
    free(model->data);
    free(model);
}
c pointers memory-leaks tensorflow2.0 valgrind
© www.soinside.com 2019 - 2024. All rights reserved.