KeyValuePair <double, double[, , ]> SetBackwardErrors(double[,,] input, double[,,] t) { double[,,] output = GetOutput(input); //Console.WriteLine("{0} {1}", (float)output[0, 0, 0], (float)output[0, 0, 1]); int depth2 = output.GetLength(0); int height2 = output.GetLength(1); int width2 = output.GetLength(2); double[,,] out_err = errors.Last(); loss.Error(output, t, out_err); double[,,] diff = layers.Last().GetCachedDiff(); for (int z2 = 0; z2 < depth2; z2++) { for (int y2 = 0; y2 < height2; y2++) { for (int x2 = 0; x2 < width2; x2++) { //temp = t[z2, y2, x2] - output[z2, y2, x2]; out_err[z2, y2, x2] *= -diff[z2, y2, x2]; } } } errors[errors.Count - 1] = out_err; for (int i = layers.Count - 1; i >= 0; i--) { Layer prev = null; if (i != 0) { prev = layers[i - 1]; if (prev != null) { errors[i - 1] = layers[i].GetError(errors[i], prev.GetCachedDiff(), prev.GetCachedOutpur()); } else { double[,,] diff2 = (double[, , ])input.Clone(); diff2.ForEach(x => 1); errors[i - 1] = layers[i].GetError(errors[i], diff2, input); } } } return(new KeyValuePair <double, double[, , ]>(loss.Metric(output, t), output)); }