TensorflowSharp结果getvalue()非常慢

时间:2018-08-13 12:41:15

标签: c# android tensorflow tensorflowsharp

我正在使用TensorflowSharp Android 手机上通过神经网络运行评估。我正在使用Unity构建项目。

我正在使用以下要求下列出的tensorflowsharp unity插件:https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Using-TensorFlow-Sharp-in-Unity.md

一切正常,但是提取结果非常缓慢。

我正在运行的网络是一个自动编码器,输出是尺寸为128x128x16的图像(是的,有很多输出通道)。

可以在〜0.2秒内完成评估。但是,当我需要使用results[0].GetValue()提取结果数据时,速度非常慢。

这是我运行神经网络的代码

var runner = session.GetRunner();
runner.AddInput(graph[INPUT_NAME][0], tensor).Fetch(graph[OUTPUT_NAME][0]);
var results = runner.Run();

float[,,,] heatmaps = results[0].GetValue() as float[,,,]; // <- this is SLOW

问题: 我将结果转换为浮点数的最后一行大约需要1.2秒。

将结果数据读取到float数组中所花费的时间实际上是对网络的实际评估的5倍以上,这是真的吗?

还有另一种提取结果值的方法吗?

1 个答案:

答案 0 :(得分:1)

所以我找到了解决方案。我仍然不知道为什么GetValue()调用这么慢,但是我找到了另一种检索数据的方法。

我选择手动读取results[0].Data上的原始张量数据

我创建了一个小函数来处理此问题,作为GetValue的一个替代项(这里只是我希望进行硬编码的尺寸)

    private float[,,,] TensorToFLoats(TFTensor tensor)
    {

        IntPtr resData = tensor.Data;
        UIntPtr dataSize = tensor.TensorByteSize;

        byte[] s_ImageBuffer = new byte[(int)dataSize];
        System.Runtime.InteropServices.Marshal.Copy(resData, s_ImageBuffer, 0, (int)dataSize);
        int floatsLength = s_ImageBuffer.Length / 4;
        float[] floats = new float[floatsLength];
        for (int n = 0; n < s_ImageBuffer.Length; n += 4)
        {
            floats[n / 4] = BitConverter.ToSingle(s_ImageBuffer, n);
        }
        float[,,,] result = new float[1, 128, 128, 16];


        int i = 0;
        for (int y = 0; y < 128; y++)
        {
            for (int x = 0; x < 128; x++)
            {
                for (int p = 0; p < 16; p++)
                {
                    result[0, y, x, p] = floats[i++];
                }
            }
        }
        return result;
    }

鉴于此,我可以用以下代码替换问题中的代码

var runner = session.GetRunner();
runner.AddInput(graph[INPUT_NAME][0], tensor).Fetch(graph[OUTPUT_NAME][0]);
var results = runner.Run();

float[,,,] heatmaps = TensorToFLoats(results[0]);

这非常快。 GetValue花了大约1秒钟的时间,我创建的TensorToFloats函数在大约0.02秒内得到了相同的数据