public void SubtractGrads(List <NeuronValues> grads, double biasGrad) { if (grads.Count != Lenght) { throw new IndexOutOfRangeException(); } for (int i = 0; i < NeuronsInfo.Count; i++) { NeuronInfo neuronInfo = NeuronsInfo[i]; int arrayIndex = neuronInfo.ArrayIndex; NeuronTypes type = neuronInfo.neuronType; switch (type) { case NeuronTypes.feedForward: Neurons[arrayIndex].SubtractGrads(grads[i]); break; case NeuronTypes.lSTM: LSTMCells[arrayIndex].SubtractGrads(grads[i]); break; case NeuronTypes.recurrent: RecurrentNeurons[arrayIndex].SubtractGrads(grads[i]); break; default: throw new NotImplementedException(); } } bias -= biasGrad; }
public override Neuron[] CreateNeurons() { int len = info.neurons.Count; Neuron[] neurons = new Neuron[len]; for (int i = 0; i < len; i++) { NeuronInfo n = info.neurons[i]; neurons[i] = new OutputNeuron(n.activation, n.cost); } return(neurons); }
internal static NeuronInfo ToInternalType(this Graph.Common.NeuronInfo value) { NeuronInfo result = null; if (value != null) { result = new NeuronInfo() { Id = value.Id, Tag = value.Tag } } ; return(result); }
public override Neuron[] CreateNeurons() { int len = info.hasBias ? info.neurons.Count + 1 : info.neurons.Count; Neuron[] neurons = new Neuron[len]; for (int i = 0; i < info.neurons.Count; i++) { NeuronInfo n = info.neurons[i]; neurons[i] = new Neuron(n.activation, n.cost); } if (info.hasBias) { neurons[len - 1] = new Bias(info.biasValue); } return(neurons); }
internal void SetWeigthsAndStates(List <NeuronValues> neuronValues = null) { if (neuronValues != null) { for (int i = 0; i < Math.Min(neuronValues.Count, NeuronsInfo.Count); i++) { NeuronInfo info = NeuronsInfo[i]; NeuronValues values = neuronValues[i]; switch (info.neuronType) { case NeuronTypes.feedForward: Neurons[info.ArrayIndex].Weigths = neuronValues[i].weigths; break; case NeuronTypes.lSTM: LSTMCells[info.ArrayIndex].Weigths = values.weigths; LSTMCells[info.ArrayIndex].recurrent.storeWeigth = values.lstmWeigths.storeWeigth; LSTMCells[info.ArrayIndex].recurrent.forgetWeigth = values.lstmWeigths.forgetWeigth; LSTMCells[info.ArrayIndex].recurrent.outputWeigth = values.lstmWeigths.outputWeigth; LSTMCells[info.ArrayIndex].recurrent.hiddenState = values.lstmWeigths.hiddenState; LSTMCells[info.ArrayIndex].recurrent.cellState = values.lstmWeigths.cellState; break; case NeuronTypes.recurrent: RecurrentNeurons[info.ArrayIndex].recurrentWeigth = values.recurrentWeigth; if (values.lstmWeigths != null) { RecurrentNeurons[info.ArrayIndex].hiddenState = values.lstmWeigths.hiddenState; } break; default: throw new NotImplementedException(); } } } else { neuronValues = new List <NeuronValues>(); for (int i = 0; i < NeuronsInfo.Count; i++) { neuronValues.Add(new NeuronValues(previousLayerLenght, NeuronsInfo[i].neuronType)); } SetWeigthsAndStates(neuronValues); } }