TensorflowSharp - TFException:尝试使用未初始化的值

时间:2018-03-31 01:06:15

标签: c# tensorflow

我正在尝试导入在Keras / Tensorflow中创建的模型,并将其用于Unity项目中的推理。

我已成功导入模型,并通过在图中打印输入和输出节点的名称进行验证。但是,当我试图从跑步者那里得到输出值时,我得到了这个例外。

TFException:尝试使用未初始化的值action_W [[节点:action_W / read = IdentityT = DT_FLOAT,_ class = [“loc:@action_W”],_ device =“/ job:localhost / replica:0 / task:0 / cpu:0”]] TensorFlow.TFStatus.CheckMaybeRaise(TensorFlow.TFStatus incomingStatus,System.Boolean last)(at< 6ed6db22f8874deba74ffe3e566039be>:0) TensorFlow.TFSession.Run(TensorFlow.TFOutput []输入,TensorFlow.TFTensor [] inputValues,TensorFlow.TFOutput []输出,TensorFlow.TFOperation [] targetOpers,TensorFlow.TFBuffer runMetadata,TensorFlow.TFBuffer runOptions,TensorFlow.TFStatus状态)(在< 6ed6db22f8874deba74ffe3e566039be>:0) TensorFlow.TFSession + Runner.Run(TensorFlow.TFStatus状态)(at< 6ed6db22f8874deba74ffe3e566039be>:0) RecordArbitraryData.ModelPredict(System.Single [,] input)(在Assets / Scripts / Spells / RecordArbitraryData.cs:230) RecordArbitraryData.FixedUpdate()(在Assets / Scripts / Spells / RecordArbitraryData.cs:95)

以下是我使用的两个功能。 InstantiateModel在我的Unity脚本中被称为OnStart()。当用户将输入传递给脚本时,将调用ModelPredict。

void InstantiateModel(){
    string model_name = "simple_as_binary";
    //Instantiate Graph
    graphModel = Resources.Load (model_name) as TextAsset;
    graph = new TFGraph ();
    graph.Import (graphModel.bytes);
    session = new TFSession (graph);
}

void ModelPredict(float[,] input){
    using (graph) {
        using (session) {
            //Assign input tensors
            var runner = session.GetRunner ();
            runner.AddInput (graph [input_node_name] [0], input);

            //Calculate and access output of graph
            runner.Fetch (graph[output_node_name][0]);
            Debug.Log ("Output node name: " + graph [output_node_name].Name);
            float[,] recurrent_tensor = runner.Run () [0].GetValue () as float[,];
            //var results = runner.Run();
            //Debug.Log("Prediciton: " + results);
        }
    }
}

任何帮助表示赞赏 - TensorflowSharp对我来说是一个新手。

1 个答案:

答案 0 :(得分:0)

我能够弄清楚我的大部分问题。我目前处于我的模型统一预测的位置,但仅预测四个类中的第一个。我的猜测是它与权重没有从检查点文件中正确初始化有关? 编辑:在传递给神经网络之前,我的值没有被标准化。

前言:Mozilla Firefox最适合显示张量板;我花了很长时间才意识到谷歌浏览器导致我的图形不可见(张量板是我能够找出需要用于输入和输出的节点)。

第一期:我正在将.pb文件重命名为.bytes文件。这是不正确的,因为模型的权重来自检查点文件,并且被赋予.pb文件中保存的节点。 这导致了未初始化的变量。这些变量用于训练,使用freeze_graph函数后将其删除。

第二期:我使用的是名为'checkpoint'的文件,这是一个错误。然后我将检查点的名称更改为'test',并在freeze_graph函数中使用它。在调用checkpoints文件时,我被要求使用'test.ckpt'。我假设这个函数知道根据.ckpt自动获取三个文件?没有'.ckpt'的'测试'不起作用。

第三个问题:使用freeze_graph函数时,我需要使用text = False导出keras / tf中的.pb文件。我测试了正确和错误; True提出了关于“接线错误”的错误。

第四期:没有任何组织,Tensorboard很难使用。使用tf.name_scope不仅可以实现可视化,还可以确保我在TensorFlowSharp中使用/引用正确的节点。在keras中,我发现将最终的Dense层和Activation分成它们自己的作用域是有帮助的,这样我就能找到正确的输出节点。我的网络的其余部分被放入“主体”范围,而“输入”范围内的唯一输入层。 name_scope函数将“scopename /”添加到节点名称之前。我不认为这是必要的,但它帮助了我。

第五期:作为统一包发布的tensorflowsharp版本不是最新版本。这导致了keras占位符'keras_training_phase'的问题。在keras中,您可以使用[0] +输入等输入传递它。我试图通过创建一个新的TFTensor(bool)来做同样的事情,但由于其保护级别,我得到一个错误'无法访问。在我的统一TensorFlowSharp版本中,bool和TFTensor之间的隐式转换是错误的。为了解决这个问题,我必须使用这个stackoverflow solution中的函数,其中读入.bytes文件,找到keras_training_phase的占位符,并将bool常量设置为false。这对我有用,因为我的模型是在python中预先训练的,所以对于那些试图训练和测试模型的人来说,它可能不是一个很好的修复。使用freeze_graph函数删除此节点的条件确实很有用。

希望有人觉得这很有用!