コード例 #1
0
        public override List <Tensor> Call(List <Array> inputs)
        {
            var feed_dict = new Dictionary <Tensor, Array>();

            if (this.inputs != null && this.inputs.Count > 0)
            {
                foreach (var tuple in Enumerable.Zip(this.inputs, inputs, (a, b) => Tuple.Create(a, b)))
                {
                    // if (is_sparse(tensor))
                    // {
                    //     sparse_coo = value.tocoo()
                    //     indices = np.concatenate((np.expand_dims(sparse_coo.row, 1),
                    //                               np.expand_dims(sparse_coo.col, 1)), 1)
                    //     value = (indices, sparse_coo.data, sparse_coo.shape)
                    // }
                    feed_dict[tuple.Item1] = tuple.Item2;
                }
            }
            var session = backend.Session;

            var init = graph.GetGlobalVariablesInitializer();

            if (init.Length > 0)
            {
                Debug.Log("Initializing variables in function" + name + " call.");
                foreach (var op in init)
                {
                    //Debug.Log(" - " + op.Name);
                    session.Run(new TFOutput[0], new TFTensor[0], new TFOutput[0], new[] { op });
                }
                Debug.Log("Initializing variables in function" + name + " done.");
                //Debug.Log("Operations:");
                //foreach (var op in graph.GetEnumerator())
                //   Debug.Log(" - " + op.Name);
            }

            //Console.WriteLine("Before:");
            //PrintVariables(feed_dict, session);
            // Console.ReadKey();

            var runner = session.GetRunner();

            if (this.outputs != null)
            {
                foreach (var o in this.outputs)
                {
                    runner.Fetch(backend.In(o).Output);
                }
            }

            if (this.updates_op != null)
            {
                foreach (var op in this.updates_op)
                {
                    runner.AddTarget(op);
                }
            }


            List <TFTensor> tensors = new List <TFTensor>();

            foreach (KeyValuePair <Tensor, Array> pair in feed_dict)
            {
                UnityTFTensor t = backend.In(pair.Key);

                //get the shape based on the tensor and input data length
                TFTensor data = null;
                if (t.TF_Shape == null || t.TF_Shape.Length == 0)
                {
                    Debug.Assert(pair.Value.Length == 1, "Input tensor is a  scalar but feed data has more than 1 data");
                    data = UnityTFUtils.TFTensorFromT(pair.Value);
                }
                else
                {
                    long[] actualShape = t.TF_Shape.Copy();
                    int    totalLength = Mathf.Abs((int)actualShape.Aggregate((s, n) => n * s));

                    int indexOfBatch = actualShape.IndexOf(-1);
                    if (indexOfBatch >= 0)
                    {
                        actualShape[indexOfBatch] = pair.Value.Length / totalLength;
                    }
                    Debug.Assert(totalLength <= pair.Value.Length, "Feed array does not have enough data");

                    //Debug.Log("totalLength:"+totalLength + "  Shape:" + string.Join(",", actualShape));

                    //TFTensor data = TFTensor.FromBuffer(new TFShape(actualShape), (dynamic)pair.Value, 0, totalLength *(pair.Value.Length / totalLength));
                    data = UnityTFUtils.TFTensorFromArray(pair.Value, new TFShape(actualShape));
                }
                tensors.Add(data);
                runner.AddInput(t.Output, data);
            }



            var updated = runner.Run();

            foreach (var d in tensors)
            {
                d.Dispose();
            }
            //Console.WriteLine();

            //foreach (var v in updated)
            //{
            //    object obj = v.GetValue();
            //    if (obj is float[,])
            //        Console.WriteLine((obj as float[,]).ToCSharp());
            //    else if (obj is float[])
            //        Console.WriteLine((obj as float[]).ToCSharp());
            //    else
            //        Console.WriteLine(obj);
            //}

            //Console.WriteLine();
            //Console.WriteLine();

            //Console.WriteLine("After:");
            //PrintVariables(feed_dict, session);
            if (updated != null && updated.Length > 0)
            {
                return(updated.Get(0, this.outputs.Count).Select(t =>
                {
                    var result = new UnityTFTensor(backend);
                    result.TensorValue = t.GetValue();
                    result.TensorType = t.TensorType;
                    return (Tensor)result;
                }).ToList());
            }
            else
            {
                return(null);
            }
        }
コード例 #2
0
        private void PrintVariables(Dictionary <Tensor, Array> feed_dict, TFSession session)
        {
            string[] ops =
            {
                //"SGD/grad/dense_1/dense_1/kernel/var",
                //"SGD/grad/dense_2/dense_2/kernel/var",
                //"SGD/grad/dense_2/dense_2/bias/var",
                //"loss/dense_1_loss/y_true",
                //"loss/dense_1_loss/y_pred",
                //"loss/dense_1_loss/weights",
                //"iterations/var",
                //"lr/var",
                //"lr_t",
                //"p_t",
                //"metrics/binary_accuracy/Round0",
                //"metrics/binary_accuracy/Cast0",
                //"metrics/binary_accuracy/Mean0",
                //"metrics/binary_accuracy/Equal0",
                //"metrics/binary_accuracy/value",
                //"metrics/score_array/mean"
                //"beta_1/var",
                //"beta_2/var",
                //"decay/var",
                //"adam/grad/dense_1/dense_1/kernel/var",
                //"dense_1/variance_scaling/1/scaled",
                //"dense_1/dense_1/kernel/var",
                //"dense_1/call/dot",
                //"dense_1/call/Sigmoid0",
            };

            foreach (var op in ops)
            {
                try
                {
                    var debugRunner = session.GetRunner();
                    foreach (KeyValuePair <Tensor, Array> pair in feed_dict)
                    {
                        UnityTFTensor t = backend.In(pair.Key);
                        debugRunner.AddInput(t.Output, pair.Value);
                    }

                    Console.WriteLine(op);
                    debugRunner.Fetch(op);

                    var v = debugRunner.Run();

                    object obj = v[0].GetValue();

                    foreach (var va in v)
                    {
                        va.Dispose();
                    }
                    if (obj is float[, ])
                    {
                        Console.WriteLine((obj as float[, ]).ToCSharp());
                    }
                    else if (obj is float[])
                    {
                        Console.WriteLine((obj as float[]).ToCSharp());
                    }
                    else if (obj is bool[, ])
                    {
                        Console.WriteLine((obj as bool[, ]).ToCSharp());
                    }
                    else if (obj is bool[])
                    {
                        Console.WriteLine((obj as bool[]).ToCSharp());
                    }
                    else if (obj is sbyte[, ])
                    {
                        Console.WriteLine((obj as sbyte[, ]).ToCSharp());
                    }
                    else if (obj is sbyte[])
                    {
                        Console.WriteLine((obj as sbyte[]).ToCSharp());
                    }
                    else
                    {
                        Console.WriteLine(obj);
                    }
                }
                catch
                {
                }
            }
        }