c# - 在 Tensorflow.NET 中加载模型的最佳方法是什么
问题描述
我在 python 中保存了一个 tensorflow.keras 模型,需要在 C#/Tensorflow.NET 0.15 中使用
var net = tf.keras.models.load_model(net_name)
似乎没有实施
var session = tf.Session.LoadFromSavedModel(net_name);
var graph = sess.graph;
似乎有效,但我有一个会话/图表而不是 keras 模型
理想情况下,我想调用类似的东西net.predict(x)
,我怎样才能从图形/会话中到达那里?
解决方案
是的,我做到了。最好的方法是将您的包转换为 ONNX 格式。ONNX 是一种开源格式,应该可以在任何框架(tensorflow、torch...)上运行
在 python 中,添加包 onnx 和 keras2onnx:
import onnx
import keras2onnx
import onnxruntime
net_onnx = keras2onnx.convert_keras(net_keras)
onnx.save_model(net_onnx, onnx_name)
然后在 C# .NET 中,安装 nuget Microsoft.ML。
var context = new MLContext();
var session = new InferenceSession(filename);
float[] sample;
int[] dims = new int[] { 1, sample_size};
var tensor = new DenseTensor<float>(sample,dims);
var xs = new List<NamedOnnxValue>()
{
NamedOnnxValue.CreateFromTensor<float>("dense_input", tensor),
};
using (var results = session.Run(xs))
{
// manipulate the results
}
请注意,您需要显式调用网络的第一层或输入层来传递样本。最好是在 Keras 中给它起一个好听的名字。您可以通过运行在 python 中检查名称net_keras.summary()
推荐阅读
- bash - 上限日志文件大小
- vue.js - 如何在 vue.js 中将 v-once 应用于 v-bind:class?
- javascript - x轴改变时d3圈没有响应
- python - 如何将每日时间序列数据分组为更小的数周数据帧
- c# - 关闭UWP中日历视图的显示画笔效果?
- javascript - JS eval 生成的代码是否比我手动解析字符串更快?
- javascript - 如何使用打字稿将组件变量值插入到 html src 标签中
- android - 底部表单中的滑动刷新布局不滚动
- java - 未发送 Cron 作业电子邮件
- regex - 我需要一些关于在球拍/方案中重写正则表达式的指导。我正在尝试这样做 r' [_A-Za-z][_A-Za-z0-9]* '