我使用TensorflowSharp在安卓手机上使用神经网络进行评估。我正在用统一构建这个项目。
我使用的张力流锐利的统一插件列出在这里的要求: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倍以上,这真的是真的吗?
还有其他方法提取结果值吗?
发布于 2018-08-13 21:50:05
所以我找到了解决这个问题的办法。我仍然不知道为什么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秒内得到了相同的数据
https://stackoverflow.com/questions/51822635
复制相似问题