首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tensorflowsharp锐利结果getvalue()非常慢

Tensorflowsharp锐利结果getvalue()非常慢
EN

Stack Overflow用户
提问于 2018-08-13 12:41:15
回答 1查看 614关注 0票数 2

我使用TensorflowSharp安卓手机上使用神经网络进行评估。我正在用统一构建这个项目。

我使用的张力流锐利的统一插件列出在这里的要求:https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Using-TensorFlow-Sharp-in-Unity.md

一切都在工作,但是提取结果非常缓慢。

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

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

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

代码语言:javascript
复制
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倍以上,这真的是真的吗?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-13 21:50:05

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

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

我为GetValue创建了一个小函数来处理这个问题,(这里是我期望硬编码的维度)。

代码语言:javascript
复制
    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;
    }

在此情况下,我可以将问题中的代码替换为以下内容

代码语言:javascript
复制
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秒内得到了相同的数据

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51822635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档