Exemple #1
0
    public NeuralNetAction Think(IPercept percept)
    {
        var data = percept.ToDoubleArray();

        if (data.Length != _model.GetInputDimension().c)
        {
            throw new ArgumentOutOfRangeException(nameof(ArgumentOutOfRangeException),
                                                  $"Percept count should be {_model.GetInputDimension().c}, but is {data.Length}, check if the " +
                                                  $"input layer in DefaultLayer is set to the right value (currently: {_layers[0]})");
        }

        var input = new Data2D(1, 1, _layers[0], 1);

        input.SetData(data);
        var result = (Data2D)_model.ExecuteNetwork(input);

        return(new NeuralNetAction(result.ToDoubleArray(_layers)));
    }
Exemple #2
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);
        }
Exemple #3
0
        public static double[] GetWeights(this SequentialModel sequentialModel)
        {
            // reflection used because there is no other way to get the weights of a network in nnsharp
            var weights  = new List <double>();
            var compiled = sequentialModel.GetFieldValue <DefaultExecutor>("compiled");
            var layers   = compiled.GetFieldValue <IList <ILayer> >("layers");

            var dim = sequentialModel.GetInputDimension();

            // set the initInput field otherwise the error: input is not Data2D (Dense2DLayer)
            compiled.SetFieldValue <Data2D>("initInput", new Data2D(dim.h, dim.w, dim.c, dim.b));


            foreach (var layer in layers)
            {
                if (layer is Dense2DLayer)
                {
                    var t = (layer as Dense2DLayer).GetFieldValue <IData>("weights").GetFieldValue <double[, , , ]>("tensor")
                            .GetEnumerator();
                    while (t.MoveNext())
                    {
                        if (t.Current != null)
                        {
                            weights.Add((double)t.Current);
                        }
                    }
                }
                else if (layer is Bias2DLayer)
                {
                    var a = layer.GetFieldValue <IData>("biases").GetFieldValue <double[]>("array");
                    weights.AddRange(a);
                }
            }

            return(weights.ToArray());
        }