C〓〓〓を使ってTensorflowを訓練します.pbファイルは生産環境で使います.

5811 ワード

長い間Tfモデルを訓練して、ついに生産環境の中で大学院を受けに行きます.今日は時間がかかりました.tfのモデルはどうやって生産環境で使われますか?大体これらの方法を整理しました.
手順別に保存したckptファイルを引き続き使用します.
これはtenssorflowの枠組みから逸脱できないようです.そして、生成したckptファイルは比較的大きいです.生産環境に発表する時、pythonのアルゴリズムファイルを一緒にアップロードしなければなりません.他のプログラムとどうやってインタラクティブにして、自分でサービスを書かなければならないかもしれません.このようにする人は少ないと思います.性能も普通のようです.
tenssor flow Servingを使います.
tf Servingはみんなが比較的に推奨する方法のようです.tfServingをコンパイルしてモデルを導き出す必要があります.tf Servingのプロセスを直接実行すれば、外部にサービスを提供することができます.具体的に呼び出しをする時は、自分でクライアントを書いて、人gRPCを使ってServingを呼び出してから、外部にサービスを提供するのが面倒くさいです.そして、今日はgRPCを研究する時間があまりないので、ネット上のクライアントについてはpythonで書いていることが多いです.自分のpythonのレベルが料理より高いと思います.書く自信がありません.だからこの方式は先に検討していません.
生産.pbファイル、そしてプログラムを書いて呼び出します.pbファイル
pbファイルを生成したら、プログラムによって直接呼び出されて、パラメータが入ってきます.そして、パラメータが伝わります.pbファイルはとても小さいです.私は豊富なネット開発の経験があります.考えています.C〓〓で解析することができますか?pbファイル、それから1つの.net coreの対外サービスのAPIをして、このように见たところ更に高効率で、肝心な点は自分でこの开発を熟知するので、多すぎる时间を费やして模索にいく必要はありません.
具体的な考え方
インターネットの下のTensorFlowフレームを使って、tensorFlow Sharp(まだフレームを外していないようです.)pbファイルを呼び出して、net core web APIを作って、対外サービスを提供します.
具体的な実現
直接コードを入れるのはとても簡単で、自分でtenssor flowesharpまで設計するところはとても少ないです.
            var graph = new TFGraph();
            //        ,     pb        ,    
            var model = File.ReadAllBytes(model_file);
            graph.Import(model);

                Console.WriteLine("          ");
                var src = Console.ReadLine();
                var tensor = ImageUtil.CreateTensorFromImageFile(src);
                
                using (var sess = new TFSession(graph))
                {
                    var runner = sess.GetRunner();
                    runner.AddInput(graph["Cast_1"][0], tensor);
                    var r = runner.Run(graph.softmax(graph["softmax_linear/softmax_linear"][0]));
                    var v = (float[,])r.GetValue();
                    Console.WriteLine(v[0,0]);
                    Console.WriteLine(v[0, 1]);
                }
ImageUtilというクラスのライブラリはテナントflowesharpのオフィシャルな例の一つです.画像をテナントのクラスに変えました.直接にcopyに来ました.私のネットワークによっていくつかのパラメータを修正しました.
public static class ImageUtil
    {
        public static TFTensor CreateTensorFromImageFile(byte[] contents, TFDataType destinationDataType = TFDataType.Float)
        {
            var tensor = TFTensor.CreateString(contents);

            TFOutput input, output;

            // Construct a graph to normalize the image
            using (var graph = ConstructGraphToNormalizeImage(out input, out output, destinationDataType))
            {
                // Execute that graph to normalize this one image
                using (var session = new TFSession(graph))
                {
                    var normalized = session.Run(
                        inputs: new[] { input },
                        inputValues: new[] { tensor },
                        outputs: new[] { output });

                    return normalized[0];
                }
            }
        }
        // Convert the image in filename to a Tensor suitable as input to the Inception model.
        public static TFTensor CreateTensorFromImageFile(string file, TFDataType destinationDataType = TFDataType.Float)
        {
            var contents = File.ReadAllBytes(file);

            // DecodeJpeg uses a scalar String-valued tensor as input.
            var tensor = TFTensor.CreateString(contents);

            TFOutput input, output;

            // Construct a graph to normalize the image
            using (var graph = ConstructGraphToNormalizeImage(out input, out output, destinationDataType))
            {
                // Execute that graph to normalize this one image
                using (var session = new TFSession(graph))
                {
                    var normalized = session.Run(
                        inputs: new[] { input },
                        inputValues: new[] { tensor },
                        outputs: new[] { output });

                    return normalized[0];
                }
            }
        }

        // The inception model takes as input the image described by a Tensor in a very
        // specific normalized format (a particular image size, shape of the input tensor,
        // normalized pixel values etc.).
        //
        // This function constructs a graph of TensorFlow operations which takes as
        // input a JPEG-encoded string and returns a tensor suitable as input to the
        // inception model.
        private static TFGraph ConstructGraphToNormalizeImage(out TFOutput input, out TFOutput output, TFDataType destinationDataType = TFDataType.Float)
        {
            // Some constants specific to the pre-trained model at:
            // https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip
            //
            // - The model was trained after with images scaled to 224x224 pixels.
            // - The colors, represented as R, G, B in 1-byte each were converted to
            //   float using (value - Mean)/Scale.

            const int W = 128;
            const int H = 128;
            const float Mean = 0;
            const float Scale = 1f;

            var graph = new TFGraph();
            input = graph.Placeholder(TFDataType.String);

            output = graph.Cast(
                graph.Div(x: graph.Sub(x: graph.ResizeBilinear(images: graph.ExpandDims(input: graph.Cast(graph.DecodeJpeg(contents: input, channels: 3), DstT: TFDataType.Float),
                            dim: graph.Const(0, "make_batch")),
                        size: graph.Const(new int[] { W, H }, "size")),
                    y: graph.Const(Mean, "mean")),
                y: graph.Const(Scale, "scale")), destinationDataType);

            return graph;
        }
    }
片付く