如何使用c#来运行tensorflow serving部署好的模型

请问在使用docker部署好一个简单的tensorflow模型后,cmd已经可以正确输出结果了

编译tf模型使用的python 3.8

如果想使用c#调用该模型应该如何操作呢?



import pathlib

import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt

xn = np.array([-1, 0, 1, 2, 3, 4, 5, 6])
yn = np.array([-3, -1, 1, 3, 5, 7, 9, 11])

# single neuron
models = tf.keras.models.Sequential([tf.keras.layers.Dense(units=1, input_shape=[1])])
models.compile(optimizer='sgd', loss='mean_squared_error')
models.fit(xn, yn, epochs=500)
export_dir = 'DL_Model_Save'
tf.saved_model.save(models, export_dir)


不要做A语言代码修改为B语言代码的无用功。
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
比如:
A将请求数据写到文件a.txt,写完后改名为aa.txt
B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt
A发现bb.txt存在时,读取其内容,读完后删除bb.txt
以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。
除非A或B不支持判断文件是否存在、文件读写和文件更名。
但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?
可以将临时文件放在RamDisk上提高效率减少磨损磁盘。
数据的结构很复杂的话,文本文件的格式问题可参考json或xml

共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
·进程之间松耦合
·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
·方便在线开关服务,只需删除或创建该临时文本文件即可。
·方便实现分布式和负载均衡。
·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
·……

“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边,
回头是“使用共享纯文本文件进行信息交流”的岸!

1.安装 gRPC NuGet 包
2.生成 gRPC 代码
3.在 C# 项目中添加生成的代码
4.在 C# 代码中调用 TensorFlow 模型

using System;
using Grpc.Core;
using TensorFlowServing.APIService;

class Program
{
    static void Main(string[] args)
    {
        // 创建 gRPC 通道
        Channel channel = new Channel("<tensorflow-serving-address>:<port>", ChannelCredentials.Insecure);

        // 创建模型服务客户端
        var client = new PredictionService.PredictionServiceClient(channel);

        // 构建请求
        var request = new PredictRequest
        {
            ModelSpec = new ModelSpec { Name = "<model-name>" },
            Inputs = new TensorProto { ... } // 构建输入张量
        };

        // 发送请求并获取响应
        var response = client.Predict(request);

        // 处理响应结果
        var outputs = response.Outputs;
        // 解析输出张量并获取结果

        // 关闭通道
        channel.ShutdownAsync().Wait();
        Console.WriteLine("gRPC channel shutdown");

        Console.ReadLine();
    }
}


  • 这篇文章:从零开始配置TensorFlow docker环境 也许能够解决你的问题,你可以看下
  • 以下回答由chatgpt基于相关博客总结生成:

    答案: 首先,我们需要确认Python 3.8环境与TensorFlow版本是否匹配。假设TensorFlow版本是2.8.0,且已成功运行,那么需按照以下步骤在C#中调用该模型:

    1. 安装TensorFlow.NET 在Visual Studio中安装TensorFlow.NET。TensorFlow.NET是专门为.NET平台编写的TensorFlow接口,它可以让我们用C#来调用TensorFlow模型。

    2. 加载TensorFlow模型 用TensorFlow.NET提供的方法,将已经训练好的模型加载到C#程序中。

    using(var model = new TFModel())
    {
        model.Load("model_path"); // 加载模型
        // 使用模型进行预测
        var input = new float[] { 1, 2, 3 };
        var result = model.Predict(new[] { input });
    }
    
    1. 构建输入和输出 需要构建输入和输出张量对象。输入是你准备用来进行预测的数据,输出是模型返回的结果。
    using(var model = new TFModel())
    {
        model.Load("model_path");
        // 构建输入和输出张量对象
        var inputTensor = new TFTensor(input);
        var outputTensor = model.Run(inputTensor);
        var result = outputTensor.GetValue<float[]>()[0];
    }
    
    1. 使用模型预测 最后,使用预测函数进行预测。
    using(var model = new TFModel())
    {
        model.Load("model_path");
        // 构建输入和输出张量对象
        var inputTensor = new TFTensor(input);
        var outputTensor = model.Run(inputTensor);
        var resultTensor = outputTensor[0];
        // 预测结果
        var result = resultTensor.GetValue<float[]>()[0];
    }
    

    请注意,以上代码仅为示例,实际使用时需要根据自己的情况进行修改。