public static int[] GetLayers(this SequentialModel sequentialModel) { var layers = new List <int>(); var l = sequentialModel.GetFieldValue <DefaultExecutor>("compiled").GetFieldValue <List <ILayer> >("layers"); var output = 0; foreach (var layer in l) { if (!(layer is Dense2DLayer)) { continue; } var denseSum = (layer as Dense2DLayer).GetLayerSummary(); layers.Add(denseSum.InputChannel); output = denseSum.OutputChannel; } layers.Add(output); return(layers.ToArray()); }
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()); }