コード例 #1
0
ファイル: Grid.cs プロジェクト: nategadzhi/OpenMined
        public void TrainModel(IpfsModel model)
        {
            var seq = CreateSequential(model.Model);

            var tmpInput  = Ipfs.Get(model.input);
            var tmpTarget = Ipfs.Get(model.target);

            var input = controller.floatTensorFactory.Create(_data: tmpInput.Data,
                                                             _shape: tmpInput.Shape,
                                                             _autograd: true);
            var target = controller.floatTensorFactory.Create(_data: tmpTarget.Data,
                                                              _shape: tmpTarget.Shape,
                                                              _autograd: true);

            var grad = controller.floatTensorFactory.Create(_data: new float[] { 1, 1, 1, 1 },
                                                            _shape: new int[] { 4, 1 });

            var pred = seq.Forward(input);

            var loss = pred.Sub(target).Pow(2);

            loss.Backward(grad);

            foreach (var p in seq.getParameters())
            {
                var pTensor = controller.floatTensorFactory.Get(p);
                pTensor.Sub(pTensor.Grad, inline: true);
            }

            var    layerIdxs = seq.getLayers();
            Linear lin       = (Linear)controller.getModel(layerIdxs[0]);

            Debug.Log(string.Join(",", loss.Data));
        }
コード例 #2
0
ファイル: Grid.cs プロジェクト: shubham3121/OpenMined
        public async void CheckStatus(string experimentId, Action <string> response)
        {
            var experiment = Ipfs.Get <IpfsExperiment>(experimentId);
            var results    = new bool[experiment.jobs.Count()];

            for (var i = 0; i < experiment.jobs.Count(); ++i)
            {
                results[i] = await CheckModelFromJob(experiment.jobs[i]);
            }

            var allLoaded = true;

            for (var i = 0; i < results.Count(); ++i)
            {
                if (!results[i])
                {
                    allLoaded = false;
                }
            }

            if (allLoaded)
            {
                response("Complete");
            }

            else
            {
                response("In progress");
            }


            return;
        }
コード例 #3
0
ファイル: Grid.cs プロジェクト: shubham3121/OpenMined
        private async Task <int> LoadModelFromJob(string job)
        {
            var getResultRequest = new GetResultsRequest(job);

            getResultRequest.RunRequestSync();
            var responseHash = getResultRequest.GetResponse().resultAddress;

            while (responseHash == "")
            {
                Debug.Log(string.Format("Could not load job {0}. Trying again in 1 seconds.", job));
                await Task.Delay(1000);

                // run the request again
                getResultRequest = new GetResultsRequest(job);
                getResultRequest.RunRequestSync();
                responseHash = getResultRequest.GetResponse().resultAddress;
            }

            // load the model into memory

            var response        = Ipfs.Get <IpfsJob>(responseHash);
            var modelDefinition = response.Model;
            var model           = this.CreateSequential(modelDefinition);

            return(model.Id);
        }
コード例 #4
0
ファイル: Grid.cs プロジェクト: shubham3121/OpenMined
        public string TrainModel(IpfsJob job)
        {
            var tmpInput  = Ipfs.Get <JToken>(job.input);
            var tmpTarget = Ipfs.Get <JToken>(job.target);

            var seq = CreateSequential(job.Model);

            var inputData   = tmpInput.SelectToken("data").ToObject <float[]>();
            var inputShape  = tmpInput.SelectToken("shape").ToObject <int[]>();
            var inputTensor = controller.floatTensorFactory.Create(_data: inputData, _shape: inputShape, _autograd: true);

            var targetData   = tmpTarget.SelectToken("data").ToObject <float[]>();
            var targetShape  = tmpTarget.SelectToken("shape").ToObject <int[]>();
            var targetTensor = controller.floatTensorFactory.Create(_data: targetData, _shape: targetShape, _autograd: true);

            var grad = controller.floatTensorFactory.Create(_data: new float[] { 1, 1, 1, 1 },
                                                            _shape: new int[] { 4, 1 });

            Loss loss;

            switch (job.config.criterion)
            {
            case "mseloss":
                loss = new MSELoss(this.controller);
                break;

            case "categorical_crossentropy":
                loss = new CategoricalCrossEntropyLoss(this.controller);
                break;

            case "cross_entropy_loss":
                loss = new CrossEntropyLoss(this.controller, 1);     // TODO -- real value
                break;

            case "nll_loss":
                loss = new NLLLoss(this.controller);
                break;

            default:
                loss = new MSELoss(this.controller);
                break;
            }

            var optimizer = new SGD(this.controller, seq.getParameters(), job.config.lr, 0, 0);

            for (var i = 0; i < job.config.iters; ++i)
            {
                var pred = seq.Forward(inputTensor);
                var l    = loss.Forward(pred, targetTensor);
                l.Backward();

                // TODO -- better batch size
                optimizer.Step(100, i);
            }

            var resultJob = new Ipfs();
            var response  = resultJob.Write(new IpfsJob(job.input, job.target, seq.GetConfig(), job.config));

            return(response.Hash);
        }
コード例 #5
0
ファイル: Grid.cs プロジェクト: shubham3121/OpenMined
        public async void GetResults(string experimentId, Action <string> response)
        {
            var experiment = Ipfs.Get <IpfsExperiment>(experimentId);
            var results    = new int[experiment.jobs.Count()];

            for (var i = 0; i < experiment.jobs.Count(); ++i)
            {
                results[i] = await LoadModelFromJob(experiment.jobs[i]);
            }

            response(JsonConvert.SerializeObject(results));
            return;
        }
コード例 #6
0
ファイル: Grid.cs プロジェクト: RobSalzwedel/OpenMined
        public void Run(int inputId, int targetId, List <GridConfiguration> configurations, MonoBehaviour owner)
        {
            Debug.Log("Grid.Run");

            string ipfsHash = "";

            var inputTensor  = controller.floatTensorFactory.Get(inputId);
            var targetTensor = controller.floatTensorFactory.Get(targetId);

            // write the input and target tensors to Ipfs
            var inputJob  = new Ipfs();
            var targetJob = new Ipfs();

            var inputIpfsResponse  = inputJob.Write(inputTensor.GetConfig());
            var targetIpfsResponse = targetJob.Write(targetTensor.GetConfig());

            Debug.Log("Input Hash: " + inputIpfsResponse.Hash);
            Debug.Log("Target Hash: " + targetIpfsResponse.Hash);

            var jobs = new string[configurations.Count];

            for (var i = 0; i < configurations.Count; ++i)
            {
                var config          = configurations[i];
                var model           = controller.getModel(config.model) as Sequential;
                var serializedModel = model.GetConfig();

                var configJob     = new Ipfs();
                var ipfsJobConfig = new IpfsJobConfig(config.lr);
                var response      = configJob.Write(new IpfsJob(serializedModel, ipfsJobConfig));

                jobs[i] = response.Hash;
            }

            var experiment         = new IpfsExperiment(inputIpfsResponse.Hash, targetIpfsResponse.Hash, jobs);
            var experimentWriteJob = new Ipfs();
            var experimentResult   = experimentWriteJob.Write(experiment);

            var request = new Request();

            owner.StartCoroutine(request.AddModel(owner, experimentResult.Hash));

            PollNext(owner, request);
        }
コード例 #7
0
ファイル: Grid.cs プロジェクト: shubham3121/OpenMined
        public string Run(int inputId, int targetId, List <GridConfiguration> configurations, MonoBehaviour owner)
        {
            Debug.Log("Grid.Run");

            var inputTensor  = controller.floatTensorFactory.Get(inputId);
            var targetTensor = controller.floatTensorFactory.Get(targetId);

            // write the input and target tensors to Ipfs
            var inputJob  = new Ipfs();
            var targetJob = new Ipfs();

            var inputIpfsResponse  = inputJob.Write(inputTensor.GetConfig());
            var targetIpfsResponse = targetJob.Write(targetTensor.GetConfig());

            Debug.Log("Input Hash: " + inputIpfsResponse.Hash);
            Debug.Log("Target Hash: " + targetIpfsResponse.Hash);

            var jobs = new string[configurations.Count];

            for (var i = 0; i < configurations.Count; ++i)
            {
                var config          = configurations[i];
                var model           = controller.GetModel(config.model) as Sequential;
                var serializedModel = model.GetConfig();

                var configJob     = new Ipfs();
                var ipfsJobConfig = new IpfsJobConfig(config.lr, config.criterion, config.iters);

                var response = configJob.Write(new IpfsJob(inputIpfsResponse.Hash, targetIpfsResponse.Hash, serializedModel, ipfsJobConfig));

                jobs[i] = response.Hash;
            }

            var experiment         = new IpfsExperiment(jobs);
            var experimentWriteJob = new Ipfs();
            var experimentResult   = experimentWriteJob.Write(experiment);

            BlockChain chain = Camera.main.GetComponent <BlockChain>();

            owner.StartCoroutine(chain.AddExperiment(experimentResult.Hash, jobs));
            experiments.Add(experimentResult.Hash);

            return(experimentResult.Hash);
        }
コード例 #8
0
ファイル: Grid.cs プロジェクト: nategadzhi/OpenMined
        public void Run(int inputId, int targetId, List <GridConfiguration> configurations, MonoBehaviour owner)
        {
            Debug.Log("Grid.Run");

            string ipfsHash = "";

            var inputTensor  = controller.floatTensorFactory.Get(inputId);
            var targetTensor = controller.floatTensorFactory.Get(targetId);

            // write the input and target tensors to Ipfs
            var inputJob  = new Ipfs();
            var targetJob = new Ipfs();

            var inputIpfsResponse  = inputJob.Write(inputTensor);
            var targetIpfsResponse = targetJob.Write(targetTensor);

            Debug.Log("Input Hash: " + inputIpfsResponse.Hash);
            Debug.Log("Target Hash: " + targetIpfsResponse.Hash);

            configurations.ForEach((config) => {
                var model  = controller.getModel(config.model) as Sequential;
                var layers = model.getLayers();

                var serializedModel = new List <String>();

                layers.ForEach((layerId) => {
                    var layer = controller.getModel(layerId);
                    var json  = layer.GetConfig().ToString(Formatting.None);

                    serializedModel.Add(json);
                });

                var configJob = new Ipfs();
                var response  = configJob.Write(new IpfsModel(inputIpfsResponse.Hash, targetIpfsResponse.Hash, serializedModel, config.lr));

                ipfsHash = response.Hash;
                Debug.Log("Model Hash: " + ipfsHash);
            });

            var request = new Request();

            owner.StartCoroutine(request.AddModel(owner, ipfsHash));
        }
コード例 #9
0
ファイル: Grid.cs プロジェクト: RobSalzwedel/OpenMined
        public void TrainModel(MonoBehaviour owner, string input, string target, IpfsJob job, int modelId)
        {
            var tmpInput  = Ipfs.Get <JToken>(input);
            var tmpTarget = Ipfs.Get <JToken>(target);

            var seq = CreateSequential(job.Model);

            var inputData   = tmpInput.SelectToken("data").ToObject <float[]>();
            var inputShape  = tmpInput.SelectToken("shape").ToObject <int[]>();
            var inputTensor = controller.floatTensorFactory.Create(_data: inputData, _shape: inputShape, _autograd: true);

            var targetData   = tmpTarget.SelectToken("data").ToObject <float[]>();
            var targetShape  = tmpTarget.SelectToken("shape").ToObject <int[]>();
            var targetTensor = controller.floatTensorFactory.Create(_data: targetData, _shape: targetShape, _autograd: true);

            var grad = controller.floatTensorFactory.Create(_data: new float[] { 1, 1, 1, 1 },
                                                            _shape: new int[] { 4, 1 });

            // 10 epochs .. make configurable
            for (var i = 0; i < 10; ++i)
            {
                var pred = seq.Forward(inputTensor);

                var loss = pred.Sub(targetTensor).Pow(2);
                loss.Backward(grad);

                foreach (var p in seq.getParameters())
                {
                    var pTensor = controller.floatTensorFactory.Get(p);
                    pTensor.Sub(pTensor.Grad, inline: true);
                }
            }

            var resultJob = new Ipfs();
            var config    = new IpfsJobConfig(job.config.lr);
            var response  = resultJob.Write(new IpfsJob(seq.GetConfig(), config));

            var req = new Request();

            owner.StartCoroutine(req.AddWeights(owner, modelId, response.Hash));
        }
コード例 #10
0
ファイル: Grid.cs プロジェクト: yepterence/OpenMined
        public async void CheckStatus(string experimentId, Action <string> response)
        {
            var experiment = Ipfs.Get <IpfsExperiment>(experimentId);
            var results    = new bool[experiment.jobs.Count()];

            for (var i = 0; i < experiment.jobs.Count(); ++i)
            {
                results[i] = await CheckModelFromJob(experiment.jobs[i]);
            }

            var allLoaded  = true;
            int not_loaded = 0;
            int loaded     = 0;

            for (var i = 0; i < results.Count(); ++i)
            {
                if (!results[i])
                {
                    allLoaded  = false;
                    not_loaded = not_loaded + 1;
                }
                else
                {
                    loaded = loaded + 1;
                }
            }

            if (allLoaded)
            {
                response("Complete");
            }

            else
            {
                response("In progress (" + loaded.ToString() + "/" + (loaded + not_loaded).ToString() + " models are done)");
            }


            return;
        }
コード例 #11
0
ファイル: BlockChain.cs プロジェクト: tusharsoni08/OpenMined
        IEnumerator PollNetwork()
        {
            var getJobIdRequest = new GetAvailableJobIdRequest();

            yield return(getJobIdRequest.RunRequest());

            var jobId = getJobIdRequest.GetResponse().jobId;

            if (jobId == null)
            {
                yield return(new WaitForSeconds(10));

                PollNext();
            }
            else
            {
                var getJobRequest = new GetJobRequest(jobId);
                yield return(getJobRequest.RunRequest());

                var jobHash = getJobRequest.GetResponse().jobAddress;

                var job        = Ipfs.Get <IpfsJob>(jobHash);
                var controller = Camera.main.GetComponent <SyftServer>().controller;
                var grid       = new OpenMined.Network.Controllers.Grid(controller);

                var result = grid.TrainModel(job);

                var response = new AddResultRequest(jobHash, result);
                yield return(response.RunRequest());

                Debug.Log("did a job");

                yield return(new WaitForSeconds(10));

                PollNext();
            }
        }
コード例 #12
0
        public string processMessage(string json_message, MonoBehaviour owner)
        {
            //Debug.LogFormat("<color=green>SyftController.processMessage {0}</color>", json_message);

            Command msgObj = JsonUtility.FromJson <Command> (json_message);

            try
            {
                switch (msgObj.objectType)
                {
                case "Optimizer":
                {
                    if (msgObj.functionCall == "create")
                    {
                        string optimizer_type = msgObj.tensorIndexParams[0];

                        // Extract parameters
                        List <int> p = new List <int>();
                        for (int i = 1; i < msgObj.tensorIndexParams.Length; i++)
                        {
                            p.Add(int.Parse(msgObj.tensorIndexParams[i]));
                        }
                        List <float> hp = new List <float>();
                        for (int i = 0; i < msgObj.hyperParams.Length; i++)
                        {
                            hp.Add(float.Parse(msgObj.hyperParams[i]));
                        }

                        Optimizer optim = null;

                        if (optimizer_type == "sgd")
                        {
                            optim = new SGD(this, p, hp[0], hp[1], hp[2]);
                        }
                        else if (optimizer_type == "rmsprop")
                        {
                            optim = new RMSProp(this, p, hp[0], hp[1], hp[2], hp[3]);
                        }
                        else if (optimizer_type == "adam")
                        {
                            optim = new Adam(this, p, hp[0], hp[1], hp[2], hp[3], hp[4]);
                        }

                        return(optim.Id.ToString());
                    }
                    else
                    {
                        Optimizer optim = this.getOptimizer(msgObj.objectIndex);
                        return(optim.ProcessMessage(msgObj, this));
                    }
                }

                case "FloatTensor":
                {
                    if (msgObj.objectIndex == 0 && msgObj.functionCall == "create")
                    {
                        FloatTensor tensor = floatTensorFactory.Create(_shape: msgObj.shape, _data: msgObj.data, _shader: this.Shader);
                        return(tensor.Id.ToString());
                    }
                    else
                    {
                        FloatTensor tensor = floatTensorFactory.Get(msgObj.objectIndex);
                        // Process message's function
                        return(tensor.ProcessMessage(msgObj, this));
                    }
                }

                case "IntTensor":
                {
                    if (msgObj.objectIndex == 0 && msgObj.functionCall == "create")
                    {
                        int[] data = new int[msgObj.data.Length];
                        for (int i = 0; i < msgObj.data.Length; i++)
                        {
                            data[i] = (int)msgObj.data[i];
                        }
                        IntTensor tensor = intTensorFactory.Create(_shape: msgObj.shape, _data: data, _shader: this.Shader);
                        return(tensor.Id.ToString());
                    }
                    else
                    {
                        IntTensor tensor = intTensorFactory.Get(msgObj.objectIndex);
                        // Process message's function
                        return(tensor.ProcessMessage(msgObj, this));
                    }
                }

                case "agent":
                {
                    if (msgObj.functionCall == "create")
                    {
                        Layer     model     = (Layer)getModel(int.Parse(msgObj.tensorIndexParams[0]));
                        Optimizer optimizer = optimizers[int.Parse(msgObj.tensorIndexParams[1])];
                        return(new Syft.NN.RL.Agent(this, model, optimizer).Id.ToString());
                    }

                    //Debug.Log("Getting Model:" + msgObj.objectIndex);
                    Syft.NN.RL.Agent agent = this.getAgent(msgObj.objectIndex);
                    return(agent.ProcessMessageLocal(msgObj, this));
                }

                case "model":
                {
                    if (msgObj.functionCall == "create")
                    {
                        string model_type = msgObj.tensorIndexParams[0];

                        Debug.LogFormat("<color=magenta>createModel:</color> {0}", model_type);

                        if (model_type == "linear")
                        {
                            return(this.BuildLinear(msgObj.tensorIndexParams).Id.ToString());
                        }
                        else if (model_type == "relu")
                        {
                            return(this.BuildReLU().Id.ToString());
                        }
                        else if (model_type == "log")
                        {
                            return(this.BuildLog().Id.ToString());
                        }
                        else if (model_type == "dropout")
                        {
                            return(this.BuildDropout(msgObj.tensorIndexParams).Id.ToString());
                        }
                        else if (model_type == "sigmoid")
                        {
                            return(this.BuildSigmoid().Id.ToString());
                        }
                        else if (model_type == "sequential")
                        {
                            return(this.BuildSequential().Id.ToString());
                        }
                        else if (model_type == "softmax")
                        {
                            return(this.BuildSoftmax(msgObj.tensorIndexParams).Id.ToString());
                        }
                        else if (model_type == "logsoftmax")
                        {
                            return(this.BuildLogSoftmax(msgObj.tensorIndexParams).Id.ToString());
                        }
                        else if (model_type == "tanh")
                        {
                            return(new Tanh(this).Id.ToString());
                        }
                        else if (model_type == "crossentropyloss")
                        {
                            return(new CrossEntropyLoss(this, int.Parse(msgObj.tensorIndexParams[1])).Id.ToString());
                        }
                        else if (model_type == "categorical_crossentropy")
                        {
                            return(new CategoricalCrossEntropyLoss(this).Id.ToString());
                        }
                        else if (model_type == "nllloss")
                        {
                            return(new NLLLoss(this).Id.ToString());
                        }
                        else if (model_type == "mseloss")
                        {
                            return(new MSELoss(this).Id.ToString());
                        }
                        else if (model_type == "embedding")
                        {
                            return(new Embedding(this, int.Parse(msgObj.tensorIndexParams[1]), int.Parse(msgObj.tensorIndexParams[2])).Id.ToString());
                        }
                        else
                        {
                            Debug.LogFormat("<color=red>Model Type Not Found:</color> {0}", model_type);
                        }
                    }
                    else
                    {
                        //Debug.Log("Getting Model:" + msgObj.objectIndex);
                        Model model = this.getModel(msgObj.objectIndex);
                        return(model.ProcessMessage(msgObj, this));
                    }
                    return("Unity Error: SyftController.processMessage: Command not found:" + msgObj.objectType + ":" + msgObj.functionCall);
                }

                case "controller":
                {
                    if (msgObj.functionCall == "num_tensors")
                    {
                        return(floatTensorFactory.Count() + "");
                    }
                    else if (msgObj.functionCall == "num_models")
                    {
                        return(models.Count + "");
                    }
                    else if (msgObj.functionCall == "new_tensors_allowed")
                    {
                        Debug.LogFormat("New Tensors Allowed:{0}", msgObj.tensorIndexParams[0]);
                        if (msgObj.tensorIndexParams[0] == "True")
                        {
                            allow_new_tensors = true;
                        }
                        else if (msgObj.tensorIndexParams[0] == "False")
                        {
                            allow_new_tensors = false;
                        }
                        else
                        {
                            throw new Exception("Invalid parameter for new_tensors_allowed. Did you mean true or false?");
                        }

                        return(allow_new_tensors + "");
                    }
                    else if (msgObj.functionCall == "load_floattensor")
                    {
                        FloatTensor tensor = floatTensorFactory.Create(filepath: msgObj.tensorIndexParams[0], _shader: this.Shader);
                        return(tensor.Id.ToString());
                    }
                    else if (msgObj.functionCall == "set_seed")
                    {
                        Random.InitState(int.Parse(msgObj.tensorIndexParams[0]));
                        return("Random seed set!");
                    }
                    else if (msgObj.functionCall == "concatenate")
                    {
                        List <int> tensor_ids = new List <int>();
                        for (int i = 1; i < msgObj.tensorIndexParams.Length; i++)
                        {
                            tensor_ids.Add(int.Parse(msgObj.tensorIndexParams[i]));
                        }
                        FloatTensor result = Functional.Concatenate(floatTensorFactory, tensor_ids, int.Parse(msgObj.tensorIndexParams[0]));
                        return(result.Id.ToString());
                    }
                    else if (msgObj.functionCall == "ones")
                    {
                        int[] dims = new int[msgObj.tensorIndexParams.Length];
                        for (int i = 0; i < msgObj.tensorIndexParams.Length; i++)
                        {
                            dims[i] = int.Parse(msgObj.tensorIndexParams[i]);
                        }
                        FloatTensor result = Functional.Ones(floatTensorFactory, dims);
                        return(result.Id.ToString());
                    }
                    else if (msgObj.functionCall == "randn")
                    {
                        int[] dims = new int[msgObj.tensorIndexParams.Length];
                        for (int i = 0; i < msgObj.tensorIndexParams.Length; i++)
                        {
                            dims[i] = int.Parse(msgObj.tensorIndexParams[i]);
                        }
                        FloatTensor result = Functional.Randn(floatTensorFactory, dims);
                        return(result.Id.ToString());
                    }
                    else if (msgObj.functionCall == "random")
                    {
                        int[] dims = new int[msgObj.tensorIndexParams.Length];
                        for (int i = 0; i < msgObj.tensorIndexParams.Length; i++)
                        {
                            dims[i] = int.Parse(msgObj.tensorIndexParams[i]);
                        }
                        FloatTensor result = Functional.Random(floatTensorFactory, dims);
                        return(result.Id.ToString());
                    }
                    else if (msgObj.functionCall == "zeros")
                    {
                        int[] dims = new int[msgObj.tensorIndexParams.Length];
                        for (int i = 0; i < msgObj.tensorIndexParams.Length; i++)
                        {
                            dims[i] = int.Parse(msgObj.tensorIndexParams[i]);
                        }
                        FloatTensor result = Functional.Zeros(floatTensorFactory, dims);
                        return(result.Id.ToString());
                    }
                    else if (msgObj.functionCall == "model_from_json")
                    {
                        Debug.Log("Loading Model from JSON:");
                        var json_str = msgObj.tensorIndexParams[0];
                        var config   = JObject.Parse(json_str);

                        Sequential model;

                        if ((string)config["class_name"] == "Sequential")
                        {
                            model = this.BuildSequential();
                        }
                        else
                        {
                            return("Unity Error: SyftController.processMessage: while Loading model, Class :" + config["class_name"] + " is not implemented");
                        }

                        for (int i = 0; i < config["config"].ToList().Count; i++)
                        {
                            var layer_desc        = config["config"][i];
                            var layer_config_desc = layer_desc["config"];

                            if ((string)layer_desc["class_name"] == "Linear")
                            {
                                int previous_output_dim;

                                if (i == 0)
                                {
                                    previous_output_dim = (int)layer_config_desc["batch_input_shape"][layer_config_desc["batch_input_shape"].ToList().Count - 1];
                                }
                                else
                                {
                                    previous_output_dim = (int)layer_config_desc["units"];
                                }

                                string[] parameters = new string[] { "linear", previous_output_dim.ToString(), layer_config_desc["units"].ToString(), "Xavier" };
                                Layer    layer      = this.BuildLinear(parameters);
                                model.AddLayer(layer);

                                string activation_name = layer_config_desc["activation"].ToString();

                                if (activation_name != "linear")
                                {
                                    Layer activation;
                                    if (activation_name == "softmax")
                                    {
                                        parameters = new string[] { activation_name, "1" };
                                        activation = this.BuildSoftmax(parameters);
                                    }
                                    else if (activation_name == "relu")
                                    {
                                        activation = this.BuildReLU();
                                    }
                                    else
                                    {
                                        return("Unity Error: SyftController.processMessage: while Loading activations, Activation :" + activation_name + " is not implemented");
                                    }
                                    model.AddLayer(activation);
                                }
                            }
                            else
                            {
                                return("Unity Error: SyftController.processMessage: while Loading layers, Layer :" + layer_desc["class_name"] + " is not implemented");
                            }
                        }

                        return(model.Id.ToString());
                    }
                    return("Unity Error: SyftController.processMessage: Command not found:" + msgObj.objectType + ":" + msgObj.functionCall);
                }

                case "Grid":
                    if (msgObj.functionCall == "learn")
                    {
                        var inputId  = int.Parse(msgObj.tensorIndexParams[0]);
                        var targetId = int.Parse(msgObj.tensorIndexParams[1]);

                        return(this.grid.Run(inputId, targetId, msgObj.configurations, owner));
                    }

                    if (msgObj.functionCall == "getResults")
                    {
                        // TODO -- This will be converted to poll blockchain
                        //         It is written to poll IPFS right now so it
                        //         appears to be working client side.

                        var experiment = Ipfs.Get <IpfsExperiment>(msgObj.experimentId);
                        var results    = experiment.jobs.Select((job) =>
                        {
                            var getResultRequest = new GetResultsRequest(job);
                            getResultRequest.RunRequestSync();
                            var responseHash = getResultRequest.GetResponse().resultAddress;

                            // load the model into memory
                            var modelDefinition = Ipfs.Get <IpfsJob>(responseHash).Model;
                            var model           = this.grid.CreateSequential(modelDefinition);

                            return(model.Id);
                        });

                        var modelIdsString = JsonConvert.SerializeObject(results.ToArray());
                        return(modelIdsString);
                    }

                    break;

                default:
                    break;
                }
            }
            catch (Exception e)
            {
                Debug.LogFormat("<color=red>{0}</color>", e.ToString());
                return("Unity Error: " + e.ToString());
            }

            // If not executing createTensor or tensor function, return default error.
            return("Unity Error: SyftController.processMessage: Command not found:" + msgObj.objectType + ":" + msgObj.functionCall);
        }