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))); }
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); }
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()); }