Ejemplo n.º 1
0
        public ReaderKerasModel(string fname)
        {
            JObject model     = JObject.Parse(File.ReadAllText(fname));
            String  modelType = (String)model.SelectToken("model_type");

            if (!modelType.Equals("Sequential"))
            {
                throw new Exception("This reader only supports Sequential type models!");
            }

            SequentialModel seq = new SequentialModel();

            List <IKernelDescriptor> descriptors = ReadDescriptors(model);

            foreach (var d in descriptors)
            {
                seq.Add(d);
            }

            seq.Compile(new DefaultExecutor());

            List <IData> weights = ReadWeights(model, descriptors);

            seq.SetWeights(weights);

            sequential = seq;
        }
Ejemplo n.º 2
0
 private Brain(double[] weights)
 {
     _model   = TrainManager.Instance.DefaultModel;
     _layers  = _model.GetLayers();
     _weights = weights;
     _model.SetWeights(_layers, _weights);
 }
Ejemplo n.º 3
0
    public Brain(SequentialModel model = null)
    {
        if (!TrainManager.Instance) // when not training, just load the passed model
        {
            if (model == null)
            {
                throw new NullReferenceException(
                          "When not training, there should always a model be passed! But model is null!");
            }

            Debug.Log("Running passed model.");

            _model   = model;
            _weights = _model.GetWeights();
        }
        else // when training, load default model
        {
            _model = TrainManager.Instance.DefaultModel;

            if (model != null) // if model not null, try to get the weights from pretrained model
            {
                _weights = model.GetWeights();
                var defaultWeights = _model.GetWeights();
                if (defaultWeights.Length != _weights.Length)
                {
                    throw new ArgumentOutOfRangeException(nameof(ArgumentOutOfRangeException),
                                                          $"The length of the default model {defaultWeights.Length} and the length of " +
                                                          $"the pretrained model {_weights.Length} should be identical.");
                }

                //Debug.Log("Training with pretrained models.");
            }
            else // if model null, get weights from default model and train from scratch
            {
                _weights = _model.GetWeights();
                for (var i = 0; i < _weights.Length; i++)
                {
                    _weights[i] = Random.value * 2 - 1f;
                }

                //Debug.Log("Training from scratch models.");
            }
        }
        _layers = _model.GetLayers();
        _model.SetWeights(_layers, _weights);
    }
Ejemplo n.º 4
0
        public static void SetWeights(this SequentialModel sequentialModel, int[] layers, double[] weights)
        {
            var dim = sequentialModel.GetInputDimension();

            if (dim.c != layers[0])
            {
                throw new ArgumentOutOfRangeException(nameof(ArgumentOutOfRangeException),
                                                      "Size of input layer should be" +
                                                      $"{sequentialModel.GetInputDimension().c} but is {layers[0]}.");
            }

            var data  = new List <IData>();
            var count = 0;

            for (var i = 0; i < layers.Length - 1; i++)
            {
                // create weight list
                data.Add(new Data2D(1, 1, layers[i], layers[i + 1]));
                data.Add(new DataArray(layers[i + 1]));
                data.Add(new DataArray(0));

                // assign weights to weight list
                for (var j = 0; j < layers[i]; j++)
                {
                    for (var k = 0; k < layers[i + 1]; k++)
                    {
                        ((Data2D)data[i * 3])[0, 0, j, k] = weights[count++];
                    }
                }

                // assign biases to weight list
                for (var j = 0; j < layers[i + 1]; j++)
                {
                    ((DataArray)data[i * 3 + 1])[j] = weights[count++];
                }
            }

            sequentialModel.SetWeights(data);
        }