private NeuralTuringMachine[] TrainInternal(double[][] input, double[][] knownOutput) { NeuralTuringMachine[] machines = new NeuralTuringMachine[input.Length]; //FORWARD phase _machine.InitializeMemoryState(); machines[0] = new NeuralTuringMachine(_machine); machines[0].Process(input[0]); for (int i = 1; i < input.Length; i++) { machines[i] = new NeuralTuringMachine(machines[i - 1]); machines[i].Process(input[i]); } //Gradient reset _gradientResetter.Reset(); _machine.UpdateWeights(_gradientResetter); //BACKWARD phase for (int i = input.Length - 1; i >= 0; i--) { machines[i].BackwardErrorPropagation(knownOutput[i]); } _machine.BackwardErrorPropagation(); //Weight updates _weightUpdater.Reset(); _machine.UpdateWeights(_weightUpdater); return(machines); }