【问题标题】:Tensorflowsharp results getvalue() is very slowTensorflowsharp 结果 getvalue() 很慢
【发布时间】:2018-08-13 12:41:15
【问题描述】:

我正在使用TensorflowSharpAndroid 手机上使用神经网络运行评估。我正在使用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 秒。

将结果数据读入浮点数组真的是网络实际评估时间的 5 倍以上吗?

还有其他方法可以提取结果值吗?

【问题讨论】:

    标签: c# android tensorflow ml-agent tensorflowsharp


    【解决方案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 秒内得到了相同的数据

    【讨论】:

      猜你喜欢
      • 2014-09-17
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多