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; }
private Brain(double[] weights) { _model = TrainManager.Instance.DefaultModel; _layers = _model.GetLayers(); _weights = weights; _model.SetWeights(_layers, _weights); }
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); }
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); }