如何在C#中为我的模型在Cloud Machine Learning Engine上获得在线预测? [英] How do I get online predictions in C# for my model on Cloud Machine Learning Engine?

查看:28
本文介绍了如何在C#中为我的模型在Cloud Machine Learning Engine上获得在线预测?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经成功地在Cloud ML Engine上的模型上进行了部署,并通过遵循

I have successfully deployed on model on Cloud ML Engine and verified it is working with gcloud ml-engine models predict by following the instructions, now I want to send predictions to it from my C# app. How do I do that?

推荐答案

在线预测API是REST API,因此尽管需要使用

The online prediction API is a REST API, so you can use any library for sending HTTPS requests, although you will need to use Google's OAuth library to get your credentials.

请求的格式为JSON,如 docs .

The format of the request is JSON, as described in the docs.

作为示例,请考虑人口普查示例.的客户端可能像这样:

To exemplify, consider the Census example. A client for that might look like:

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Google.Apis.Auth.OAuth2;
using Newtonsoft.Json;

namespace prediction_client
{
    class Person
    {
        public int age { get; set; }
        public String workclass { get; set; }
        public String education { get; set; }
        public int education_num { get; set; }
        public string marital_status { get; set; }
        public string occupation { get; set; }
        public string relationship { get; set; }
        public string race { get; set; }
        public string gender { get; set; }
        public int capital_gain { get; set; }
        public int capital_loss { get; set; }
        public int hours_per_week { get; set; }
        public string native_country { get; set; }
    }

    class Prediction
    {
        public List<Double> probabilities { get; set; }
        public List<Double> logits { get; set; }
        public Int32 classes { get; set; }
        public List<Double> logistic { get; set; }

        public override string ToString()
        {
            return JsonConvert.SerializeObject(this);
        }
    }

    class MainClass
    {
        static PredictClient client = new PredictClient();
        static String project = "MY_PROJECT";
        static String model = "census";  // Whatever you deployed your model as

        public static void Main(string[] args)
        {
            RunAsync().Wait();
        }

        static async Task RunAsync()
        {
            try
            {
                Person person = new Person
                {
                    age = 25,
                    workclass = " Private",
                    education = " 11th",
                    education_num = 7,
                    marital_status = " Never - married",
                    occupation = " Machine - op - inspct",
                    relationship = " Own - child",
                    race = " Black",
                    gender = " Male",
                    capital_gain = 0,
                    capital_loss = 0,
                    hours_per_week = 40,
                    native_country = " United - Stats"
                };
                var instances = new List<Person> { person };

                List<Prediction> predictions = await client.Predict<Person, Prediction>(project, model, instances);
                Console.WriteLine(String.Join("\n", predictions));
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }

    class PredictClient {

        private HttpClient client;

        public PredictClient() 
        {
            this.client = new HttpClient();
            client.BaseAddress = new Uri("https://ml.googleapis.com/v1/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        }        

        public async Task<List<O>> Predict<I, O>(String project, String model, List<I> instances, String version = null)
        {
            var version_suffix = version == null ? "" : $"/version/{version}";
            var model_uri = $"projects/{project}/models/{model}{version_suffix}";
            var predict_uri = $"{model_uri}:predict";

            GoogleCredential credential = await GoogleCredential.GetApplicationDefaultAsync();
            var bearer_token = await credential.UnderlyingCredential.GetAccessTokenForRequestAsync();
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearer_token);

            var request = new { instances = instances };
            var content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");

            var responseMessage = await client.PostAsync(predict_uri, content);
            responseMessage.EnsureSuccessStatusCode();

            var responseBody = await responseMessage.Content.ReadAsStringAsync();
            dynamic response = JsonConvert.DeserializeObject(responseBody);

            return response.predictions.ToObject<List<O>>();
        }
    }
}

如果尚未在本地运行,则可能必须运行gcloud auth login来初始化凭据.

You may have to run gcloud auth login to initialize your credentials before running locally, if you haven't already.

这篇关于如何在C#中为我的模型在Cloud Machine Learning Engine上获得在线预测?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆